การฝึกพารามิเตอร์ระดับล้านล้านไม่ใช่เรื่องยากอีกต่อไป: GraphPP ใช้การแปลงกราฟเพื่อกำจัดฟองในไปป์ไลน์อย่างสมบูรณ์ เพิ่มความเร็ว 70%

เมื่อขนาดพารามิเตอร์ของโมเดลทะลุหลักล้านล้าน การฝึกแบบกระจายได้กลายเป็น “กระบวนทัศน์โครงสร้างพื้นฐานใหม่” ในด้านการเรียนรู้เชิงลึก อย่างไรก็ตาม การวางท่อแบบขนาน (Pipeline Parallelism) แม้จะ突破ขีดจำกัดหน่วยความจำ GPU เดี่ยว แต่ก็ได้นำมาซึ่งปัญหาประสิทธิภาพที่ยุ่งยากอย่าง “ฟองอากาศ” (Bubble) นั่นคือ GPU ต้องรอการพึ่งพาข้ามสเตจ ทำให้เกิดการว่างงานจำนวนมาก ซึ่งเจือจางการลงทุนจริงของทรัพยากรการคำนวณที่มีราคาแพง

ภาพด้านบนเผยให้เห็นวงจรการแลกเปลี่ยนหลัก (Tradeoff Cycle) ในการฝึกโมเดลขนาดใหญ่ ซึ่งแสดงให้เห็นความท้าทายแบบลูกโซ่ที่เกิดจากการเติบโตของขนาดโมเดลอย่างชัดเจน เมื่อขนาดโมเดลขยายตัวขึ้นเรื่อยๆ อุปสรรคแรกที่พบคือ “หน่วยความจำไม่พอ” (Can’t fit in memory) เพื่อแก้ปัญหานี้ อุตสาหกรรมจึงใช้กลยุทธ์การขนานหรือการย้ายข้อมูล (Parallelize/Offload) โดยแบ่งโมเดลออกเป็นหลายอุปกรณ์หรือย้ายไปยังหน่วยความจำ CPU อย่างไรก็ตาม การขนานจะเผยให้เห็นค่าใช้จ่ายในการสื่อสารข้ามอุปกรณ์ และลดประสิทธิภาพการคำนวณ นำไปสู่ระยะ “ประสิทธิภาพการคำนวณต่ำ/การสื่อสารถูกเปิดเผย” เพื่อชดเชยการสูญเสียประสิทธิภาพ จึงต้องเพิ่มภาระการคำนวณให้มากขึ้น ซึ่งทรัพยากรที่สูงขึ้นนี้จะกลับไปเพิ่มแรงกดดันด้านหน่วยความจำอีกครั้ง ทำให้กลับไปสู่จุดเริ่มต้นของ “หน่วยความจำไม่เพียงพอ” เกิดเป็นวงจรอุบาทว์ วงจรนี้คือจุดเจ็บปวดหลักในการเพิ่มประสิทธิภาพการฝึกโมเดลขนาดใหญ่ และเป็นความขัดแย้งสำคัญที่โซลูชันระดับการคอมไพล์อย่าง GraphPP พยายามจะทำลาย

จาก 1F1B สู่ Zero-Bubble นักวิจัยได้ออกแบบกลยุทธ์การจัดตารางเวลาด้วยมืออย่างประณีตเพื่อบีบอัดฟองอากาศ แต่กลับพบกับอุปสรรคใหม่ในการควบคุมการแพร่กระจายย้อนกลับ การจัดการ CUDA stream และความเข้ากันได้กับคอมไพเลอร์ ในการประชุม PyTorch Europe 2026 Meta Superintelligence Labs ได้นำเสนอ GraphPP ซึ่งเป็นคำตอบระดับกระบวนทัศน์: มันเปลี่ยนปัญหาการวางท่อแบบขนานให้กลายเป็นปัญหาการแปลงกราฟการคำนวณอย่างสมบูรณ์

ด้วยการจับกราฟเชิงฟังก์ชันและ AOTAutograd GraphPP สามารถแยกการคำนวณไปข้างหน้าและย้อนกลับโดยอัตโนมัติ จัดเรียงโหนดใหม่เพื่อให้เกิดการทับซ้อนของการสื่อสาร และให้คอมไพเลอร์จัดการกับความซับซ้อนระดับล่างทั้งหมด นักพัฒนาไม่จำเป็นต้องเขียนตรรกะย้อนกลับแม้แต่บรรทัดเดียว ก็สามารถเร่งความเร็วแบบ end-to-end ได้ถึง 70.8% บนโมเดล DeepSeek-V3 16B กราฟคือโปรแกรม การแปลงคือการเพิ่มประสิทธิภาพ — ปรัชญานี้กำลังเขียนบทใหม่ให้กับประสิทธิภาพการฝึกในยุคพารามิเตอร์ล้านล้าน

  • Graph based Pipeline Parallelism
  • 8000 คำ อ่าน 33 นาที พอดแคสต์ 26 นาที

