เมื่อ NVENC ไม่เริ่มทำงาน: GPU เต็มไปด้วยโมเดล และตัวเรนเดอร์ที่สลับไปใช้ตัวอื่น
วิดีโอ
ตัวเรนเดอร์วิดีโอของเราทำงานบนเครื่องเดียวกับโมเดลภาษาที่เขียนสคริปต์ให้มัน คืนหนึ่งตัวเข้ารหัสฮาร์ดแวร์ไม่ยอมเปิดใช้งาน: "CUDA_ERROR_OUT_OF_MEMORY: out of memory" จากนั้น "No capable devices found"
เกิดอะไรขึ้น
เครื่องนี้คือ NVIDIA GB10 desktop ซึ่ง CPU และ GPU ใช้หน่วยความจำรวมกันเครื่องเดียว มันให้บริการโมเดลท้องถิ่นของเราผ่าน vLLM และ Studio เรนเดอร์บนเครื่องเดียวกันด้วย ffmpeg โดยใช้ NVENC เมื่อทำได้ ระหว่างการทดสอบ ตัวเข้ารหัสล้มเหลวในการสร้าง CUDA context ความล้มเหลวเกิดขึ้นและหายไปในเวลาไม่กี่วินาที: การทดสอบ NVENC สั้นๆ ผ่าน แต่การเรนเดอร์ทันทีหลังจากนั้นล้มเหลว; ในการรันครั้งถัดไป การทดสอบเองก็ล้มเหลว; ในการรันหลังจากนั้น ทั้งการทดสอบและการเรนเดอร์ผ่าน NVENC ได้สำเร็จ
ทำไม
vLLM จองหน่วยความจำของ GPU ในสัดส่วนคงที่เมื่อเริ่มทำงาน สำหรับโมเดลและแคชของมัน NVENC ต้องการหน่วยความจำเล็กน้อยสำหรับ CUDA context ของแต่ละเซสชัน เมื่อเซิร์ฟเวอร์โมเดลและงานอื่นๆ ไม่เหลือหน่วยความจำเลย ตัวเข้ารหัสจึงเริ่มไม่ได้ แม้ว่ามันจะเป็นเอนจินแยกต่างหากบนชิปและแทบไม่ได้ใช้ทรัพยากรการคำนวณของ GPU ก็ตาม
วิธีแก้: ตัดสินใจตอนเข้ารหัส ไม่ใช่ตอนทดสอบ
การทดสอบตอนเริ่มระบบบอกคุณว่า NVENC ทำงานได้เมื่อสักครู่ ไม่ได้บอกว่ามันจะทำงานได้สำหรับไฟล์ถัดไป ดังนั้น Studio จึงลองใช้ NVENC สำหรับการเรนเดอร์แต่ละครั้ง และถ้า ffmpeg ล้มเหลว มันจะรัน filter graph เดิมอีกครั้งด้วย libx264 ช่องทางถ่ายทอดสดจะทดสอบการเข้ารหัสครึ่งวินาทีด้วยการตั้งค่าถ่ายทอดสดก่อนเริ่มทุกครั้ง และใช้ libx264 ถ้า NVENC ล้มเหลวในการทดสอบนั้น; ถ้าเกิดข้อผิดพลาด NVENC หรือ CUDA ระหว่างสตรีม การเริ่มครั้งถัดไปจะสลับไปใช้ libx264 วิดีโอที่เสร็จแล้วแต่ละไฟล์จะบันทึกว่าใช้ตัวเข้ารหัสใด ทำให้การสลับไปใช้ตัวสำรองปรากฏในไฟล์งานแทนที่จะผ่านไปโดยไม่มีใครสังเกต
ต้นทุนของการสลับไปใช้ตัวสำรอง
น้อยกว่าที่คาด บน Arm CPU 20 คอร์ของเครื่องเดียวกัน libx264 เรนเดอร์วิดีโอ 1080p ยาว 12 วินาที พร้อมการเคลื่อนไหวกล้อง คำบรรยายแบบฝังตัว และการปรับระดับความดังมาตรฐาน ในเวลา 7.6 วินาที สำหรับวิดีโอสั้นๆ ที่ทำวันละครั้ง CPU เป็นตัวเข้ารหัสที่ดีพอ GPU สำคัญกับโมเดลภาพมากกว่าการเข้ารหัส
บทสรุป
บนเครื่องที่ใช้ร่วมกัน ให้ถือว่าการเข้ารหัสด้วย GPU เป็นตัวเลือกเสริม: ใช้เมื่อพร้อมใช้งาน และเปลี่ยนไปใช้วิธีสำรองเมื่อไม่พร้อมใช้งาน พร้อมบันทึกว่าใช้วิธีใด หลักการเดียวกันนี้ใช้กับฟีเจอร์ GPU ใด ๆ ที่ต้องใช้หน่วยความจำของตนเองบนเครื่องที่เซิร์ฟเวอร์โมเดลได้จองพื้นที่ส่วนใหญ่ไปแล้ว Studio เปิดใช้พฤติกรรมนี้โดยค่าเริ่มต้น