विषय पर बढ़ें

हार्डवेयर एक्सेलेरेशन

संक्षेप में:

  • ग्राफ़िक्स कार्ड, या कई प्रोसेसर के अंदर बना ग्राफ़िक्स वाला हिस्सा (जैसे Intel Quick Sync), सर्वर को सिर्फ़ प्रोसेसर के मुकाबले एक साथ ज़्यादा वीडियो, और ज़्यादा रिज़ॉल्यूशन पर, बदलने देता है।
  • यह सिर्फ़ तब काम आता है जब वीडियो को बदला (ट्रांसकोड) जाता है। जो फ़िल्में जैसी हैं वैसी भेजी जाती हैं, या दोबारा पैक की जाती हैं, वे इसका इस्तेमाल नहीं करतीं।
  • आपको क्या करना है: अपनी compose फ़ाइल में कुछ लाइनें जोड़ें ताकि Evey कार्ड इस्तेमाल कर सके, फिर सेटिंग को स्वतः (सर्वोत्तम उपलब्ध) पर छोड़ दें।
  • कोई भी प्लेबैक कार्ड को भेजने से पहले Evey एक असली वीडियो बदलकर कार्ड को परखता है। जो कार्ड इस परीक्षा में फ़ेल होता है, उसका इस्तेमाल नहीं होता।

आगे कदम दिए हैं, फिर यह कि सर्वर कैसे साबित करता है कि कार्ड क्या कर सकता है।

इसे चालू करें

  1. एडमिन → ट्रांसकोडिंग → एनकोड कैलिब्रेशन खोलें। हार्डवेयर एक्सेलेरेशन डिफ़ॉल्ट रूप से स्वतः (सर्वोत्तम उपलब्ध) पर है, और पता चला: वाली लाइन उन एक्सेलेरेटर के नाम बताती है जो होस्ट दिखाता है।
  2. अगर वहाँ कोई GPU एक्सेलेरेटर नहीं मिला लिखा है, तो डिवाइस कंटेनर को दें (अगला सेक्शन) और कंटेनर फिर से बनाएँ।
  3. फिर से कैलिब्रेट करें दबाएँ, या इंतज़ार करें: सर्वर कम लोड वाले पहले मौके पर खुद को मापता है। फिर कार्ड पर इस्तेमाल हो रहा बैकएंड, और GPU और प्रोसेसर के लिए प्रमाणित रिज़ॉल्यूशन दिखते हैं।

हर स्थिति के लिए एक ही इमेज है: किसी खास कार्ड का ड्राइवर उसमें पहले से नहीं डाला गया है, और वही कंटेनर सिर्फ़ सॉफ़्टवेयर में, Intel या AMD GPU के साथ, या NVIDIA कार्ड के साथ चलता है, इस पर निर्भर करते हुए कि आप उसे कौन से डिवाइस देते हैं।

डिवाइस कंटेनर को दें

docker-compose.yml
services:
  evey:
    devices:
      - /dev/dri:/dev/dri
    group_add:
      - "104"   # होस्ट का render group: getent group render

group होस्ट का render group होना चाहिए (getent group render, या stat -c %g /dev/dri/renderD128)। गलत मान से कुछ नहीं टूटता: बस GPU तक पहुँच नहीं मिलती और सर्वर प्रोसेसर पर ही रहता है।

होस्ट पर NVIDIA Container Toolkit इंस्टॉल करें, फिर GPU आरक्षित करें और video capability माँगें, जिसके बिना encoder लाइब्रेरी अंदर नहीं डाली जाती:

docker-compose.yml
services:
  evey:
    environment:
      NVIDIA_DRIVER_CAPABILITIES: all   # इसमें "video" होना चाहिए
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

/dev/mpp_service, /dev/dri और, जहाँ kernel उसे दिखाता है, /dev/rga को map करें। देखें ARM होस्ट।

NVIDIA का आरक्षण और /dev/dri, दोनों एक साथ map किए जा सकते हैं।

"असली एनकोड से साबित" का क्या मतलब है