บทความนี้เจาะลึกแกนหลักทางเทคนิคของ GraphPP: มันทำการแยก B/W โดยอัตโนมัติผ่านการแปลงกราฟ ทำให้เกิดการวางท่อแบบขนานแบบไร้ฟองอากาศ GraphPP แสดงการจัดตารางเวลาระดับสูงเป็นกระบวนการเพิ่มประสิทธิภาพของคอมไพเลอร์ บนโมเดล DeepSeek-V3 16B MoE การจัดตารางเวลา DualPipeV เร่งความเร็วได้ 70.8% เมื่อเทียบกับ baseline โดยที่การแปลง multiplex_fw_bw มีส่วนสำคัญในการทับซ้อนระหว่างการคำนวณและการสื่อสาร

บทความนี้จัดระบบวิวัฒนาการจาก Pipeline Bubble สู่ ZB2P และ DualPipeV อย่างเป็นระบบ เจาะลึกการออกแบบสถาปัตยกรรมของ GraphPP ที่รวมการคำนวณและการสื่อสารเข้าด้วยกันผ่าน Scheduling IR และ Graph Transformation API และชี้ให้เห็นว่าการออกแบบ “Compiler-First” ของมันแก้ปัญหาสำคัญสามประการของอุตสาหกรรม ได้แก่ การย้อนกลับด้วยมือ การจัดการสตรีมที่ซับซ้อน และความสามารถในการประกอบที่ต่ำ ได้อย่างเป็นระบบ

GraphPP กำลังผลักดันการฝึกโมเดลขนาดใหญ่จากยุคงานฝีมือไปสู่ยุคอัตโนมัติที่ขับเคลื่อนด้วยคอมไพเลอร์

unsetunsetสารบัญunsetunset

  • หนึ่ง: คำมั่นสัญญาและอุปสรรคของการวางท่อแบบขนาน
  • สอง: วิวัฒนาการของการเพิ่มประสิทธิภาพการจัดตารางเวลา: จาก 1F1B สู่ ZB2P
  • สาม: ความท้าทายพิเศษของโมเดล Mixture of Experts: DualPipeV
  • สี่: จุดเจ็บปวดสามประการของโซลูชันที่มีอยู่
  • ห้า: GraphPP: การพลิกโฉมกระบวนทัศน์ที่ขับเคลื่อนด้วยกราฟ
  • 5.1 การควบคุมย้อนกลับอย่างสมบูรณ์
  • 5.2 ไม่จำเป็นต้องจัดการเธรดด้วยมือ
  • 5.3. การออกแบบที่เน้นคอมไพเลอร์เป็นหลัก
  • หก: รายละเอียดเวิร์กโฟลว์ของ GraphPP
  • เจ็ด: Scheduling IR: อธิบายพฤติกรรมการวางท่ออย่างเป็นหนึ่งเดียว
  • แปด: การตรวจสอบการทดลอง: การปรับปรุงประสิทธิภาพที่น่าทึ่ง
  • เก้า: ข้อมูลเชิงลึกที่สำคัญ: กราฟคือโปรแกรม การแปลงคือการเพิ่มประสิทธิภาพ
  • บทสรุป: อนาคตของการขนานที่ขับเคลื่อนด้วยกราฟ

unsetunsetหนึ่ง: คำมั่นสัญญาและอุปสรรคของการวางท่อแบบขนานunsetunset

แนวคิดหลักของการวางท่อแบบขนาน (Pipeline Parallelism, PP) คือการแบ่งโมเดลออกเป็นหลายสเตจและกระจายไปยังอุปกรณ์ต่างๆ เพื่อดำเนินการ ในอุดมคติแล้ว สิ่งนี้สามารถ突破ข้อจำกัดหน่วยความจำ GPU เดียว ทำให้การฝึกโมเดลขนาดใหญ่เป็นไปได้

ภาพด้านบนแสดงกลยุทธ์การขนานหลักสองแบบในการฝึกโมเดลขนาดใหญ่: การแบ่งตามมิติของโมเดล (ภาพซ้าย เช่น Tensor Parallelism TP) และการแบ่งตามความลึกของโมเดล (ภาพขวา คือ Pipeline Parallelism PP) การแบ่งตามมิติทางซ้ายจะแบ่งน้ำหนักของแต่ละเลเยอร์ตามมิติคุณลักษณะไปยัง GPU ทั้งหมด โดยแต่ละ GPU จะประมวลผลการคำนวณบางส่วนของทุกเลเยอร์ และต้องมีการสื่อสารทั่วโลกบ่อยครั้งระหว่างเลเยอร์ เหมาะสำหรับสถานการณ์ที่หน่วยความจำจำกัดแต่สามารถรองรับบางมิติได้ ส่วนการวางท่อแบบขนานทางขวาจะแบ่งตามความลึกของโมเดล โดยกำหนดเลเยอร์ที่ต่อเนื่องกันให้กับ GPU ที่แตกต่างกัน (เช่น GPU0 จัดการเลเยอร์ 0-1, GPU1 จัดการเลเยอร์ 2-3) ข้อมูลจะไหลระหว่างอุปกรณ์ในลักษณะท่อ ต้องการเพียงการสื่อสารแบบเบาระหว่างสเตจที่อยู่ติดกัน ซึ่งช่วยลดค่าใช้จ่ายในการสื่อสารทั่วโลกได้อย่างมาก — นี่คือข้อได้เปรียบสำคัญที่ทำให้การวางท่อแบบขนานสามารถรองรับการฝึกโมเดลขนาดใหญ่ข้ามโหนดได้

