„NVIDIA Tesla P4: Kaip GPU transkodavimas pakeitė CPU serveriuose“

„NVIDIA Tesla P4: Kaip GPU transkodavimas pakeitė CPU serveriuose“

Ilgą laiką mano „Jellyfin“ serveris vertė procesorių (CPU) dirbti viršvalandžius. Kiekvienas 4K srautas buvo kančia: procesoriaus temperatūra šokdavo, ventiliatoriai pasiekdavo maksimalius sūkius, o rezultatas vis tiek būdavo „realaus laiko“ balansavimas ant ribos. CPU resursų švaistymas transkodavimui yra klaikiai neveiksmingas, tagi reikėjo atskiros jėgos. Taip serveryje atsirado NVIDIA Tesla P4 – serverinė korta, skirta būtent šiam darbui, paliekant žaidimams skirtas RTX serijos kortas nuošalyje.

Bet įdėti kortą į PCIe lizdą buvo tik pati lengviausia dalis. Toliau prasidėjo tikroji inžinerija.

1 Etapas: Konteinerių chaosas ir OS nesuderinamumas

Kelias iki veikiančios sistemos nebuvo tiesus. Iš pradžių bandžiau viską sukišti į standartinius konteinerius su įvairiomis operacinėmis sistemomis, tikintis greito rezultato ir „Plug & Play“ patirties. Tai buvo visiška klaida. Skirtingi OS „Image“ failai atsisakydavo matyti GPU, keldavo nesuderinamumo klaidų tarp „Host“ ir konteinerio, o pats „Jellyfin ffmpeg“ procesas nuolat „lūždavo“. Supratau, kad abstrakcijos sluoksnių yra per daug.

2 Etapas: Proveržis su dedikuota Debian 12 VM

Tikrasis posūkis įvyko tada, kai išėjau iš konteinerių „darželio“ ir „Proxmox“ aplinkoje sukūriau dedikuotą Debian 12 Virtualią Mašiną (VM). Šis sprendimas suteikė visišką kontrolę virš kernelio ir leido tiesiogiai įdiegti NVIDIA 550.x tvarkykles (drivers). Tik šiame lygyje, paleidus komandą nvidia-smi, „Tesla P4“ nustojo būti nematomu įrenginiu ir pagaliau tapo pilnaverte sistemos dalimi. Tačiau džiaugtis buvo per anksti.

3 Etapas: Teisių (Permissions) pragaras Docker aplinkoje

VM matė kortą puikiai, bet pats „Jellyfin“ sukosi Docker konteineryje. Ir čia mes atsimušėme į sieną: konteineris buvo visiškai „aklas“ ir neturėjo teisių pasiekti /dev/nvidia mazgų. Įprasti „volume mapping“ būdai, kuriais bandoma prakišti aparatūrą, neveikė. Sprendimas buvo NVIDIA Container Toolkit įdiegimas VM viduje ir griežta Docker paleidimo komanda. Turėjome aiškiai nurodyti ne tik, kad duodame kortą, bet ir kokias funkcijas leidžiame naudoti:

sudo docker run -d --name jellyfin \
  --gpus all \
  -e NVIDIA_VISIBLE_DEVICES=all \
  -e NVIDIA_DRIVER_CAPABILITIES=compute,video,utility \
  -v /tavo/config:/config \
  -v /tavo/media:/media \
  jellyfin/jellyfin:latest

4 Etapas: Iliuzija, kad viskas baigta (Kritinis lūžis)

Po teisių sutvarkymo konteinerio viduje įvykdžius nvidia-smi, korta pagaliau švietė visu gražumu. Atrodė – viskas, pergalė! Paleidžiu filmą… ir procesorius vėl kaukia apkrautas 100%, o Tesla P4 ramiai stovi 0% apkrovoje. Teisių sutvarkymas problemos neišsprendė, nes susidūrėme su „Jellyfin“ konfigūracijos inercija. Sistema elgėsi „šizofreniškai“: nors Dockeris GPU matė ir teises turėjo, „Jellyfin“ vis tiek naudojo CPU.

5 Etapas: „Intel“ vaiduoklių valymas iš vidaus

Kodėl taip vyko? Nes „Jellyfin“ širdyje – encoding.xml faile – vis dar buvo įrašytos „senosios tiesos“. Anksčiau buvau bandęs konfigūruoti sistemą su /dev/dri/renderD128 (kas yra būdinga „Intel VAAPI“ architektūrai). „Jellyfin“ aklai laikėsi šio įrašo. Kadangi Tesla P4 yra NVENC korta, bandymas jai taikyti VAAPI instrukcijas baigdavosi klaidomis, kurios priversdavo sistemą grįžti prie CPU transkodavimo. Mums teko jėga perrašyti „Jellyfin“ pasaulėžiūrą per terminalą (nes per GUI šie vaiduokliai neišsivalė):

