In den vergangenen Tagen habe ich meinen HomeServer umgestellt vom Betriebssystem Windows 11 auf Ubuntu Server 22.04 LTS. In diesem Zusammenhang habe bzw. musste ich mich zum ersten mal mit dem Thema Docker Container sowie GPU beschäftigen, aber ich habe beides am laufen und es funktioniert einwandfrei.
Über mein Heimdall Dashboard habe ich alle Programm hinterlegt, um diese ohne Aufwand starten und benutzen zu können.
Hier eine kurze Erläuterung zu den entsprechenden Einträgen:
- AgentDVR
- Airsonic
- CodeProject AI
- CTB Recorder
- FileBrowser
- Frigate-DVR
- Immich
- NZBHydra2
- Plex
- Portainer
- SABnzbd
- Stashapp
- Spotweb
- Uptime Kuma
- Wiki.js
- XBVR
- YoutubeDL-Material
- Nextcloud
Im Vergleich zum ursprünglichen Bericht über meinen HomeServer hat sich die Hardware in der Zwischenzeit ein wenig verändert, die durchgeführten Anpassungen stellen sich wie folgt dar:
- Gehäuse FORTRON FSP ITX CST350 Plus
- Hauptplatine ASROCK B660M Pro RS
- Prozessor 12th Gen Intel(R) Core(TM) i3-12100T (4 Kerne, 8 Threads, 2.2GHz Grundtakt, bis zu 4.1GHz Turbo)
- Arbeitsspeicher 32GByte DDR4
- 2Stück Festplatten Western Digital SSD NVMe PCIe 1TB SN570 (1x System und Software, 1x Daten)
- Grafikkarte NVIDIA
GeForce GTX 1660 SUPERQuadro T400 mit 4GB RAM - Coral Dual Edge TPU (KI Beschleuniger) mittels Adapter im PCIe 1x Steckplatz
- zusätzliche Netzwerkkarte INTEL X540-T2 (Dual Port 10Gigabit RJ45)
Wozu eine relativ große Grafikkarte im Server? Ich verwende einige Apps für Video und Streaming, und der Hersteller NVidia verwendet in seinen Grafikkarten eine Technologie namens CUDA, hier werden die Rechenkerne der Grafikkarte verwendet, um parallele Berechnungen z.B. an den Videodateien durchzuführen. Warum ist das so effektiv? Ein Prozessor im „normalen“ (Heim-)Computer hat zum Beispiel 4 oder 8 Kerne, meine Grafikkarte hat 1408 Kerne, die Gamer Grafikkarte RTX 4080 verfügt bereits über 9728 Kerne, und die großen High End Grafikkarten wie die Quadro A6000 verfügen über 10752 CUDA Kerne sowie über 48GByte Speicher auf der Karte.
Ich verwende die Leistung der Grafikkarte z.B. in Nextcloud (Personen- und Objekterkennung in Fotos), AgentDVR und Frigate-DVR (Personen- und Objekterkennung in Videos), Immich (Personenerkennung in Fotos), Plex (Transcodierung von Video in andere Formate für Live Streaming etc.), Stashapp (Transcodierung und Live Stream von Videos) und zur Umwandlung von aufgenommenen Web-Streams in das platzsparende HEVC Videoformat (aus einer .TS Videodatei mit 2.8GB Größe erstelle ich eine ca. 720MB große MKV Videodatei, ohne für mich sichtbaren Verlust, die Umwandlung solch einer Datei dauert ca 8 Minuten).
Beispiel einer Videotranscodierung MIT und OHNE Grafikkartenunterstützung:
Videodatei: demo.ts, Auflösung 1920×1080, H264, 31 Minuten 4 Sekunden Länge, Dateigröße 1.1GByte
Transcodierung
time ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -i demo.ts -c:a copy -c:v h264_nvenc -f mp4 output_cuda.mp4
mit CUDA:
real 2m0,857s
user 0m26,646s
sys 0m7,906s
time ffmpeg -y -i input.ts -c:a copy -c:v libx264 -f mp4 output.mp4
ohne CUDA:
real 16m28,782s
user 95m19,739s
sys 0m51,629s
Vor Verwendung der GTX 1660 probierte ich es mit einer Geforce 1050 und einer Quadro P400, beide Karten verfügen über (nur) 2GByte Arbeitsspeicher, aber mir gelangten damit keine Erfolge, keine Ahnung ob es an der CUDA Kompatibilität oder dem zu geringen Arbeitsspeicher lag.
Die NVidia Treiber allgemein waren etwas „gemein“ zu mir, trotz Lesen der entsprechenden Unterlagen gab es etliche fiese Stolpersteine bei der Installation zu umschiffen.
Beispiel gefällig?
Die Treiberinstallation stürzte ewig ab, trotz Log-Datei fand ich den Fehler nicht. Ubuntu 22 installiert als Default den Compiler gcc in der Version 11, für die Treiber wird jedoch gcc in der Version 12 benötigt. Habe ich nirgends in der Doku gefunden, Google war jedoch mein Freund:
sudo apt install --reinstall gcc-12
sudo ln -s -f /usr/bin/gcc-12 /usr/bin/gcc
Und nach der Installation wieder zurück zur ursprünglichen gcc Version 11:
sudo ln -s -f /usr/bin/gcc-11 /usr/bin/gcc
Für die CUDA Schnittstelle gibt es verschiedene Version für die Installation, CUDA11 und CUDA 12, mit Unternummern (CUDA12.2, CUDA12.4, CUDA12.5). Ich persönlich hatte nur mit der Version 12.2 Erfolg.
nvcc --version nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2023 NVIDIA Corporation Built on Tue_Aug_15_22:02:13_PDT_2023 Cuda compilation tools, release 12.2, V12.2.140 Build cuda_12.2.r12.2/compiler.33191640_0
cat /usr/include/x86_64-linux-gnu/cudnn_v*.h | grep CUDNN_MAJOR -A 2
#define CUDNN_MAJOR 8
#define CUDNN_MINOR 9
#define CUDNN_PATCHLEVEL 7
cudnn Version 8.9.7
Als nächstes benötige ich FFmpeg, für mich das wichtigste Tool bezüglich Videos und Konvertierung. Aktuell verfügbar (Stand 06/2024) ist FFmpeg in der Version 7.0.1, in Ubuntu 22 ist als Paket Quelle die Version 4.4.2 verfügbar. Ich benötige jedoch die aktuelle Version inkl. entsprechender (aktueller) Codecs für die Nutzung der GPU Funktionalität. Zauberwort: selbst Compilieren aus den Quellen (Build from Source), ein Glück das Google funktioniert hat….
Kurzversion:
sudo apt install build-essential yasm cmake libtool libc6 libc6-dev unzip wget libnuma1 libnuma-dev
cd ~ git clone https://github.com/FFmpeg/nv-codec-headers.git cd nv-codec-headers.git sudo make install
cd ~ git clone https://git.ffmpeg.org/ffmpeg.git cd ffmpeg ./configure --enable-nonfree --enable-ffnvcodec --enable-cuda-nvcc --enable-cuda --enable-cuda-llvm --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --nvccflags='-gencode arch=compute_75,code=sm_75' --disable-static --enable-shared make -j8 sudo make install
Die Kompilierung von FFmpeg dauert auf meinem Prozessor (INTEL i3 4 Kerne) etwa 2 Minuten und 16 Sekunden, in der Zwischenzeit habe ich noch mehr Codecs in FFmpeg eingebunden, und so sieht meine Konfiguration im Moment aus:
ffmpeg version N-116176-gaa8230c7ba Copyright (c) 2000-2024 the FFmpeg developers built with gcc 11 (Ubuntu 11.4.0-1ubuntu1~22.04) configuration: --enable-nonfree --enable-version3 --enable-cuda-nvcc --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --disable-static --enable-shared --enable-gnutls --enable-libaom --enable-libass --enable-gpl --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libass --enable-libopus --enable-libdav1d --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libwebp --enable-cuvid --enable-nvenc --enable-libvmaf --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-librav1e --enable-libkvazaar --enable-libjxl --enable-libsvtav1 --enable-libzimg --enable-pic --enable-rpath --enable-demuxer=dash --enable-libxml2 --enable-thumb --enable-libvidstab --enable-vapoursynth --nvccflags='-gencode arch=compute_75,code=sm_75' libavutil 59. 28.100 / 59. 28.100 libavcodec 61. 9.100 / 61. 9.100 libavformat 61. 5.100 / 61. 5.100 libavdevice 61. 2.100 / 61. 2.100 libavfilter 10. 2.102 / 10. 2.102 libswscale 8. 2.100 / 8. 2.100 libswresample 5. 2.100 / 5. 2.100 libpostproc 58. 2.100 / 58. 2.100 Universal media converter