Όταν το NVENC δεν ξεκινά: μια GPU γεμάτη μοντέλα και ένας renderer που υποβαθμίζεται

Βίντεο

Ο video renderer μας τρέχει στο ίδιο μηχάνημα με το γλωσσικό μοντέλο που γράφει τα σενάρια του. Μια βραδιά, ο hardware encoder απλώς δεν άνοιγε: "CUDA_ERROR_OUT_OF_MEMORY: out of memory", στη συνέχεια "No capable devices found".

Τι συνέβη

Το μηχάνημα είναι ένας NVIDIA GB10 desktop, του οποίου ο CPU και η GPU μοιράζονται μια κοινή δεξαμενή μνήμης. Εξυπηρετεί το τοπικό μας μοντέλο μέσω vLLM, και το Studio κάνει rendering στο ίδιο μηχάνημα με ffmpeg, χρησιμοποιώντας NVENC όταν μπορεί. Κατά τη διάρκεια μιας δοκιμαστικής εκτέλεσης, ο encoder απέτυχε να δημιουργήσει το CUDA context του. Η αποτυχία εμφανιζόταν και εξαφανιζόταν μέσα σε δευτερόλεπτα: μια σύντομη δοκιμή NVENC περνούσε και το rendering αμέσως μετά απέτυχε· στην επόμενη εκτέλεση απέτυχε η ίδια η δοκιμή· στην εκτέλεση μετά από αυτήν, τόσο η δοκιμή όσο και το rendering πέρασαν μέσω NVENC.

Γιατί

Το vLLM δεσμεύει ένα σταθερό ποσοστό της μνήμης της GPU κατά την εκκίνηση, για το μοντέλο και την cache του. Το NVENC χρειάζεται λίγη μνήμη δική του για το CUDA context κάθε συνεδρίας. Όταν ο διακομιστής μοντέλων και άλλες εργασίες δεν αφήνουν τίποτα ελεύθερο, ο encoder δεν μπορεί να ξεκινήσει, παρόλο που είναι μια ξεχωριστή μηχανή στο τσιπ και θα άγγιζε ελάχιστα την υπολογιστική ισχύ της GPU.

Η διόρθωση: απόφαση κατά την κωδικοποίηση, όχι κατά τη δοκιμή

Μια δοκιμή κατά την εκκίνηση σας λέει ότι το NVENC δούλεψε πριν από λίγο, όχι ότι θα δουλέψει για το επόμενο αρχείο. Έτσι, το Studio δοκιμάζει το NVENC για κάθε rendering και, αν το ffmpeg αποτύχει, εκτελεί ξανά το ίδιο filter graph με libx264. Το live channel εκτελεί μια δοκιμαστική κωδικοποίηση μισού δευτερολέπτου με τις live ρυθμίσεις πριν από κάθε εκκίνηση και χρησιμοποιεί libx264 αν το NVENC αποτύχει· ένα σφάλμα NVENC ή CUDA κατά τη ροή αλλάζει την επόμενη εκκίνηση σε libx264. Κάθε ολοκληρωμένο βίντεο καταγράφει ποιος encoder το δημιούργησε, ώστε μια υποβάθμιση να φαίνεται στο αρχείο εργασίας αντί να περάσει απαρατήρητη.

Τι κοστίζει η υποβάθμιση

Λιγότερο από ό,τι περιμέναμε. Στον 20πύρηνο Arm CPU του ίδιου μηχανήματος, το libx264 έκανε rendering 12 δευτερολέπτων βίντεο 1080p, με κινήσεις κάμερας, burned-in captions και κανονικοποίηση έντασης ήχου, σε 7,6 δευτερόλεπτα. Για σύντομα βίντεο που φτιάχνονται μία φορά την ημέρα, ο CPU είναι ένας άριστα επαρκής encoder. Η GPU έχει πολύ μεγαλύτερη σημασία για το image model παρά για την κωδικοποίηση.

Το συμπέρασμα

Σε κοινόχρηστο μηχάνημα, θεωρήστε τον κωδικοποιητή GPU προαιρετικό: χρησιμοποιήστε τον όταν είναι διαθέσιμος, υποχωρήστε όταν δεν είναι και καταγράψτε ποιος χρησιμοποιήθηκε. Το ίδιο ισχύει για οποιαδήποτε λειτουργία GPU που απαιτεί δική της μνήμη σε μηχάνημα όπου ένας διακομιστής μοντέλων έχει ήδη δεσμεύσει το μεγαλύτερο μέρος της. Το Studio περιλαμβάνει αυτή τη συμπεριφορά ως προεπιλογή.

Ενημερώθηκε: