وقتی NVENC بالا نمیآید: GPU پر از مدلها، و یک رندرر که به حالت جایگزین میرود
ویدیو
رندرر ویدیوی ما روی همان ماشینِ مدل زبانی که اسکریپتهایش را مینویسد اجرا میشود. یک شب، انکودر سختافزاری بهسادگی باز نشد: «CUDA_ERROR_OUT_OF_MEMORY: out of memory» و سپس «No capable devices found».
چه اتفاقی افتاد
ماشین یک دسکتاپ NVIDIA GB10 است که CPU و GPU آن یک استخر حافظه مشترک دارند. این ماشین مدل محلی ما را از طریق vLLM سرو میکند و Studio روی همان جعبه با ffmpeg رندر میگیرد و هرگاه ممکن باشد از NVENC استفاده میکند. در یک اجرای آزمایشی، انکودر نتوانست context کدای خود را بسازد. خطا در عرض چند ثانیه میآمد و میرفت: یک پروب کوتاه NVENC موفق بود و رندر بلافاصله پس از آن شکست خورد؛ در اجرای بعدی خودِ پروب شکست خورد؛ و در اجرای پس از آن، هم پروب و هم رندر از طریق NVENC انجام شدند.
چرا
vLLM هنگام راهاندازی، سهم ثابتی از حافظه GPU را برای مدل و کش آن رزرو میکند. NVENC برای context کدای هر جلسه به مقدار کمی حافظه مستقل نیاز دارد. وقتی سرور مدل و سایر کارها چیزی باقی نگذارند، انکودر نمیتواند شروع به کار کند، هرچند که یک موتور مجزا روی تراشه است و تقریباً به قدرت محاسباتی GPU دست نمیزند.
راهحل: تصمیمگیری در لحظه انکود، نه در لحظه پروب
یک پروب در زمان راهاندازی به شما میگوید که NVENC لحظهای پیش کار میکرد، نه اینکه برای فایل بعدی هم کار خواهد کرد. بنابراین Studio برای هر رندر NVENC را امتحان میکند و اگر ffmpeg شکست خورد، همان گراف فیلتر را دوباره با libx264 اجرا میکند. کانال زنده قبل از هر شروع، یک انکود آزمایشی نیمثانیهای با تنظیمات زنده انجام میدهد و اگر NVENC در آن شکست خورد، از libx264 استفاده میکند؛ یک خطای NVENC یا CUDA در حین استریم، شروع بعدی را به libx264 تغییر میدهد. هر ویدیوی تکمیلشده ثبت میکند که کدام انکودر آن را ساخته است، بنابراین یک حالت جایگزین در فایل کار مشخص میشود و بیصدا رد نمیشود.
هزینه حالت جایگزین
کمتر از آنچه انتظار داشتیم. روی همان CPU 20 هستهای Arm، libx264 یک ویدیوی 1080p به مدت 12 ثانیه را، همراه با حرکات دوربین، زیرنویسهای سوزاندهشده و نرمالسازی بلندی صدا، در 7.6 ثانیه رندر کرد. برای ویدیوهای کوتاه که روزی یک بار ساخته میشوند، CPU یک انکودر کاملاً مناسب است. GPU برای مدل تصویری بسیار مهمتر از انکود است.
نکته کلیدی
روی یک ماشین مشترک، انکودر GPU را اختیاری در نظر بگیرید: در صورتی که در دسترس بود از آن استفاده کنید، در صورت نبود به حالت جایگزین بازگردید و ثبت کنید که کدام را به کار بردهاید. همین قاعده برای هر قابلیت GPU که به حافظه اختصاصی خود نیاز دارد و روی دستگاهی اجرا میشود که یک سرور مدل پیشتر بخش عمده حافظه را اشغال کرده است، نیز صدق میکند. Studio این رفتار را بهصورت پیشفرض فعال ارائه میکند.