แต่ความเป็นจริงไม่ได้สมบูรณ์แบบ ปัญหาที่棘手ที่สุดคือ Pipeline Bubble (ฟองอากาศในการวางท่อ) — เวลาว่างที่เกิดขึ้นเมื่ออุปกรณ์รอให้สเตจก่อนหน้าคำนวณเสร็จ “ฟองอากาศ” เหล่านี้ลดอัตราการใช้ GPU ลงอย่างมาก กลายเป็นเพดานประสิทธิภาพของการวางท่อแบบขนาน

ภาพนี้เผยให้เห็นปัญหาประสิทธิภาพหลักของการวางท่อแบบขนาน (PP) — Pipeline Bubbles ด้านซ้ายแสดงสถาปัตยกรรมการวางท่อแบบขนานตามความลึกของโมเดล: GPU ที่แตกต่างกันรับผิดชอบเลเยอร์ที่ต่อเนื่องกันของโมเดล (เช่น GPU0 จัดการสองเลเยอร์แรก, GPU1 จัดการสองเลเยอร์กลาง) ตารางเวลาทางด้านขวาแสดงปัญหาฟองอากาศอย่าง直观: แกนนอนคือเวลา แกนตั้งคืออุปกรณ์ ส่วนสีเทาแสดงถึงเวลาที่อุปกรณ์ว่าง (Idle) เนื่องจากในการแพร่กระจายไปข้างหน้า ข้อมูลต้องไหลจาก GPU0 ไปยัง GPU3 ตามลำดับ อุปกรณ์ที่ตามมาต้องรอ ส่วนในการแพร่กระจายย้อนกลับ เกรเดียนต์ต้องไหลย้อนกลับ ทำให้อุปกรณ์ส่วนใหญ่ว่างงานเป็นเวลานาน เกิดเป็น “ฟองอากาศ” ขนาดใหญ่ ตัวอย่างเช่น GPU0 มีงานเฉพาะตอนต้นและตอนสุดท้าย ส่วนที่เหลือว่างตลอด อัตราการใช้ฮาร์ดแวร์จึงลดลงอย่างมาก — นี่คือจุดเจ็บปวดหลักที่โซลูชัน Zero-bubble PP (เช่น ZB2P) พยายามแก้ไข

unsetunsetสอง: วิวัฒนาการของการเพิ่มประสิทธิภาพการจัดตารางเวลา: จาก 1F1B สู่ ZB2Punsetunset

เพื่อบีบอัดฟองอากาศ นักวิจัยได้เสนอกลยุทธ์การจัดตารางเวลาต่างๆ ที่คลาสสิกที่สุดคือ 1F1B (Forward หนึ่งครั้ง ตามด้วย Backward หนึ่งครั้ง) ซึ่งช่วยลดเวลาว่างโดยการสลับการดำเนินการไปข้างหน้าและย้อนกลับในระยะ稳态

ภาพด้านบนแสดงการออกแบบหลักของการจัดตารางเวลา ZB2P ซึ่งออกแบบมาเพื่อแก้ปัญหาฟองอากาศในการวางท่อแบบขนานโดยเฉพาะ ด้านบนเป็นตารางเวลาตามมิติเวลาสำหรับ 4 อุปกรณ์ แกนนอนคือเวลา สีฟ้า สีเขียว และสีเขียวแทนงานไปข้างหน้า (F) ย้อนกลับ (B) และเกรเดียนต์น้ำหนัก (W) ตามลำดับ สีเหลืองอมน้ำตาลคือขั้นตอน optimizer; ส่วนที่วงกลมสีแดงคือระยะเริ่มต้นของการเติมท่อ อุปกรณ์จะเริ่มงานไมโครแบทช์ตามแนวทแยง หลังจากเติมเสร็จ โดยการรองรับงานย้อนกลับที่รอดำเนินการ 2 รายการ และสลับการดำเนินการไปข้างหน้า/ย้อนกลับ/เกรเดียนต์น้ำหนัก ทำให้แทบไม่มีฟองอากาศว่างในการวางท่อแบบดั้งเดิม อุปกรณ์ทำงานอย่างต่อเนื่อง ข้อความและภาพขนาดเล็กด้านล่างเผยให้เห็นตรรกะการเพิ่มประสิทธิภาพที่สำคัญ: ยิ่งไมโครแบทช์มีขนาดเล็ก อุปกรณ์ที่ตามมาก็จะเริ่มทำงานเร็วขึ้น ระยะเวลาในการเติมท่อก็สั้นลง และอัตราการใช้ฮาร์ดแวร์โดยรวมก็สูงขึ้น — นี่คือหนึ่งในกลยุทธ์การจัดตารางเวลาหลักของการวางท่อแบบขนานแบบไร้ฟองอากาศ

ที่ก้าวหน้ายิ่งขึ้นคือ ZB2P (Zero-bubble Pipeline Parallelism with 2x pending backward) ข้อมูลเชิงลึกหลักคือ: การแพร่กระจายย้อนกลับสามารถแบ่งออกเป็นสองส่วน —

  • B (Backward Input Grad) : คำนวณเกรเดียนต์ของอินพุต ซึ่งต้องส่งต่อไปยังอุปกรณ์ก่อนหน้า
  • W (Weight Grad) : คำนวณเกรเดียนต์ของน้ำหนัก ซึ่งใช้สำหรับอัปเดตพารามิเตอร์ในเครื่องเท่านั้น