docker stop jellyfin
docker exec jellyfin sed -i 's|<HardwareAccelerationType>nvenc</HardwareAccelerationType>|<HardwareAccelerationType>none</HardwareAccelerationType>|' /config/config/encoding.xml
docker exec jellyfin sed -i 's|<VaapiDevice>/dev/dri/renderD128</VaapiDevice>|<VaapiDevice />|' /config/config/encoding.xml
docker restart jellyfin

Tik fiziškai ištrynus šiuos kelius ir privertus sistemą iš naujo atlikti aparatūros detekciją, blokada buvo pralaužta.

6 Etapas: Paskutiniai „Playback“ štrichai

Kai XML failas buvo švarus, liko tik nurodyti teisingus parametrus „Jellyfin“ skydelyje (Dashboard -> Playback):

  • Hardware acceleration: Griežtai parinkta NVIDIA NVENC (jokių „Auto“ režimų!).
  • Hardware decoding codecs: Pažymėti h264hevc ir hevc_10bit.
  • Tonemapping: Išjungtas (siekiant maksimalaus stabilumo testavimo metu, eliminuojant programinio konvertavimo klaidas).

Galutinis rezultatas: P0 būsena

Po visų šių chronologiškų žingsnių vaizdas pasikeitė kardinaliai. Paleidus 4K turinį, terminale suvedus nvidia-smi, procesų sąraše pasirodė ilgai lauktas vaizdas: C /usr/lib/jellyfin-ffmpeg/ffmpeg naudoja ~938 MiB VRAM. GPU perėjo į „P0“ (maksimalaus našumo) būseną, atliko visą transkodavimo darbą, sugeneravo buferį ir leido procesoriui atsikvėpti.

Aušinimo iššūkis ir 24V „DIY“ sprendimas

Tesla P4 turi vieną specifiką – tai korta su pasyviu aušinimu („passive-cooling“). Greitai paaiškėjo, kad mano Fujitsu serveryje standartinio oro srauto neužtenka, jog korta jaustųsi komfortiškai dirbdama su 4K srautais. Reikėjo aktyvaus aušinimo sprendimo, o efektyviausias variantas tokio tipo serverinėms kortoms – „blower“ stiliaus ventiliatorius, pučiantis orą tiesiai per radiatorių.

Maitinimo galvosūkis: Iš kur gauti 24V? Po ranka turėjau galingus 24V „blower“ tipo ventiliatorius, tačiau serveryje rasti 24V maitinimo šaltinį yra praktiškai neįmanoma. Sprendimas buvo paprastas ir pragmatiškas: iš „Amazon“ įsigijome 12V į 24V įtampos konverterį:

Pačią 12V įtampą paėmėme tiesiai iš pagrindinės plokštės. Ši Fujitsu plokštė yra dėkinga tuo, kad turi daugybę laisvų 4-pin „power out“ lizdų, o jų išdėstymas (pin-out) yra labai aiškus ir logiškas: viršutinė eilė (iš kairės į dešinę) yra minusas, o apatinė eilė (iš kairės į dešinę) – pliusas. Jokių sudėtingų „riserių“ ar litavimo, tiesiog švarus maitinimas tiesiai į konverterį.

Archajiškas, bet nenugalimas tvirtinimas Jei galvojate, kad aušinimo sistemą tvirtinome naudodami 3D spausdintuvais kurtus rėmus – klystate. Tvirtinimas buvo labiau archajiškas, nei profesionalus: dvipusė lipni juosta ir du kabelių pritraukėjai („užtrauktukai“).

Estetikos serverio viduje gal ir nepadaugėjo, tačiau rezultatas kalba pats už save – klausimas buvo visiškai išspręstas. Korta gauna maksimalų oro srautą, o temperatūros stovi kaip įkaltos net ir piko metu.

Šis projektas patvirtino vieną: homelab aplinkoje profesionalus rezultatas neateina tiesiog sujungus laidus. Tai reikalauja kantrybės, logikos ir supratimo, kaip sistemos bendrauja (arba nebendrauja) tarpusavyje. Bet kai Tesla P4 galiausiai perima srautą – supranti, kad buvo verta.