- AI บางโมเดล เช่น DeepSeek-V3 มีต้นทุนต่ำและทำงานได้เร็วเมื่อให้บริการในสเกลใหญ่ แต่จะช้าและมีต้นทุนสูงเมื่อ รันแบบโลคัล
- สาเหตุอยู่ที่ trade-off พื้นฐานระหว่าง throughput (ปริมาณงาน) และ latency (เวลาแฝง) ซึ่งเกี่ยวข้องกับ ประสิทธิภาพการใช้งาน GPU
- เมื่อเพิ่ม ขนาดแบตช์ GPU จะทำงานได้มีประสิทธิภาพขึ้น แต่ผู้ใช้ต้องรอให้โทเค็นถูกรวมก่อน จึงเกิด เวลาแฝงที่เพิ่มขึ้น
- โมเดลที่มี โครงสร้าง Mixture-of-Experts และ pipeline แบบลึก ต้องอาศัยแบตช์ขนาดใหญ่และเวลาแฝงที่สูง
- ในสภาพแวดล้อมโลคัลที่มีผู้ใช้เพียงคนเดียว การสร้าง แบตช์ที่ใหญ่พอ ทำได้ยาก จึงเกิดปัญหาประสิทธิภาพลดลงและต้นทุนเพิ่มขึ้น
- OpenAI, Anthropic และรายอื่น ๆ สร้างการตอบสนองที่รวดเร็วได้ด้วยการปรับปรุงประสิทธิภาพของสถาปัตยกรรมเอง กลยุทธ์การทำแบตช์ขั้นสูง หรือการทุ่ม GPU จำนวนมากเกินความจำเป็น
การอนุมานแบบแบตช์และประสิทธิภาพของ GPU
- GPU คือฮาร์ดแวร์ที่ถูกปรับให้เหมาะกับ การคูณเมทริกซ์ขนาดใหญ่ (GEMM)
- เมื่อนำโทเค็นจากผู้ใช้หลายคนมารวมกันและรันเป็นเมทริกซ์ขนาดใหญ่ในครั้งเดียว throughput จะเพิ่มขึ้นอย่างมาก เนื่องจากมี overhead ของการไป-กลับต่ำและใช้หน่วยความจำได้มีประสิทธิภาพ
- เซิร์ฟเวอร์อนุมานจะนำโทเค็นจากหลายคำขอมาเข้าคิว แล้วเลือกแบตช์ที่มีขนาดเหมาะสมเพื่อทำการคำนวณ GEMM ขนาดใหญ่
- ในกระบวนการนี้ เซิร์ฟเวอร์ต้องเลือกระหว่าง trade-off ของ ขนาดแบตช์ (throughput เพิ่มขึ้น) กับ เวลารอ (latency เพิ่มขึ้น)
เหตุใดบางโมเดลจึงถูกปรับให้เหมาะกับแบตช์ขนาดใหญ่
Mixture of Experts (MoE) และแบตช์
- โครงสร้าง MoE (คาดว่าใช้ใน DeepSeek-V3 และ GPT-4) เป็นสาเหตุหลักที่ทำให้ประสิทธิภาพ GPU ต่ำ
- บล็อก "ผู้เชี่ยวชาญ" หลายร้อยบล็อกต่างต้องใช้การคูณเมทริกซ์แยกกัน ดังนั้นเมื่อเป็นแบตช์ขนาดเล็ก ผู้เชี่ยวชาญแต่ละตัวจะมีงานน้อยและทำงานได้ไม่คุ้ม
- ต้องมีคำขอพร้อมกันจำนวนมาก จึงจะใช้ผู้เชี่ยวชาญทั้งหมดได้อย่างเต็มที่ ดังนั้นในระดับบริการจริง แบตช์ขนาดใหญ่จึงเป็นสิ่งจำเป็น
- หาก เวลารอสั้น (หน้าต่าง 5ms) ผู้เชี่ยวชาญจะว่างงานบ่อย แต่หาก เวลารอยาว (หน้าต่าง 200ms) จะดันประสิทธิภาพได้สูงสุด
ปัญหาแบตช์ของโมเดล pipeline แบบลึก
- ทรานส์ฟอร์เมอร์ขนาดใหญ่ที่มีหลายร้อยชั้น จะรันโดยแบ่งเลเยอร์ไปยัง GPU หลายตัวตามแบบ pipeline
- หากจำนวนโทเค็นในหนึ่งแบตช์น้อยกว่าจำนวนขั้นของ pipeline จะเกิดปรากฏการณ์ pipeline bubble ซึ่งทำให้ throughput ลดลง
- เพื่อหลีกเลี่ยงปัญหานี้ จำเป็นต้องใช้แบตช์ขนาดใหญ่ (และต้องรอนานขึ้น) ส่งผลให้ เวลาในการตอบสนองของโมเดลยาวขึ้น
เหตุใดจึงไม่สามารถเติมคิวให้เต็มได้ตลอดเวลา
- ในทางทฤษฎี หากมีทราฟฟิกพร้อมกันจำนวนมากจนเติมคิวได้ตลอด ก็อาจหลีกเลี่ยง bubble ได้
- แต่ในทางปฏิบัติ ขั้น Attention ของทรานส์ฟอร์เมอร์ต้องใช้เมทริกซ์ที่มีขนาด (ความยาว) เท่ากันจึงจะทำแบตช์ร่วมกันได้ ทำให้การใช้คิวเดียวให้สมบูรณ์แบบเป็นเรื่องยาก
- นอกจากนี้ หากแยกขั้น FFN กับ attention ออกจากกัน ก็จะเกิดปัญหา memory overhead พุ่งสูงและการเคลื่อนย้ายข้อมูลไม่มีประสิทธิภาพ
สรุปและข้อสรุป
- การประมวลผลแบบแบตช์ขนาดใหญ่ จำเป็นต่อการลดต้นทุน GPU และเพิ่ม throughput แต่ผู้ใช้จะต้องแลกด้วยเวลารอที่ยาวขึ้น
- โมเดลที่มี Mixture-of-Experts และโครงสร้าง pipeline ขนาดใหญ่ โดยธรรมชาติแล้วเหมาะกับสภาพแวดล้อมที่ใช้การรอเพื่อสร้างแบตช์ประสิทธิภาพสูง
- ใน สภาพแวดล้อมที่ทราฟฟิกต่ำอย่างโลคัล ไม่สามารถจัดแบตช์ขนาดใหญ่ที่เหมาะสมได้ จึงทำให้ประสิทธิภาพ GPU ลดลงอย่างมากและต้นทุนการรันสูงขึ้น
- เหตุที่ OpenAI, Anthropic และรายอื่น ๆ ตอบสนองได้รวดเร็ว อาจเป็นเพราะ
- (1) อาจใช้โครงสร้างที่มีประสิทธิภาพกว่าซึ่งไม่ใช่ MoE
- (2) ใช้การปรับแต่งแบตช์/pipeline และเทคนิคอนุมานขั้นสูง
- (3) อาจเป็นโครงสร้างที่ซื้อความเร็วด้วยการทุ่ม GPU มากกว่าที่จำเป็น
เพิ่มเติม: ความต่างระหว่าง prefill batch กับแบตช์ในเนื้อหา
- ทรานส์ฟอร์เมอร์สามารถทำแบตช์ในช่วง prefill (อินพุตยาว) ของพรอมป์ต์จากผู้ใช้คนเดียว เพื่อเร่งการอนุมานช่วงแรกได้
- แต่แบตช์ที่กล่าวถึงในบทความนี้คือแบตช์ใน ช่วงสร้างโทเค็นจริง ของคำขอจากผู้ใช้หลายคน ซึ่งเป็นจุดที่เกิด trade-off ระหว่าง throughput กับ latency
- prefill batch ไม่ได้เกี่ยวข้องโดยตรงกับแบตช์พร้อมกันขนาดใหญ่ที่กล่าวถึงในเนื้อหา
หมายเหตุ
- ระบบอนุมานจริงมักใช้แนวทาง continuous batching ควบคู่กัน โดยจะรันทันทีเมื่อแบตช์เต็ม
- แต่โครงสร้าง trade-off ระหว่าง throughput-latency พื้นฐานยังคงเหมือนเดิม
1 ความคิดเห็น
ความเห็นจาก Hacker News