HW-Acceleration mit NVIDIA GPU in LXC-Container Vorbereitung Proxmox Proxmox auf die neueste Version aktualisieren: apt update && apt dist-upgrade -y Nach dem Upgrade neu starten: reboot Installation von git, gcc, make und den Header-Dateien: apt install git gcc make pve-headers-$(uname -r) Aktuellen NVIDIA-Treiber installieren: Hierfür die folgende Liste als Referenz verwenden: GitHub - keylase/nvidia-patch mkdir /opt/nvidia cd /opt/nvidia wget https://download.nvidia.com/XFree86/Linux-x86_64//NVIDIA-Linux-x86_64-.run chmod +x NVIDIA-Linux-x86_64-.run ./NVIDIA-Linux-x86_64-.run --no-questions --ui=none --disable-nouveau Der Treiber erstellt die Datei /etc/modprobe.d/nvidia-installer-disable-nouveau.conf und deaktiviert den Nouveau-Treiber. Das bitte mit der erstellten .conf-Datei überprüfen: more /etc/modprobe.d/nvidia-installer-disable-nouveau.conf # generated by nvidia-installer blacklist nouveau options nouveau modeset=0 Proxmox zum Deaktivieren der Nouveau-Treiber neu starten: reboot Führe das NVIDIA-Installationsprogramm erneut aus, um die Treiberinstallation abzuschließen: /opt/nvidia/NVIDIA-Linux-x86_64-.run --no-questions --ui=none Kontrolliere, ob der Befehl nvidia-smi richtig ausgeführt wird: nvidia-smi +-----------------------------------------------------------------------------+ | NVIDIA-SMI 525.60.11 Driver Version: 525.60.11 CUDA Version: 12.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Quadro P400 On | 00000000:05:00.0 Off | N/A | | 34% 32C P8 N/A / N/A | 1MiB / 2048MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+ Erstellen / Aktualisieren der Datei modules.conf für den Bootvorgang: nano /etc/modules-load.d/modules.conf # /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. nvidia nvidia_uvm Generiere das Initramfs Image mit der neuen modules.conf: update-initramfs -u Erstelle Regeln zum Laden der Treiber beim Booten sowohl für NVIDIA als auch für nvidia_uvm: nano /etc/udev/rules.d/70-nvidia.rules # /etc/udev/rules.d/70-nvidia.rules # Create /nvidia0, /dev/nvidia1 … and /nvidiactl when nvidia module is loaded KERNEL=="nvidia", RUN+="/bin/bash -c '/usr/bin/nvidia-smi -L && /bin/chmod 666 /dev/nvidia*'" # # Create the CUDA node when nvidia_uvm CUDA module is loaded KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/usr/bin/nvidia-modprobe -c0 -u && /bin/chmod 0666 /dev/nvidia-uvm*'" Installiere GitHub - NVIDIA/nvidia-persistenced: git clone https://github.com/NVIDIA/nvidia-persistenced.git cd nvidia-persistenced/init ./install.sh Checking for common requirements... sed found in PATH? Yes useradd found in PATH? Yes userdel found in PATH? Yes id found in PATH? Yes Common installation/uninstallation supported Creating sample System V script... done. Creating sample systemd service file... done. Creating sample Upstart service file... done. Checking for systemd requirements... /usr/lib/systemd/system directory exists? No /etc/systemd/system directory exists? Yes systemctl found in PATH? Yes systemd installation/uninstallation supported Installation parameters: User : nvidia-persistenced Group : nvidia-persistenced systemd service installation path : /etc/systemd/system Adding user 'nvidia-persistenced' to group 'nvidia-persistenced'... done. Installing sample systemd service nvidia-persistenced.service... done. Enabling nvidia-persistenced.service... done. Starting nvidia-persistenced.service... done. systemd service successfully installed. Prüfen, ob der Dienst läuft und aktiviert ist: systemctl status nvidia-persistenced # generated by nvidia-installer blacklist nouveau options nouveau modeset=0 root@pve:~# nano /etc/modules-load.d/modules.conf root@pve:~# nano /etc/udev/rules.d/70-nvidia.rules root@pve:~# systemctl status nvidia-persistenced ● nvidia-persistenced.service - NVIDIA Persistence Daemon Loaded: loaded (/lib/systemd/system/nvidia-persistenced.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2023-01-05 11:03:33 CET; 1h 47min ago Process: 1000 ExecStart=/usr/bin/nvidia-persistenced --user nvidia-persistenced (code=exited, status=0/SUCCESS) Main PID: 1005 (nvidia-persiste) Tasks: 1 (limit: 38358) Memory: 776.0K CPU: 292ms CGroup: /system.slice/nvidia-persistenced.service └─1005 /usr/bin/nvidia-persistenced --user nvidia-persistenced Jan 05 11:03:33 pve systemd[1]: Starting NVIDIA Persistence Daemon... Jan 05 11:03:33 pve nvidia-persistenced[1005]: Started (1005) Jan 05 11:03:33 pve systemd[1]: Started NVIDIA Persistence Daemon. Neustart und Überprüfung, ob alle NVIDIA-Geräte richtig angezeigt werden: reboot ls -l /dev/nv* crw-rw-rw- 1 root root 195, 0 Jan 5 11:03 /dev/nvidia0 crw-rw-rw- 1 root root 195, 255 Jan 5 11:03 /dev/nvidiactl crw-rw-rw- 1 root root 195, 254 Jan 5 11:03 /dev/nvidia-modeset crw-rw-rw- 1 root root 507, 0 Jan 5 11:03 /dev/nvidia-uvm crw-rw-rw- 1 root root 507, 1 Jan 5 11:03 /dev/nvidia-uvm-tools Patchen des NVIDIA Treibers, um die Beschränkung der maximalen Sitzungen zu entfernen: cd /opt/nvidia git clone https://github.com/keylase/nvidia-patch.git cd nvidia-patch ./patch.sh Detected nvidia driver version: Attention! Backup not found. Copy current libnvcuvid.so to backup. 751706615c652c4725d48c2e0aaf53be1d9553d5 /opt/nvidia/libnvidia-encode-backup/libnvcuvid.so. ee47ac207a3555adccad593dbcda47d8c93091c0 /usr/lib/x86_64-linux-gnu/libnvcuvid.so. Patched! Vorbereitung LXC-Container Erstelle in Proxmox einen neuen LXC oder bearbeite die Container-Config (in meinem Fall Container 105) und füge die LXC-Gruppe und Mounts am Ende der .conf-Datei hinzu: nano /etc/pve/lxc/105.conf lxc.cgroup2.devices.allow: c 195:* rwm lxc.cgroup2.devices.allow: c 507:* rwm lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file lxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file Die beiden obigen Gruppen (195 und 507) stammen aus der Ausgabe von ls -l /dev/nv* In manchen Fällen ändert sich die Gruppe für -uvm und -uvm-tools beim Neustart. Wenn du feststellst, dass das passiert, füge alle Gruppen, die du siehst, zur allow-Liste hinzu, um zu verhindern, dass du die .conf-Datei ständig ändern musst. Zum Beispiel: lxc.cgroup.devices.allow: c 195:* rwm lxc.cgroup.devices.allow: c 235:* rwm lxc.cgroup.devices.allow: c 511:* rwm Starte den LXC-Container und lade den gleichen NVIDIA-Treiber in den Container herunter: Führe die Installation aus. Das Installationsprogramm fragt, ob libglvnd installieren werden soll, weil die Installation unvollständig ist. Hier dann bitte: "Don’t install libglvnd". Alles andere wird mit "yes" beantwortet und Warnungen ignoriert. mkdir /opt/nvidia cd /opt/nvidia wget https://download.nvidia.com/XFree86/Linux-x86_64//NVIDIA-Linux-x86_64-.run chmod +x NVIDIA-Linux-x86_64-.run ./NVIDIA-Linux-x86_64-.run --no-kernel-module Führe nvidia-smi aus, um die Installation zu überprüfen. Prüfe auch, ob die richtigen NVIDIA-Geräte vorhanden sind: nvidia-smi +-----------------------------------------------------------------------------+ | NVIDIA-SMI 525.60.11 Driver Version: 525.60.11 CUDA Version: 12.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Quadro P400 Off | 00000000:05:00.0 Off | N/A | | 34% 32C P8 N/A / N/A | 1MiB / 2048MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+ ls -l /dev/nv* crw-rw-rw- 1 root root 195, 254 Jan 5 10:03 /dev/nvidia-modeset crw-rw-rw- 1 root root 507, 0 Jan 5 10:03 /dev/nvidia-uvm crw-rw-rw- 1 root root 507, 1 Jan 5 10:03 /dev/nvidia-uvm-tools crw-rw-rw- 1 root root 195, 0 Jan 5 10:03 /dev/nvidia0 crw-rw-rw- 1 root root 195, 255 Jan 5 10:03 /dev/nvidiactl Anpassung und Überprüfung in Jellyfin Logge dich in Jellyfin ein und aktiviere die Hardwarebeschleunigung Um zu überprüfen, ob der Medienserver einen Thread zur Hardwarebeschleunigung startet, muss man nvidia-smi auf dem Host aufrufen, nicht aus dem LXC-Container heraus. nvidia-smi +-----------------------------------------------------------------------------+ | NVIDIA-SMI 525.60.11 Driver Version: 525.60.11 CUDA Version: 12.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Quadro P400 On | 00000000:05:00.0 Off | N/A | | 34% 36C P0 N/A / N/A | 760MiB / 2048MiB | 86% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 49900 C ...ib/jellyfin-ffmpeg/ffmpeg 756MiB | +-----------------------------------------------------------------------------+