ZB2P การจัดตารางเวลาการวางท่อแบบขนานแบบไร้ฟองอากาศ หลักการสำคัญคือการใช้กลไกการเติมไมโครแบทช์หลายรายการเพื่อขจัดปัญหาฟองอากาศว่างในการวางท่อแบบดั้งเดิมอย่างสมบูรณ์ ส่วนที่วงกลมสีแดงในภาพแสดงระยะไปข้างหน้าเริ่มต้นของ Device1 และ Device2 ซึ่งส่งไมโครแบทช์อย่างต่อเนื่องเพื่อเติมท่อให้เต็มอย่างรวดเร็ว ภาพประกอบด้านล่างเผยให้เห็นตรรกะการเพิ่มประสิทธิภาพที่สำคัญ: เส้นทแยงมุมด้านซ้ายแสดงให้เห็นว่ายิ่งไมโครแบทช์มีขนาดเล็ก อุปกรณ์ที่ตามมาก็จะเริ่มทำงานเร็วขึ้น ระยะเวลาในการเติมท่อก็สั้นลง; กรอบสีส้มด้านขวาแสดงให้เห็นว่าการใช้ไมโครแบทช์มากขึ้นเพื่อเติมช่องว่างไปข้างหน้าอย่างต่อเนื่อง ทำให้แต่ละอุปกรณ์สามารถสลับการดำเนินการไปข้างหน้า (F) ย้อนกลับ (B) และน้ำหนัก (W) ได้โดยไม่มีเวลาว่าง เหลือเพียงขั้นตอน optimizer เล็กน้อยในตอนท้าย ซึ่งช่วยเพิ่มอัตราการใช้ฮาร์ดแวร์อย่างมาก

อีกกรอบสีแดงวงกลมระยะการดำเนินการเริ่มต้นของ Device3 และ Device4 จะเห็นได้ว่า Device4 เลื่อนงานไปข้างหน้า F2 ของตัวเองอย่าง主动 เลือกที่จะดำเนินการงานย้อนกลับ B1 ก่อน ในภาพประกอบด้านล่าง เส้นทแยงมุมด้านซ้ายเน้นย้ำความสัมพันธ์ผกผันระหว่างขนาดไมโครแบทช์และระยะเวลาในการเติม; กรอบสีส้มตรงกลางแสดงให้เห็นการใช้ไมโครแบทช์มากขึ้นเพื่อเติมช่องว่างไปข้างหน้า เพื่อให้อุปกรณ์ทำงานอย่างต่อเนื่อง; ด้านขวาระบุอย่างชัดเจนว่า Device4 เลื่อนงานไปข้างหน้าของตัวเองและดำเนินการงานย้อนกลับก่อน เพื่อปลดล็อกการพึ่งพาของ Device3 อย่างรวดเร็ว ซึ่งช่วยขจัดฟองอากาศในการวางท่อ กลยุทธ์การจัดลำดับความสำคัญแบบ “เสียสละการไปข้างหน้าเฉพาะที่เพื่อแลกกับความราบรื่นของท่อโดยรวม” นี้ช่วยเพิ่มอัตราการใช้ฮาร์ดแวร์อย่างมาก B และ W ที่วงกลมสีแดงแสดงให้เห็นว่าการแพร่กระจายย้อนกลับถูกแบ่งออกเป็นสองขั้นตอนอิสระ กราฟการคำนวณด้านล่างอธิบายการออกแบบนี้เพิ่มเติม: การไปข้างหน้าประกอบด้วยเลเยอร์เชิงเส้นและฟังก์ชัน激活 ส่วนการย้อนกลับถูกแยกออกเป็นสองเส้นทางการคำนวณอิสระ: เกรเดียนต์อินพุต (B) และเกรเดียนต์น้ำหนัก (W) การแยกนี้ช่วยให้ตัวจัดตารางเวลาสามารถสลับงาน F, B, W ได้อย่างยืดหยุ่น เช่น ดำเนินการ B ก่อนเพื่อปลดล็อกอุปกรณ์ downstream ในขณะที่เลื่อน W เพื่อเติมช่องว่าง ซึ่งช่วยขจัดฟองอากาศว่างในการวางท่อแบบดั้งเดิมได้เกือบทั้งหมด เพิ่มอัตราการใช้ฮาร์ดแวร์อย่างมาก นี่คือการออกแบบสำคัญที่ทำให้ ZB2P บรรลุ “ฟองอากาศเป็นศูนย์”

