การจัดการหน่วยความจำ GPU และการกระจายตัว
วิธีที่เฟรมเวิร์ก AI จัดสรร นำมาใช้ซ้ำ และเรียกคืนหน่วยความจำที่จำกัดบน GPU และเหตุใดช่องว่างที่เหลือ (การแยกส่วน) จึงอาจทำให้เกิดข้อผิดพลาดหน่วยความจำไม่เพียงพอได้ แม้ว่าในทางเทคนิคจะมีหน่วยความจำเหลืออยู่มากมายก็ตาม
ภาพรวม
Understanding it is key to fitting big models and avoiding mysterious crashes.
เจาะลึก
หน่วยความจำ GPU ได้รับการแก้ไขและมีค่า: การ์ดอาจมีพื้นที่ทั้งหมด 24, 80 หรือ 192 GB แบ่งตามน้ำหนักโมเดล การเปิดใช้งาน การไล่ระดับสี สถานะเครื่องมือเพิ่มประสิทธิภาพ และบัฟเฟอร์ชั่วคราว การเรียกไดรเวอร์ให้จัดสรรหน่วยความจำในทุกการดำเนินการจะช้า ดังนั้นเฟรมเวิร์กอย่าง PyTorch จึงใช้ตัวจัดสรรแคชที่ดึงบล็อกขนาดใหญ่ไว้ด้านหน้าและแจกชิ้นส่วนย่อย จากนั้นเก็บชิ้นส่วนที่ว่างไว้ในพูลเพื่อนำกลับมาใช้ใหม่ สิ่งที่จับได้คือการกระจายตัว: เมื่อเทนเซอร์ที่มีขนาดต่างกันได้รับการจัดสรรและปลดปล่อย พื้นที่ว่างจะแตกออกเป็นชิ้นๆ กระจัดกระจาย คุณสามารถมีพื้นที่ว่างทั้งหมด 5 GB แต่ไม่สามารถจัดสรรเทนเซอร์ขนาด 2 GB ที่ต่อเนื่องกันได้ เนื่องจากไม่มีช่องว่างใดที่ใหญ่พอ นี่คือเหตุผลว่าทำไมการฝึกจึงอาจล้มเหลวเนื่องจากข้อผิดพลาดหน่วยความจำไม่เพียงพอ แม้ว่าดูเหมือนว่าจะยังมีพื้นที่ว่างเหลืออยู่ก็ตาม
ข้อมูลเชิงลึกทางเทคนิค
ตัวจัดสรรแคช CUDA ของ PyTorch จะแบ่งหน่วยความจำออกเป็นสตรีมของบล็อก และนำบล็อกที่ปล่อยให้ว่างกลับมาใช้ใหม่ซึ่งตรงกับขนาดที่ร้องขอ หลีกเลี่ยงการเรียก cudaMalloc/cudaFree ที่มีค่าใช้จ่ายสูง การกระจายตัวเกิดขึ้นเมื่อบล็อกแยกไม่สามารถรวมกันใหม่ได้ เครื่องมือต่างๆ เช่น torch.cuda.empty_cache ตัวเลือก PYTORCH_CUDA_ALLOC_CONF expandable_segments และความช่วยเหลือเกี่ยวกับสแน็ปช็อตหน่วยความจำ แนวทางที่ใหม่กว่ายืมแนวคิดเกี่ยวกับหน่วยความจำเสมือน โดยแมปเพจฟิสิคัลที่ไม่ต่อเนื่องกันให้กลายเป็นช่วงเสมือนที่ต่อเนื่องกัน เพื่อให้คำขอขนาดใหญ่ประสบความสำเร็จแม้จะมีการแยกส่วนก็ตาม
ผลกระทบเชิงกลยุทธ์
ต้นทุนและงบประมาณ
การตัดสินใจด้านสถาปัตยกรรมขับเคลื่อนประสิทธิภาพและต้นทุนการดำเนินงานเป็นเวลาหลายปี
การตัดสินใจที่ชัดเจนยิ่งขึ้น
การศึกษาด้านเทคนิคช่วยให้ทีมเลือกกลุ่มที่เหมาะสม ไม่ใช่แค่กลุ่มใหม่ล่าสุด
การควบคุมคุณภาพ
ตัวเลือกทางวิศวกรรมที่ดีกว่าจะช่วยลดเหตุการณ์ด้านความน่าเชื่อถือในการผลิต
อนาคตของการจัดการหน่วยความจำ GPU และการแยกส่วน
การจัดการหน่วยความจำมีความชาญฉลาดมากขึ้นและมีเพจมากขึ้น โดยได้รับแรงบันดาลใจจากระบบปฏิบัติการ เทคนิคต่างๆ เช่น ตัวจัดสรรสไตล์หน่วยความจำเสมือนและเพจความสนใจ (ใช้เพื่อจัดการแคช KV ในระหว่างการอนุมาน) ช่วยลดความสูญเปล่าและการกระจายตัวได้อย่างมาก คาดว่าเฟรมเวิร์กจะเป็นค่าเริ่มต้นสำหรับตัวจัดสรรที่ขยายได้ การจัดเรียงข้อมูล การมองเห็นที่ดีขึ้นผ่านตัวสร้างโปรไฟล์ในตัว และการเชื่อมโยงที่เข้มงวดยิ่งขึ้นกับการลดการโหลดและการคำนวณใหม่ ดังนั้นระบบจะสลับ GPU, CPU และหน่วยความจำดิสก์โดยอัตโนมัติ เพื่อให้การใช้งานอยู่ในระดับสูงและเกิดข้อขัดข้องซึ่งเกิดขึ้นได้ยาก
การใช้งานจริงในโลกแห่งความเป็นจริง
การฝึกซ้อมที่ขัดข้องด้วย 'CUDA หน่วยความจำไม่เพียงพอ' แม้ว่าหน่วยความจำที่สงวนไว้จะแสดงพื้นที่ว่าง แก้ไขโดยการตั้งค่า PYTORCH_CUDA_ALLOC_CONF เพื่อเปิดใช้งานส่วนที่ขยายได้
การใช้ torch.cuda.memory_summary หรือสแน็ปช็อตหน่วยความจำเพื่อวินิจฉัยว่าเทนเซอร์และแฟรกเมนต์ใดกินพื้นที่ 80 GB ของ GPU
PagedAttention ของ vLLM จัดการแคช KV ความสนใจในเพจขนาดคงที่เพื่อรองรับคำขอแชทพร้อมกันจำนวนมากโดยไม่เปลืองหน่วยความจำ
การลดขนาดแบตช์หรือเปิดใช้งานการไล่ระดับจุดตรวจสอบเพื่อลดหน่วยความจำการเปิดใช้งาน และหลีกเลี่ยงความล้มเหลวของหน่วยความจำไม่เพียงพอที่ขับเคลื่อนด้วยการแยกส่วน
ความเสี่ยงและรั้ว
การเพิ่มประสิทธิภาพเกณฑ์มาตรฐานหนึ่งรายการสามารถซ่อนจุดอ่อนของระบบในวงกว้างได้
ต้นทุนโครงสร้างพื้นฐานและการบำรุงรักษามักถูกประเมินต่ำไป
ช่องว่างด้านความปลอดภัยและความสามารถในการสังเกตสามารถเพิ่มขึ้นได้เมื่อระบบมีความซับซ้อนมากขึ้น
แผนงานการดำเนินงาน
กำหนดเป้าหมายเวลาแฝง คุณภาพ และต้นทุนก่อนนำไปใช้งาน
เกณฑ์มาตรฐานภายใต้สภาวะโหลดและข้อมูลจริง
การตรวจสอบเครื่องมือเพื่อหาข้อผิดพลาด การเบี่ยงเบน และผลกระทบต่อผู้ใช้
เตรียมเส้นทางการย้อนกลับและการตอบสนองต่อเหตุการณ์ก่อนปรับขนาด
สำรวจต่อไป
Free newsletter
Get the daily AI briefing
Three verified AI stories every weekday morning, written in plain English. Free forever, no ads.
One email each weekday. Unsubscribe in one click. We never sell or share your address.
Test yourself
Take the GPU Memory Management and Fragmentation quiz
Instant feedback on every answer, and a shareable certificate with a verifiable ID once you pass a course.
Support free AI education. AI Understanding is a 501(c)(3) nonprofit — no ads, no paywall, ever. Make a donation
คำแนะนำต่อไป
การตั้งเวลา GPU และการจัดคลัสเตอร์
คำถามที่พบบ่อย
What is GPU Memory Management and Fragmentation?
วิธีที่เฟรมเวิร์ก AI จัดสรร นำมาใช้ซ้ำ และเรียกคืนหน่วยความจำที่จำกัดบน GPU และเหตุใดช่องว่างที่เหลือ (การแยกส่วน) จึงอาจทำให้เกิดข้อผิดพลาดหน่วยความจำไม่เพียงพอได้ แม้ว่าในทางเทคนิคจะมีหน่วยความจำเหลืออยู่มากมายก็ตาม การทำความเข้าใจเป็นกุญแจสำคัญในการปรับโมเดลขนาดใหญ่ให้เหมาะสมและหลีกเลี่ยงอุบัติเหตุที่ลึกลับ
การกระจายตัวของหน่วยความจำ GPU คืออะไร?
การแยกส่วนหมายความว่าหน่วยความจำว่างทั้งหมดเพียงพอ แต่จะถูกแบ่งออกเป็นชิ้น ๆ ดังนั้นจึงไม่มีช่องว่างใดที่ใหญ่พอสำหรับเทนเซอร์ขนาดใหญ่
เหตุใดเฟรมเวิร์กอย่าง PyTorch จึงใช้ตัวจัดสรรหน่วยความจำแคช
การเรียก cudaMalloc/cudaFree สำหรับทุก ๆ op นั้นช้า ดังนั้นตัวจัดสรรแคชจึงจับบล็อกขนาดใหญ่และนำบล็อกที่ปล่อยให้ว่างจากพูลกลับมาใช้ใหม่
คุณเห็นพื้นที่ว่าง 5 GB แต่ไม่สามารถจัดสรรเทนเซอร์ 2 GB ได้ สาเหตุที่เป็นไปได้คืออะไร?
อาการคลาสสิกของการแตกแฟรกเมนต์นี้เกิดขึ้นเมื่อหน่วยความจำว่างมีอยู่แต่ไม่มีก้อนเดียวที่ต่อเนื่องกันซึ่งใหญ่เพียงพอสำหรับการร้องขอ
การตั้งค่า PyTorch ใดช่วยลดการแตกแฟรกเมนต์โดยอนุญาตให้ส่วนหน่วยความจำขยายได้อย่างยืดหยุ่น
การตั้งค่า PYTORCH_CUDA_ALLOC_CONF เพื่อเปิดใช้งานexpandable_segmentsช่วยให้ตัวจัดสรรขยายเซ็กเมนต์และลดความล้มเหลวที่เกี่ยวข้องกับการแตกแฟรกเมนต์
PagedAttention ของ vLLM จัดการอะไรเพื่อลดการสิ้นเปลืองหน่วยความจำระหว่างการอนุมาน
PagedAttention เก็บแคช KV ไว้ในเพจขนาดคงที่ เช่น หน่วยความจำเสมือน OS ช่วยลดการกระจายตัวและให้บริการคำขอจำนวนมากได้อย่างมีประสิทธิภาพ