Khi NVENC không khởi động được: GPU đầy model và trình kết xuất chuyển sang phương án dự phòng
Video
Trình kết xuất video của chúng tôi chạy trên cùng máy với model ngôn ngữ viết kịch bản cho nó. Một buổi tối, bộ mã hóa phần cứng đơn giản là không mở được: "CUDA_ERROR_OUT_OF_MEMORY: out of memory", sau đó là "No capable devices found".
Chuyện gì đã xảy ra
Máy là một desktop NVIDIA GB10, trong đó CPU và GPU dùng chung một vùng nhớ. Nó phục vụ model cục bộ của chúng tôi qua vLLM, và Studio kết xuất trên cùng máy đó với ffmpeg, dùng NVENC khi có thể. Trong một lần chạy thử, bộ mã hóa không tạo được CUDA context. Lỗi xuất hiện rồi biến mất trong vài giây: một phép thử NVENC ngắn thành công nhưng lần kết xuất ngay sau đó thất bại; ở lần chạy tiếp theo, chính phép thử thất bại; ở lần chạy sau nữa, cả phép thử lẫn kết xuất đều đi qua NVENC.
Tại sao
vLLM dành trước một phần cố định bộ nhớ GPU khi khởi động, cho model và cache của nó. NVENC cần một chút bộ nhớ riêng cho CUDA context của mỗi phiên. Khi máy chủ model và các tác vụ khác không để lại chút bộ nhớ nào, bộ mã hóa không thể khởi động, dù nó là một engine riêng trên chip và hầu như không dùng đến tài nguyên tính toán của GPU.
Cách khắc phục: quyết định khi mã hóa, không phải khi thử
Một phép thử lúc khởi động chỉ cho biết NVENC đã hoạt động cách đó một khoảnh khắc, chứ không đảm bảo nó sẽ hoạt động cho tệp tiếp theo. Vì vậy Studio thử NVENC cho mỗi lần kết xuất và, nếu ffmpeg thất bại, chạy lại cùng đồ thị bộ lọc với libx264. Kênh trực tiếp chạy một phép thử mã hóa nửa giây với các thiết lập trực tiếp trước mỗi lần bắt đầu và dùng libx264 nếu NVENC thất bại; một lỗi NVENC hoặc CUDA trong lúc phát trực tiếp sẽ chuyển lần bắt đầu tiếp theo sang libx264. Mỗi video hoàn tất ghi lại encoder nào đã tạo ra nó, nên việc chuyển sang phương án dự phòng hiện ra trong tệp công việc thay vì bị bỏ qua mà không ai hay.
Chi phí của phương án dự phòng
Ít hơn chúng tôi dự đoán. Trên CPU Arm 20 lõi của cùng máy đó, libx264 kết xuất 12 giây video 1080p, với các chuyển động camera, phụ đề cứng và chuẩn hóa độ lớn âm thanh, trong 7,6 giây. Với các video ngắn tạo mỗi ngày một lần, CPU là một bộ mã hóa hoàn toàn ổn. GPU quan trọng hơn nhiều đối với model hình ảnh so với việc mã hóa.
Bài học rút ra
Trên máy dùng chung, hãy coi bộ mã hóa GPU là tùy chọn: sử dụng khi khả dụng, chuyển sang phương án dự phòng khi không khả dụng và ghi log lại phương án đã dùng. Điều tương tự cũng áp dụng cho mọi tính năng GPU cần bộ nhớ riêng trên máy mà một máy chủ mô hình đã chiếm phần lớn tài nguyên. Studio mặc định bật sẵn hành vi này.