ส่วนการดำเนินการของ Device3/4 ที่วงกลมสีแดง แสดงให้เห็นผลของการแยกการพึ่งพาอย่าง直观 กราฟการคำนวณย้อนกลับด้านล่างแบ่งการแพร่กระจายย้อนกลับออกเป็นเส้นทาง B (เกรเดียนต์อินพุต) และ W (เกรเดียนต์น้ำหนัก) ที่เป็นอิสระ คำอธิบายด้านขวาชี้ให้เห็นประเด็นสำคัญเพิ่มเติม: งาน B1 ของ Device3 ขึ้นอยู่กับเกรเดียนต์อินพุต B1 ของ Device4 เท่านั้น ไม่ต้องรอให้เกรเดียนต์น้ำหนัก W1 เสร็จ กลไกการแยกนี้ช่วยให้อุปกรณ์ downstream สามารถดำเนินการงาน B ก่อน ปลดล็อกกระบวนการย้อนกลับของอุปกรณ์ upstream ได้อย่างรวดเร็ว ในขณะที่งาน W สามารถเลื่อนเพื่อเติมช่องว่างในการวางท่อ ขจัดฟองอากาศว่างที่เกิดจากการพึ่งพาย้อนกลับในการวางท่อแบบดั้งเดิมได้อย่างสมบูรณ์ เพิ่มอัตราการใช้ฮาร์ดแวร์อย่างมาก

ZB2P ใช้ประโยชน์จากคุณสมบัตินี้ โดยดำเนินการคำนวณ B ที่สามารถ “ปลดล็อก” อุปกรณ์ก่อนหน้าเป็นลำดับแรก ในขณะที่เลื่อนการคำนวณ W เพื่อเติมช่องว่างฟองอากาศ ดังที่แสดงในสไลด์ก่อนหน้า: “Device 4 prioritizes unlocking Device 3 by delaying W.” พร้อมกันนี้ ยังเพิ่มจำนวนไมโครแบทช์ (Fill gaps with more microbatches) เพื่อบีบอัดเวลาว่างเพิ่มเติม

สาม: ความท้าทายพิเศษของโมเดล Mixture of Experts: DualPipeV

สำหรับสถาปัตยกรรม MoE (Mixture of Experts) สถานการณ์จะซับซ้อนยิ่งขึ้น เลเยอร์ MoE ประกอบด้วยการดำเนินการ All-to-All Dispatch/Combine ที่มีการสื่อสารหนาแน่น

นี่คือโซลูชันการจัดตารางเวลาการวางท่อแบบขนาน DualPipeV ที่ออกแบบมาโดยเฉพาะสำหรับโมเดล MoE ด้านบนเป็นตารางเวลาตามมิติเวลาสำหรับ 4 อุปกรณ์ ใช้สีส้ม เขียว และน้ำเงินเพื่อแยกงานไปข้างหน้า ย้อนกลับอินพุต และเกรเดียนต์น้ำหนัก โดยส่วนที่ทับซ้อนกันของสีส้มและเขียวแสดงถึงการดำเนินการที่ทับซ้อนกันของงานไปข้างหน้าและย้อนกลับ ตัวเลขระบุสเตจและไมโครแบทช์ การจัดเรียงแบบสลับช่วยขจัดฟองอากาศในการวางท่อได้อย่างมาก ภาพการจัดตารางเวลาท่อสองชั้นด้านล่างแสดงการดำเนินการแบบขนานของการคำนวณ (112 SM) และการสื่อสาร (20 SM): การคำนวณไปข้างหน้า/ย้อนกลับของ MLP, Attention ดำเนินการพร้อมกันกับการสื่อสาร Dispatch/Combine ของ MoE และการสื่อสารข้ามอุปกรณ์ PP ทำให้ทรัพยากรการคำนวณและการสื่อสารถูกใช้พร้อมกัน การจัดตารางเวลาท่อคู่แบบละเอียดนี้ ออกแบบมาโดยเฉพาะสำหรับลักษณะการสื่อสารหนาแน่นของ MoE สามารถเพิ่มอัตราการใช้ GPU ได้สูงสุด เป็นหนึ่งในกลยุทธ์การจัดตารางเวลาหลักของการเพิ่มประสิทธิภาพการคอมไพล์ของ GraphPP

การจัดตารางเวลา DualPipeV ได้รับการออกแบบมาโดยเฉพาะสำหรับสถานการณ์นี้ โดยซ่อน latency ผ่านการทับซ้อนระหว่างการคำนวณและการสื่อสารในระดับละเอียด

ภาพด้านบนแสดงวิธีการจัดตารางเวลาและจุดเจ็บปวดหลักในการ实现การทับซ้อนไปข้างหน้า-ย้อนกลับ (overlapped forward-backward) ในโหมด eager ด้านบนใช้เธรด Python สองเธรดเพื่อจัดการงาน Autograd ย้อนกลับและไปข้างหน้าตามลำดับ ผ่านการจัดตารางเวลาระหว่างเธรด ทำให้การสื่อสาร Dispatch(F) ไปข้างหน้า การคำนวณ MLP(F) สลับกับการคำนวณ MLP(B) ย้อนกลับ การสื่อสาร Dispatch(B) และ MLP(W); ภาพการจัดตารางเวลาด้านล่างแสดงการขนานฮาร์ดแวร์ฝั่ง GPU เพิ่มเติม: งานคำนวณ (112 SM) และการสื่อสาร (20 SM) ทำงานพร้อมกันบนทรัพยากรฮาร์ดแวร์ที่แตกต่างกัน การดำเนินการที่ทับซ้อนกันของงานไปข้างหน้า (สีเหลือง) และย้อนกลับ (สีเขียว) ช่วยลดฟองอากาศในการวางท่อ อย่างไรก็ตาม กรอบสีแดงด้านขวาชี้ให้เห็นข้อจำกัดสำคัญ: การทับซ้อนระดับละเอียดข้ามขอบเขต nn.Module นั้นประสานงานได้ยาก ตัวอย่างเช่น โซลูชัน DualPipe ของ DeepSeek ต้องการให้ผู้เขียนโมเดล implement ตรรกะการแพร่กระจายย้อนกลับด้วยตนเอง ซึ่งเพิ่มต้นทุนการพัฒนาอย่างมาก สิ่งนี้เน้นย้ำถึงคุณค่าของโซลูชันการเพิ่มประสิทธิภาพกราฟที่ใช้การคอมไพล์อย่าง GraphPP ซึ่งสามารถ实现การทับซ้อนไปข้างหน้า-ย้อนกลับที่มีประสิทธิภาพโดยอัตโนมัติ โดยไม่ต้องแก้ไขโค้ดโมเดลแบบ侵入式

ภาพด้านบนเผยให้เห็นความยากในการ实现การทับซ้อนนี้: ต้องประสานงานเธรด Python จัดการ Autograd ด้วยตนเอง และ “Coordinating fine-grained overlap across nn.Module boundaries is difficult” การ implement DualPipe ของ DeepSeek-AI ถึงขนาด要求ให้ผู้เขียนโมเดลเขียนตรรกะการแพร่กระจายย้อนกลับด้วยตนเอง — ซึ่งมี门槛สูงมากสำหรับนักพัฒนาทั่วไป

สี่: จุดเจ็บปวดสามประการของโซลูชันที่มีอยู่

ปัญหาหลักของวิธีการปัจจุบันมีสามประการ:

ประการแรก การควบคุมการแพร่กระจายย้อนกลับมีจำกัด การต้องการ实现การจัดตารางเวลาขั้นสูงเช่น ZB2P หรือ DualPipeV มักต้องเขียนตรรกะย้อนกลับด้วยตนเอง ซึ่งไม่เพียงแต่ยุ่งยากแต่ยัง容易ผิดพลาด ตัวอย่างโค้ดด้านล่างแสดงให้เห็นสิ่งนี้ — นักพัฒนาต้องสืบทอด torch.autograd.Function และควบคุมลำดับการคำนวณเกรเดียนต์อย่างละเอียด รวมถึงต้องจัดการกับปัญหาความเข้ากันได้กับ torch.compile และ activation checkpointing

นี่คือวิธีการ implement การแยกการแพร่กระจายย้อนกลับในการวางท่อแบบขนานแบบ Zero-bubble ด้วยตนเอง: 基于 Megatron branch โดยการเขียน backward method ใหม่ผ่าน torch.autograd.Function ที่กำหนดเอง เลื่อนการคำนวณเกรเดียนต์น้ำหนัก (W) และส่งคืนเฉพาะเกรเดียนต์อินพุต (B) เพื่อ实现การจัดตารางเวลาการแยกย้อนกลับ แต่วิธีนี้ต้องเขียนตรรกะย้อนกลับด้วยตนเอง มีต้นทุนการพัฒนาสูง ภาพแสดงวิธีการ implement การแยกการแพร่กระจายย้อนกลับสองแบบ: ด้านบนเป็นโซลูชัน Zero-bubble ที่ implement ตรรกะย้อนกลับด้วยตนเองผ่าน torch.autograd.Function ที่กำหนดเอง; ด้านล่าง torch.distributed.pipelining ใช้ autograd.grad เพื่อแยกเกรเดียนต์อินพุตและน้ำหนักโดยอัตโนมัติ อย่างไรก็ตาม ทั้งสองวิธีต่างก็เผชิญกับปัญหาความเข้ากันได้กับ torch.compile และ gradient checkpointing ซึ่งจำกัดความสะดวกในการใช้งานและความสามารถในการขยาย

ประการที่สอง การจัดการเธรดและสตรีมซับซ้อน การ实现การทับซ้อนระหว่างการคำนวณและการสื่อสารต้องมีการจัดตารางเวลา CUDA stream และการประสานงานหลายเธรดอย่างละเอียด ซึ่งเกินกว่าความสะดวกสบายของนักพัฒนาโมเดลส่วนใหญ่

ประการที่สาม ความท้าทายในการประกอบ การแตกกิ่งของโค้ดโมเดลที่ซับซ้อน ความไม่เข้ากันของ API activation checkpointing และความขัดแย้งกับ torch.compile ทำให้กลยุทธ์การจัดตารางเวลาขั้นสูงนำไปใช้ได้ยาก

ห้า: GraphPP: การพลิกโฉมกระบวนทัศน์ที่ขับเคลื่อนด้วยกราฟ

แนวคิดหลักของ GraphPP คือ: เปลี่ยนปัญหาการวางท่อแบบขนานให้เป็นปัญหาการแปลงกราฟการคำนวณ การเปลี่ยนกระบวนทัศน์นี้带来ข้อได้เปรียบพื้นฐานสามประการ:

5.1 การควบคุมย้อนกลับอย่างสมบูรณ์

ผ่าน API การจับกราฟเชิงฟังก์ชันและ AOTAutograd GraphPP สามารถรับกราฟการคำนวณไปข้างหน้าและย้อนกลับที่สมบูรณ์ได้โดยอัตโนมัติ การแยก B/W ไม่ใช่การเขียน autograd.Function ด้วยมืออีกต่อไป แต่เป็นการวิเคราะห์การพึ่งพาโหนดของกราฟการคำนวณ

