13

วิธีการหลักของการคำนวณเทนเซอร์แบบกลุ่ม

AI999第4课:现代计算底座与张量化并行演化
00:00

ในฐานรากแบบเทนเซอร์ของ EvoXการคำนวณเทนเซอร์แบบกลุ่มอยู่ในชั้นการแสดงออกเชิงอัลกอริทึม โดยทำการแมปผู้สมัคร การประเมิน และสถานะภายในลูปวิวัฒนาการให้เป็นเทนเซอร์ที่มีมิติแบบกลุ่มแล้วจึงส่งให้ตัวดำเนินการแบบกลุ่มที่เหมาะกับ GPU และกราฟการคำนวณที่คอมไพล์แล้วเพื่อประมวลผล เป้าหมายชัดเจนมาก——เปลี่ยน "วิวัฒนาการแบบอนุกรมทีละ个体" ให้เป็น "วิวัฒนาการแบบขนานทั้งประชากร" เพื่อให้พลังการประมวลผลส่งผลต่อการค้นหาจริง ๆ แทนที่จะถูกใช้ไปกับการจัดตารางและการเริ่มต้น

กระบวนการวิวัฒนาการ → กราฟการคำนวณเทนเซอร์แบบกลุ่มวิธีการหลักของการคำนวณเทนเซอร์แบบกลุ่ม① การจัดโครงสร้างแบบเทนเซอร์เทนเซอร์ประชากร X[N × D]เป้าหมายและข้อจำกัด F[N × M]ผลลัพธ์การประเมิน Y[N × M]สถานะวิวัฒนาการบัฟเฟอร์สเกลาร์หรือเทนเซอร์ขนาดเล็ก② ตัวดำเนินการแบบกลุ่ม (ตามมิติ N)การกลายพันธุ์X′ = X + σ·randn(X)การสลับสายพันธุ์จับคู่และจัดเรียงใหม่ตามมิติ Nการคัดเลือกidx = topk(F, k)การประเมินY = fθ(X)③ การปรับแต่งการคอมไพล์และอัตราการประมวลผลการหลอมรวมตัวดำเนินการลดการเริ่มต้นเคอร์เนลการขนานภายในกลุ่มผู้สมัครทั้งหมดประมวลผลพร้อมกันการใช้หน่วยความจำซ้ำใช้บัฟเฟอร์ซ้ำเพื่อลดค่าใช้จ่ายการประมวลผลแบบอะซิงโครนัสซ้อนทับการคำนวณและการถ่ายโอนกราฟการดำเนินการเทนเซอร์เดียวกันXตัวดำเนินการหลอมรวมFการเรียกแบบกลุ่มครั้งเดียวรองรับผู้สมัครทั้งกลุ่มตัวชี้วัดอัตราการประมวลผลผู้สมัคร/วินาที · รุ่น/วินาทีการเรียกแบบกลุ่มครั้งเดียวรองรับผู้สมัครทั้งกลุ่มอัตราการประมวลผลโดยรวมเท่านั้นที่สะท้อนประสิทธิภาพการค้นหาที่แท้จริงความหน่วงต่อขั้นผู้สมัคร/วินาทีตัวชี้วัดเปลี่ยนเกียร์ตามการประมวลผลแบบกลุ่ม

หนึ่ง、การแสดงกระบวนการวิวัฒนาการเป็นเทนเซอร์

กำหนดให้มิติกลุ่ม N แทนจำนวนผู้สมัคร (个体) ดังนั้นองค์ประกอบสามประการในวิวัฒนาการสามารถแปลงเป็นเทนเซอร์ได้โดยตรง:

  • เทนเซอร์ผู้สมัคร: ประชากร X จัดเรียงเป็น [N × D] โดย D คือจำนวนตัวแปรตัดสินใจของผู้สมัครแต่ละราย
  • เทนเซอร์เป้าหมาย: เป้าหมายและข้อจำกัด F จัดเรียงเป็น [N × M] โดย M คือจำนวนรายการเป้าหมาย/ข้อจำกัด ในกรณีหลายเป้าหมาย แต่ละเป้าหมายคือคอลัมน์ต่าง ๆ ของ F
  • ปริมาณสถานะ: จำนวนรุ่น ค่าที่ดีที่สุดปัจจุบัน ขนาดก้าว ฯลฯ ถูกเก็บรักษาด้วยบัฟเฟอร์สเกลาร์หรือเทนเซอร์ขนาดเล็ก แทนที่จะบันทึกทีละ个体ด้วยออบเจ็กต์ Python

