Skip to main content

HW-Acceleration 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/<version>/NVIDIA-Linux-x86_64-<version>.run
chmod +x NVIDIA-Linux-x86_64-<version>.run
./NVIDIA-Linux-x86_64-<version>.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-<version>.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: <version>
Attention! Backup not found. Copy current libnvcuvid.so to backup.
751706615c652c4725d48c2e0aaf53be1d9553d5  /opt/nvidia/libnvidia-encode-backup/libnvcuvid.so.<version>
ee47ac207a3555adccad593dbcda47d8c93091c0  /usr/lib/x86_64-linux-gnu/libnvcuvid.so.<version>
Patched!

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/<version>/NVIDIA-Linux-x86_64-<version>.run
chmod +x NVIDIA-Linux-x86_64-<version>.run
./NVIDIA-Linux-x86_64-<version>.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

Logge dich in Jellyfin / Plex 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 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 |
+-----------------------------------------------------------------------------+