ภาพด้านบนแสดงกระบวนการ分解กราฟการคำนวณการแพร่กระจายย้อนกลับของเลเยอร์ MLP โดยมีเป้าหมายหลักคือการแยกเส้นทางการคำนวณของเกรเดียนต์อินพุต grad_x ด้านซ้ายเป็นโค้ดไปข้างหน้าของ MLP ประกอบด้วย Gate Projection, Up Projection, SiLU Activation, Gate Product และ Down Projection; ด้านขวาเป็นกราฟการคำนวณย้อนกลับ เริ่มจากเกรเดียนต์เอาต์พุต grad_out และ推导ย้อนกลับทีละเลเยอร์ โดย “คงไว้เฉพาะโหนดที่นำไปสู่ grad_x” เพื่อทำให้กราฟการคำนวณง่ายขึ้น ตัดกิ่งการคำนวณเกรเดียนต์น้ำหนัก (เช่น grad_w1, grad_w3) ออก เหลือเพียงห่วงโซ่การคำนวณเกรเดียนต์อินพุต และ最终แยก grad_x ออกเป็นผลรวมของสองเส้นทาง เพื่อ实现การเพิ่มประสิทธิภาพกราฟย้อนกลับแบบเบา ลดความซ้ำซ้อนในการคำนวณ อีกภาพหนึ่งเน้นที่การคำนวณเกรเดียนต์น้ำหนัก ด้านซ้ายเป็นตรรกะไปข้างหน้าของ MLP ประกอบด้วย Gate Projection, Up Projection, SiLU Activation, Gate Product และ Down Projection; ด้านขวาเป็นกราฟการคำนวณย้อนกลับ ผ่านการแปลงกราฟ แยกกระบวนการย้อนกลับออกเป็นสองเส้นทางอิสระ: เกรเดียนต์อินพุต (grad_x) และเกรเดียนต์น้ำหนัก (grad_w1/2/3) ภาพนี้เน้นที่การคำนวณเกรเดียนต์น้ำหนัก โดยตัดโหนดที่ซ้ำซ้อนซึ่งนำไปสู่ grad_x ออก เหลือเพียงห่วงโซ่การคำนวณจาก grad_out ไปยัง grad_w2, grad_w1, (เช่น grad_w2 ได้จาก h.T @ grad_out, grad_w1/3 ได้จาก x.T และเกรเดียนต์กลาง) เพื่อ实现การแยกกราฟย้อนกลับแบบเบา ปรับให้เข้ากับความต้องการการคำนวณเกรเดียนต์ในสถานการณ์ต่างๆ

ดังที่แสดงในภาพด้านบน กระบวนการนี้只需标记ว่าโหนดใดนำไปสู่ grad_x (ส่วน B) หรือ grad_w (ส่วน W) คอมไพเลอร์ก็จะ完成การแยกโดยอัตโนมัติ

5.2 ไม่จำเป็นต้องจัดการเธรดด้วยมือ

5.2. การเพิ่มประสิทธิภาพการแปลงกราฟ: การมัลติเพล็กซ์และการจัดตารางเวลาทับซ้อน

การดำเนินการจัดตารางเวลาทับซ้อนนอกเธรดหลัก ทำให้การจัดการสตรีมเปลี่ยนจากสิ่งที่จำเป็นเป็นตัวเลือกการกำหนดค่า

ภาพด้านล่างสาธิตวิธีการรวมกราฟการคำนวณไปข้างหน้าและย้อนกลับเป็นกราฟเดียวที่ไม่ทับซ้อนกันผ่านกลไก “มัลติเพล็กซ์” จากนั้นจัดเรียงโหนดใหม่เพื่อ实现การดำเนินการทับซ้อนที่เหมาะสมที่สุด — ทั้งหมดนี้ทำในระดับกราฟการคำนวณ โดยไม่ต้อง侵入โค้ดโมเดล

สำหรับการแพร่กระจายไปข้างหน้าและย้อนกลับของเลเยอร์ MLP การเพิ่มประสิทธิภาพหลักของการแปลงกราฟคือการ复用กระบวนการทั้งสองนี้เป็นกราฟการคำนวณที่ไม่ทับซ้อนกัน กราฟไปข้างหน้าด้านซ้ายแสดงห่วงโซ่การคำนวณของ MLP อย่างสมบูรณ์ ครอบคลุม Gate Projection, SiLU Activation Function, Gate Product และ Down Projection และ标注ค่า激活กลางที่保存ไว้สำหรับการแพร่กระจายย้อนกลับ กราฟย้อนกลับด้านขวาถูกแยกออกเป็นสองเส้นทางอิสระ: การคำนวณเกรเดียนต์อินพุต (grad_x) และการคำนวณเกรเดียนต์น้ำหนัก (grad_w1/2/3) โดย实现การแยกกราฟการคำนวณผ่านขอบเขตการแยกที่ชัดเจน การออกแบบนี้ทำให้กระแสการคำนวณไปข้างหน้าและย้อนกลับสามารถดำเนินการทับซ้อนกันได้อย่างมีประสิทธิภาพ เพิ่มระดับความขนานและการใช้หน่วยความจำในระหว่างการฝึกอย่างมีนัยสำคัญ เป็นเครื่องมือสำคัญในการเพิ่มประสิทธิภาพประสิทธิภาพของเลเยอร์ MLP ใน Transformer