ด้วยวิธีนี้ การสลับสายพันธุ์ การกลายพันธุ์ การคัดเลือก และการประเมินทั้งหมดจะประมวลผลแบบกลุ่มตามมิติ N โดยในลูปวิวัฒนาการจะไม่มีสาขาและโฟลว์ควบคุมแบบทีละ个体อีกต่อไป

สอง、ตัวดำเนินการแบบกลุ่ม: จากการเรียกทีละผู้สมัคร N ครั้ง สู่การคำนวณแบบกลุ่มครั้งเดียว

นิพจน์เปรียบเทียบขั้นต่ำสามรายการ ร่างรูปแบบพื้นฐานของตัวดำเนินการแบบกลุ่ม:

  • การกลายพันธุ์: X′ = X + σ·randn(X) ผู้สมัครทั้งกลุ่มได้รับการรบกวนแบบสุ่มของแต่ละรายในการคำนวณแบบกลุ่มครั้งเดียว โดย σ ควบคุมความเข้มของการรบกวน
  • การคัดเลือก: idx = topk(F, k) เลือกดัชนีของผู้สมัคร k รายแรกจากค่าความเหมาะสมของผู้สมัคร N รายในครั้งเดียว
  • การประเมิน: Y = fθ(X) แทนที่การเรียกทีละผู้สมัคร N ครั้ง ด้วยการส่งต่อแบบกลุ่มหรือการจำลองแบบกลุ่มครั้งเดียว

สิ่งสำคัญไม่ได้อยู่ที่ตัวดำเนินการเฉพาะเจาะจงใด ๆ แต่อยู่ที่ผู้สมัครทั้งหมดใช้กราฟการดำเนินการเทนเซอร์เดียวกัน: การเรียกแบบกลุ่มครั้งเดียวสามารถลดค่าใช้จ่ายของอินเทอร์พรีเตอร์และการเริ่มต้นเคอร์เนล ทำให้พลังประมวลผล GPU/หลายแกนส่งผลต่อการค้นหาเชิงวิวัฒนาการจริง ๆ การจัดการข้อจำกัดและการเกินขอบเขตก็สามารถทำได้ภายในกลุ่มการคำนวณเดียวกันด้วยเทนเซอร์มาสก์ โดยไม่จำเป็นต้องแยกสาขาสำหรับผู้สมัครบางราย

สาม、การปรับแต่งกราฟการคำนวณและตัวชี้วัดอัตราการประมวลผล

การเขียนวิวัฒนาการหลายรุ่นเป็นกราฟการไหลข้อมูลที่คอมไพล์ได้ ยังสามารถรีดประสิทธิภาพเพิ่มเติมได้:การหลอมรวมตัวดำเนินการลดจำนวนการเริ่มต้นเคอร์เนลการขนานภายในกลุ่มให้ผู้สมัครทั้งหมดประมวลผลพร้อมกันการประมวลผลแบบอะซิงโครนัสให้การคำนวณและการถ่ายโอนข้อมูลซ้อนทับกันการใช้หน่วยความจำซ้ำลดการจัดสรรเทนเซอร์ระดับกลาง ดังนั้นตัวชี้วัดประสิทธิภาพจึงควรเปลี่ยนจาก "ความหน่วงต่อขั้น" ไปสู่ผู้สมัคร/วินาที หรือรุ่น/วินาทีของอัตราการประมวลผล——การประมวลผลแบบกลุ่มเพียงครั้งเดียวจัดการผู้สมัครทั้งกลุ่ม มีเพียงอัตราการประมวลผลโดยรวมเท่านั้นที่สะท้อนประสิทธิภาพการค้นหาที่แท้จริง

ความเข้าใจผิดที่พบบ่อย
อย่าห่อตัวดำเนินการแบบกลุ่มไว้ในลูปทีละ个体 เพราะนั่นเท่ากับนำค่าใช้จ่ายของอินเทอร์พรีเตอร์และการเริ่มต้นเคอร์เนลกลับเข้ามา และมิติกลุ่มก็สูญเสียความหมายของการขนานไป เกณฑ์การตัดสินนั้นง่ายมาก: ในขั้นตอนวิวัฒนาการหนึ่งขั้น ควรมีเฉพาะการจัดตารางระดับ "กลุ่ม" โดยไม่มีระดับ "个体"