स्वतः पर सर्वर सिर्फ़ माप के आधार पर चलता है, कार्ड के नाम से कभी नहीं:

  1. पहचानना। हर render node को VAAPI के लिए जाँचा जाता है, और Intel पर Quick Sync के लिए भी; इसी तरह हर NVIDIA GPU और Rockchip encoder को। कोई encoder तभी गिना जाता है जब उससे एक छोटा असली एनकोड सफल हो।
  2. प्रमाणित करना। हर एक्सेलेरेटर रिज़ॉल्यूशन के स्तर (720p से 2160p) असली प्लेबैक जैसी ही प्रक्रिया में एनकोड करता है, और वह सबसे ऊँचा स्तर रखता है जिसे वह असली समय से 1.2 गुना रफ़्तार पर संभाल पाता है। हर जाँच के कुछ फ़्रेम वापस डिकोड करके मूल से मिलाए जाते हैं, क्योंकि खराब ड्राइवर ठीक-ठाक खत्म होते हुए भी हरे या बिगड़े फ़्रेम बना सकता है। जो एक्सेलेरेटर 720p नहीं संभाल पाता, उसका इस्तेमाल नहीं होता।
  3. रास्तों को मापना। एक्सेलेरेटर ने जो भी क्षमता साबित की (SDR, HEVC, AV1, GPU पर tone mapping, HDR बनाए रखना), हर एक के लिए एक असली सेशन की लागत मापी जाती है।
  4. हर स्ट्रीम के लिए चुनना। हर प्लेबैक सबसे सस्ते उस एक्सेलेरेटर को जाता है जिसने वह साबित किया है जिसकी उस स्ट्रीम को ज़रूरत है, या प्रोसेसर को। देखें ट्रांसकोडिंग और सर्वर की क्षमता।

माप ऐसे समय का इंतज़ार करता है जब सर्वर पर लोड कम हो: कोई स्ट्रीम न चल रही हो, और होस्ट का CPU लगातार पाँच नमूनों में, चार-चार सेकंड के अंतर पर, 20 % से नीचे हो, ताकि व्यस्त बूट या लाइब्रेरी स्कैन की वजह से सीमाएँ बहुत नीचे तय न हो जाएँ। हार्डवेयर बदलने पर यह फिर चलता है। फिर से कैलिब्रेट करें इसे तुरंत चलाता है: कार्ड जोड़ने के बाद या कंटेनर को दूसरी मशीन पर ले जाने के बाद इसका इस्तेमाल करें।

बूट के तुरंत बाद की विफलता अंतिम नतीजा नहीं है

जो GPU कंटेनर शुरू होने के पहले कुछ सेकंड में चालू नहीं हो पाता, उसे कुछ भी दर्ज करने से पहले थोड़े-थोड़े अंतर पर फिर से जाँचा जाता है। सिर्फ़ वह विफलता जो बनी रहे, या पक्की किस्म की विफलता (encoder नहीं है, फ़ॉर्मेट सपोर्ट नहीं है), एक्सेलेरेटर को अनुपयोगी चिह्नित करती है।

बैकएंड ज़बरदस्ती चुनना या इसे बंद करना

बंद (केवल सॉफ़्टवेयर) हर ट्रांसकोड को प्रोसेसर पर रखता है; खराब ड्राइवर से बचने का यही रास्ता है। हाथ से कोई बैकएंड चुनना (NVENC, VAAPI, QSV, RKMPP) उसी को लागू करता है; अगर वह अनुपयोगी निकले, तो सर्वर प्रोसेसर पर लौट आता है और कार्ड पर असल में इस्तेमाल हो रहा बैकएंड दिखता है।

कई एक्सेलेरेटर वाली मशीन पर स्वतः की कोई तय पसंद नहीं होती: हर एक को प्रमाणित किया और मापा जाता है, और हर स्ट्रीम उस बैकएंड को जाती है जिसने उसकी ज़रूरत वाला रास्ता साबित किया है, सबसे अच्छी साबित क्वालिटी और सबसे कम मापी गई लागत पर। इसलिए एक ही सर्वर पर दो स्ट्रीम अलग-अलग बैकएंड इस्तेमाल कर सकती हैं, जैसे एक कार्ड पर HDR tone mapping और दूसरे पर HEVC एनकोड।

जाँचें कि इसका इस्तेमाल हो रहा है

एडमिन → ट्रांसकोडिंग → एनकोड कैलिब्रेशन दिखाता है: पहचाने गए एक्सेलेरेटर, इस्तेमाल हो रहा बैकएंड, GPU और प्रोसेसर के लिए प्रमाणित रिज़ॉल्यूशन, और हार्डवेयर फ़ॉलबैक में हाल के वे एनकोड जो प्रोसेसर पर लौट आए, उनकी वजह के साथ। प्लेबैक के दौरान एडमिन → अभी चल रहा है बताता है कि हर स्ट्रीम किस बैकएंड से एनकोड हो रही है।

WSL2 में NVENC काम करता है; VAAPI और Quick Sync नहीं करते (WSL का ग्राफ़िक्स ड्राइवर इन एनकोड पर फ़ेल होता है), और पैनल इन्हें WSL पर समर्थित नहीं के रूप में दिखाता है।