โดยเฉพาะอย่างยิ่ง การแพร่กระจายไปข้างหน้าด้านซ้ายรับ w1, x, w3 เป็นอินพุต ผ่าน Gate Projection, SiLU Activation, Gate Product และ Down Projection ตามลำดับ สุดท้าย输出 out และ保存ค่า激活กลาง การแพร่กระจายย้อนกลับด้านขวาใช้ค่า激活กลาง น้ำหนัก และ grad_out ที่保存ไว้เป็นอินพุต เพื่อ推导เกรเดียนต์อินพุต grad_x และเกรเดียนต์น้ำหนัก grad_w1/2/3 แนวคิดหลักคือการ复用ไปข้างหน้าและย้อนกลับเป็นกราฟการคำนวณเดียวที่ไม่ทับซ้อนกันและจัดเรียงลำดับใหม่ เพื่อให้กระแสการคำนวณไปข้างหน้าและย้อนกลับสามารถดำเนินการทับซ้อนกัน ซึ่งช่วยเพิ่มระดับความขนานของฮาร์ดแวร์และการใช้หน่วยความจำ ปรับให้เข้ากับการจัดตารางเวลาการฝึกที่มีประสิทธิภาพ

5.3. แนวคิดการออกแบบที่เน้นคอมไพเลอร์เป็นหลัก

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

หก: รายละเอียดเวิร์กโฟลว์ของ GraphPP

วิธีการสร้างกระบวนการฝึกโมเดลขนาดใหญ่โดยใช้การวางท่อแบบขนาน (PP) 基于กราฟ แบ่งออกเป็นห้าขั้นตอน: ขั้นแรก แบ่งโมเดลออกเป็นหลายสเตจ; ขั้นที่สอง ทำการขนานแต่ละสเตจ; ขั้นที่สาม คอมไพล์เพื่อสร้างกราฟการคำนวณไปข้างหน้าและย้อนกลับ; ขั้นที่สี่ ใช้การแปลงกราฟเพื่อเพิ่มประสิทธิภาพ เช่น การแยกไปข้างหน้า-ย้อนกลับ การทับซ้อน; ขั้นที่ห้า ผสานรวมเข้ากับเทรนเนอร์ หรือใช้ torch.pipelining runtime เพื่อดำเนินการ แผนการปรับใช้ GPU แบบ分层ทางด้านขวาผสานรวมกระบวนทัศน์ต่างๆ เช่น FSDP, Context Parallelism (CP), Tensor/Sequence Parallelism (TP/SP), Expert Parallelism (EP) และจับคู่กับคอมไพเลอร์ Inductor เพื่อ实现การจัดตารางเวลาและการเพิ่มประสิทธิภาพการฝึกโมเดลขนาดใหญ่ที่มีประสิทธิภาพ

ภาพด้านบน勾勒出เวิร์กโฟลว์ห้าขั้นตอนของ GraphPP:

  • ขั้นตอนที่หนึ่ง: แบ่งโมเดลออกเป็นสเตจ นี่คือพื้นฐานของการวางท่อแบบขนาน กำหนดการกระจายภาระงานข้ามอุปกรณ์
  • ขั้นตอนที่สอง: ขนานแต่ละสเตจ ใช้กลยุทธ์การขนานข้อมูล เช่น FSDP กับแต่ละสเตจ
  • ขั้นตอนที่สาม: คอมไพล์เพื่อให้ได้กราฟไปข้างหน้าและย้อนกลับ ใช้ AOTAutograd เพื่อติดตามและจับกราฟการคำนวณที่สมบูรณ์
  • ขั้นตอนที่สี่: ใช้การแปลงกราฟเพื่อ实现การจัดตารางเวลา นี่คือนวัตกรรมหลักของ GraphPP ซึ่งรวมถึง:
    • การแยก B/W: แยกกราฟย้อนกลับออกเป็นกราฟย่อย dl (เกรเดียนต์อินพุต) และ dW (เกรเดียนต์น้ำหนัก)
    • การแยกการสื่อสาร FSDP: แยกการดำเนินการสื่อสารแบบรวม เช่น All-Gather และ Reduce-Scatter ไปยังตำแหน่งที่เหมาะสม
    • การมัลติเพล็กซ์กราฟไปข้างหน้า-ย้อนกลับ: รวมกราฟ F และ B ของสเตจต่างๆ และ实现

      ⚠️ หมายเหตุ: เนื้อหาได้รับการแปลโดย AI และตรวจสอบโดยมนุษย์ หากมีข้อผิดพลาดโปรดแจ้ง

      ☕ สนับสนุนค่ากาแฟทีมงาน

      หากคุณชอบบทความนี้ สามารถสนับสนุนเราได้ผ่าน PromptPay

      PromptPay QR
      SCAN TO PAY WITH ANY BANK

      本文来自网络搜集,不代表คลื่นสร้างอนาคต立场,如有侵权,联系删除。转载请注明出处:https://www.itsolotime.com/th/archives/32540

Like (0)
Previous 2 days ago
Next 2 days ago

相关推荐