HomeServer Umstellung auf Ubuntu 22.04

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.

Heimdall Dashboard
alle installierten Programme und Scripte

Ü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:

 

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:

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

[Vorstellung] HomeServer Mini mit Ubuntu 22.04 und INTEL QSV

Nachdem ich meinen HomeServer erfolgreich auf Ubuntu umgerüstet habe, versuche ich selbiges nun zu reinen Testzwecken  an einem vorhanden Mini PC System von ASROCK.

Das ist die Hardwarekonfiguration des Mini PC Systems, aufgrund der größe und der Leistung habe ich das System einige male als „Server“ verwendet.

  • Mini PC System ASROCK DeskMini H470 (HDMI Buchse defekt 🙁 , Ausgabe über Display Port)
  • Prozessor 11th Gen Intel(R) Core(TM) i5-11500 @ 2.70GHz (6 Kerne, 12 Threads, 2.7GHz Grundtakt, bis zu 4.6GHz Turbo)
  • Arbeitsspeicher 32GByte DDR4
  • 1Stück Festplatten CRUCIAL P3 SSD NVMe PCIe 1TB
  • Grafikkarte Intel UHD Graphics 750 @ 1,30 GHz [Integrated]

 

Im Gegensatz zum „großen“ HomeServer mit eigener NVIDIA Grafikkarte habe ich hier nur eine OnBoard Grafikkarte (GPU) von INTEL, dazu auch noch ein älteres Modell aufgrund des Prozessors. Um es vorweg zu nehmen: Wiedergabe von Konvertierung / Transcodierung von Videos mittels FFMPEG funktioniert einwandfrei, natürlich mit Hardwareunterstützung, aber es dauert länger als mit der NVIDIA Grafikkarte und deren CUDA Kernen.

Beispiel einer Videotranscodierung mit NVIDIA CUDA und mit INTEL QSV Grafikkartenunterstützung:

Videodatei: demo.ts, Auflösung 1920×1080, H264, 31 Minuten 4 Sekunden Länge, Dateigröße 1.1GByte,

ffprobe -hide_banner demo.ts

Input #0, mpegts, from ‚demo.ts‘:
Duration: 00:31:03.97, start: 1.400000, bitrate: 4711 kb/s
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(tv, progressive), 1920×1080 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn
Stream #0:1[0x101](und): Audio: aac (LC) ([15][0][0][0] / 0x000F), 48000 Hz, stereo, fltp, 130 kb/s

 

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 2m25,880s
user 0m17,359s
sys 0m4,810s

363 fps im Durchschnitt, Geschwindigkeit ca 12.6x, neue Dateigröße 488MByte (von ursprünglich ca. 1100MByte)

 

time ffmpeg -y -hwaccel qsv -hwaccel_output_format qsv -i demo.ts -c:a copy -c:v h264_qsv -f mp4 output_qsv.mp4

mit QSV:
real 3m36,238s
user 1m2,472s
sys 0m18,946s

245 fps im Durchschnitt, Geschwindigkeit ca 8.5x, neue Dateigröße 484MByte (von ursprünglich ca. 1100MByte)

 

Deutlicher wird der Unterschied beim Transcodieren der Datei nach HEVC:

time ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -i demo.ts -c:a copy -c:v hevc_nvenc -f mp4 output_cuda.mp4

mit CUDA:
real 1m56,462s
user 0m17,362s
sys 0m4,480s

456 fps im Durchschnitt, Geschwindigkeit ca 15.9x, neue Dateigröße 492MByte (von ursprünglich ca. 1100MByte)

Ich habe keine Ahnung, warum HEVC schneller ist als x264?! Auch die Dateigröße ist zu groß (HEVC soll kleine sein als X264, bei vergleichbarer Qualität. Vielleicht stimmt auch etwas mit meiner FFMPEG Version nicht, ich bin noch auf Spurensuche …

 

time ffmpeg -y -hwaccel qsv -hwaccel_output_format qsv -i demo.ts -c:a copy -c:v hevc_qsv -f mp4 output_qsv.mp4

mit QSV:
real 7m37,499s
user 2m6,805s
sys 0m35,614s

116 fps im Durchschnitt, Geschwindigkeit ca 4x, neue Dateigröße 138MByte (von ursprünglich ca. 1100MByte)

 


Wie immer benötige ich FFMPEG, diesmal mit INTEL QuickSync (QSV) Unterstützung.

Mein Prozessor INTEL i5-11500 ist aus der 11.Gen, Produktname Rocket Lake. die OnBoard GPU läuft unter der Bezeichnung Intel® UHD Graphics 750.

zuerst benötige ich Grafikkartentreiber, dazu sind folgende Installationsschritte nötig:

wget -qO - https://repositories.intel.com/gpu/intel-graphics.key | \
  sudo gpg --yes --dearmor --output /usr/share/keyrings/intel-graphics.gpg

echo "deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/gpu/ubuntu jammy client" | \
  sudo tee /etc/apt/sources.list.d/intel-gpu-jammy.list

echo "deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/gpu/ubuntu jammy client" | \
  sudo tee /etc/apt/sources.list.d/intel-gpu-jammy.list

sudo apt update

sudo apt install -y \
  intel-opencl-icd intel-level-zero-gpu level-zero intel-level-zero-gpu-raytracing \
  intel-media-va-driver-non-free libmfx1 libmfxgen1 libvpl2 \
  libegl-mesa0 libegl1-mesa libegl1-mesa-dev libgbm1 libgl1-mesa-dev libgl1-mesa-dri \
  libglapi-mesa libgles2-mesa-dev libglx-mesa0 libigdgmm12 libxatracker2 mesa-va-drivers \
  mesa-vdpau-drivers mesa-vulkan-drivers va-driver-all vainfo hwinfo clinfo libigc-dev \
  intel-igc-cm libigdfcl-dev libigfxcmrt-dev level-zero-dev


sudo gpasswd -a ${USER} render


REBOOT durchführen


Danach habe ich nach folgender Anleitung das Intel® oneAPI Toolkit installiert:

wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
| gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null

echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list

sudo apt update

sudo apt install intel-basekit

Die Aktivierung der Installation erfolgt mittels source /opt/intel/oneapi/setvars.sh

Nun benötigen wir die Intel® Video Processing Library (Intel® VPL) und die Intel® Video Processing Library (Intel® VPL) GPU Runtime

git clone https://github.com/intel/libvpl
cd libvpl
export VPL_INSTALL_DIR=`pwd`/../_vplinstall
sudo script/bootstrap
cmake -B _build -DCMAKE_INSTALL_PREFIX=$VPL_INSTALL_DIR
cmake --build _build
cmake --install _build
git clone https://github.com/intel/vpl-gpu-rt vpl-gpu-rt
cd vpl-gpu-rt
mkdir build && cd build
cmake ..
make
make install
Weitere Informationen bezüglich FFMPEG und QSV gibt es HIER direkt bei INTEL.


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, ohne INTEL QSV Unterstützung. 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....