GPU-Server neu und WhisperX mit Hardwarebeschleunigung
Im vorherigen Beitrag habe ich WhisperX in einem kleinen LXC Container installiert. Dort wird nur mit dem Prozessor transkribiert und das ist relativ langsam mit nur halber bis ganzer “Echtzeitgeschwindigkeit”. Auf einer Nvidia Grafikkarte mit mindestens 8 GB Videospeicher sind auch zwanzigfache Geschwindigkeit und mehr drin.
Da ich mich irgendwie aus meinem GPU-Server ausgesperrt habe, werde ich heute Proxmox neu installieren. Ich wollte sowieso ein paar Sachen anpassen und ändern, insofern passt das auch nicht so schlecht.
Bei diesem Setup verwende ich meinen Eigenbau-PiKVM und einen alten Standrechner mit einer RTX 3060 (und noch zwei kleineren Grafikkarten, aber die sind mit jeweils 2GB VRAM nicht wirklich hilfreich).
Setup
Ich verwende zum ersten mal die ISO-Funktion PiKVM, sehr praktikabel!
Diesmal mit ZFS, aber nur mit einer Festplatte:
Netzwerkeinstellungen:
Bestätigen und schon wird installiert:
Die Weboberfläche des neuen Proxmox-Hosts:
Die wichtigen Schritte der Ersteinrichtung hier, deshalb geht es jetzt gleich mit der Einrichtung von Grafikunterstützung für unprivilegierte LXC Container weiter.
Grafiktreiber
Für dieses Setup muss der Nvidia Treiber direkt im Proxmox Host installiert werden. Das ist zwar ein Kompromiss, denn einen Hypervisor sollte man eigentlich nur VMs und Container verwalten lassen, aber hier mache ich gerne eine Ausnahme. Denn jetzt können verschiedene Container parallel auf die Grafikkarte zugreifen, also nicht nur eine einzige virtuelle Maschine.
Auf der Nvidia Seite muss man zuerst den richtigen Treiber runterladen, am besten im Suchfeld eingeben:
Dann bekommt man schon ein Ergebnis:
Auf “View” klicken…
… und dann Rechtsklick auf “Download” und Link Kopieren. Das kann man dann im Terminal mit wget
runterladen:
Mit ls -la
überprüfen, ob der Treiber ausführbar ist:
Ist er nicht, daher chmod
verwenden:
chmod 744 NVIDIA-Linux-x86_64-<version>.run
Das zusätzliche x
für executable zeigt an, dass die Datei nun ausführbar ist:
Und dann ausführen mit:
./NVIDIA-Linux-x86_64-<version>.run --dkms
Wir müssen also auch die folgenden Pakete installieren:
apt install build-essential gcc -y
Und jetzt ist der Nouveau im Weg:
Ich weiß nicht, ob es eine gute Idee ist, das den Installer machen zu lassen…
… aber schauen wir einmal was dabei rauskommt:
Ist recht…
… und wir probieren’s gleich einmal:
Jetzt soll man ins Log schauen:
Das ist das sagenumwobene Log:
installer version: 570.133.07
PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
nvidia-installer command line:
./nvidia-installer
Using: nvidia-installer ncurses v6 user interface
-> Detected 4 CPUs online; setting concurrency level to 4.
-> Scanning the initramfs with lsinitramfs...
-> Executing: /usr/bin/lsinitramfs -l /boot/initrd.img-6.8.12-9-pve
-> Installing NVIDIA driver version 570.133.07.
-> Performing CC sanity check with CC="/usr/bin/cc".
-> Performing CC check.
-> Initramfs scan complete.
WARNING: The Nouveau kernel driver is currently in use by your system. This driver is incompatible with the NVIDIA driver, and must be disabled before proceeding.
-> Nouveau can usually be disabled by adding files to the modprobe configuration directories and rebuilding the initramfs.
Would you like nvidia-installer to attempt to create these modprobe configuration files for you? (Answer: Yes)
-> One or more modprobe configuration files to disable Nouveau have been written. You will need to reboot your system and possibly rebuild the initramfs before these changes can take effect. Note if you later wish to reenable Nouveau, you will need to delete these files: /usr/lib/modprobe.d/nvidia-installer-disable-nouveau.conf, /etc/modprobe.d/nvidia-installer-disable-nouveau.conf
-> nvidia-installer is not able to perform some of the sanity checks which detect potential installation problems while Nouveau is loaded. Would you like to continue installation without these sanity checks, or abort installation, confirm that Nouveau has been properly disabled, and attempt installation again later? (Answer: Continue installation)
-> Proceeding with installation despite the presence of Nouveau. Kernel module load tests will be skipped.
ERROR: Unable to find the kernel source tree for the currently running kernel. Please make sure you have installed the kernel source files for your kernel and that they are properly configured; on Red Hat Linux systems, for example, be sure you have the 'kernel-source' or 'kernel-devel' RPM installed. If you know the correct kernel source files are installed, you may specify the kernel source path with the '--kernel-source-path' command line option.
ERROR: Installation has failed. Please see the file '/var/log/nvidia-installer.log' for details. You may find suggestions on fixing installation problems in the README available on the Linux driver download page at www.nvidia.com.
Das war sinnlos. Aber starten wir den Rechner einmal neu. Dann überprüfen, ob der andere Treiber weg ist:
lsmod | grep nouveau
Wenn man nichts zurück bekommt, läuft der Treiber nicht mehr.
Wenn er noch da wäre kann man mit dem folgenden Befehl manuell den Treiber auf die schwarze Liste setzen, initramfs
aktualisieren und neustarten:
echo -e "blacklist nouveau\noptions nouveau modeset=0" > /etc/modprobe.d/blacklist-nouveau.conf
update-initramfs -u
reboot
Um die Kernel Header Probleme zu beheben das ausführen:
apt update && apt install pve-headers
Jetzt sieht die Sache etwas vielversprechender aus…
… aber schon kommen die nächsten Probleme:
WARNING: nvidia-installer was forced to guess the X library path '/usr/lib' and X module path '/usr/lib/xorg/modules'; these paths were not queryable from the system. If X fails to find the NVIDIA X driver module, please install the `pkg-config` utility and the X.Org SDK/development package for your distribution and reinstall the driver.
Und:
WARNING: Unable to find a suitable destination to install 32-bit compatibility libraries. Your system may not be set up for 32-bit compatibility. 32-bit compatibility files will not be installed; if you wish to install them, re-run the installation and set a valid directory with the --compat32-libdir option.
Kurioserweise bricht die Installation nicht ab…
… und kommt gleich noch mit einer verwirrenden Frage:
Would you like to run the nvidia-xconfig utility to automatically update your X configuration file so that the NVIDIA X drive will be used when you restart X? Any pre-existing X configuration file will be backed up.
Und es hat … funktioniert?
Zumindest laut nvidia-smi
scheint es zu gehen:
Es hat endlich funktioniert, aber bei jedem Kernel Update müssen auch die die besagten Module neu geladen werden. Das ist jedoch etwas für die Zukunft.
SSH Zugang mit Schlüsseldatei sichern
Um sich ein wenig von dieser Achterbahnfahrt der dependencies zu erholen, kommt jetzt etwas Einfacheres: Ein sicherer SSH-Zugang.
Im Proxmox Host unter /root/.ssh/authorized_keys
den Public Key des SSH-Schlüsselpaares hinzufügen. Hier die benötigten Befehle.
Da ich schon vorher mit der gleichen IP-Adresse operiert habe, schreit nun mein Laptop auf, als ich mich mit SSH zu verbinden versuchte:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:xxx
Please contact your system administrator.
Add correct host key in /home/mf/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /home/mf/.ssh/known_hosts:133
Host key for 192.168.0.xxx has changed and you have requested strict checking.
Host key verification failed.
Mit diesem Befehl löscht man den Eintrag mit einer bestimmten IP-Adresse wieder raus:
ssh-keygen -R 192.168.0.xxx
Und nun sollte es gehen!
Grafikkartestatus überprüfen mit nvtop
Als erstes einmal ein paar nützliche Werkzeuge installieren, wie nvtop
:
apt install nvtop
Damit bekommt man einen sehr guten Überblick über die Auslastung der Grafikkarte(n):
Anmerkung: die Intel iGPU scheint nicht zu funktionieren. Ich glaube da müsste ich ein paar Intel-Pakete installieren. Aber das brauche ich jetzt nicht.
LXC Container erstellen
Zuerst ein entsprechendes Template runterladen, wie Ubuntu 24.04:
Es sollte auch mit anderen gehen (interessant wäre hier das schlanke Alpine Linux), aber bei Ubuntu ist üblicherweise die Softwareunterstützung am besten.
Also LXC erstellen:
Template auswählen:
32 GB sollten einmal ausreichen. Man kann die Zuweisung eh jederzeit vergrößern:
Alle vier Kerne:
Und 8 GB RAM (und kein Swap, weil ich bei ZFS keinen Swap habe und es auch nicht zusammengebracht habe Swap einzurichten):
Netzwerk einrichten:
LXC Container Zugriff auf GPU gewähren
Für den nächsten Schritt empfiehlt sich diese Anleitung.
Mit diesem Befehl die notwendigen Pfade ausfindig machen:
ls -al /dev/nvidia*
crw-rw-rw- 1 root root 195, 0 Mar 30 22:22 /dev/nvidia0
crw-rw-rw- 1 root root 195, 1 Mar 30 22:22 /dev/nvidia1
crw-rw-rw- 1 root root 195, 255 Mar 30 22:22 /dev/nvidiactl
crw-rw-rw- 1 root root 508, 0 Mar 30 22:22 /dev/nvidia-uvm
crw-rw-rw- 1 root root 508, 1 Mar 30 22:22 /dev/nvidia-uvm-tools
/dev/nvidia-caps:
total 0
drwxr-xr-x 2 root root 80 Mar 30 22:22 .
drwxr-xr-x 19 root root 4660 Mar 30 22:22 ..
cr-------- 1 root root 511, 1 Mar 30 22:22 nvidia-cap1
cr--r--r-- 1 root root 511, 2 Mar 30 22:22 nvidia-cap2
Ich schätze nvidia0
ist die RTX 3060 und nvidia1
die GTX 1050. Dann können wir die Konfigurationsdatei vom Container anpassen mit nano /etc/pve/lxc/<ct-id>.conf
und dort die folgenden Zeilen einfügen:
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 508:* 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-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
Das sollte dem Container Zugang zur RTX 3060 geben.
Jetzt Container starten und Updates installieren:
apt update && apt upgrade
Jetzt wiederholt sich das Spiel von vorher – und hoffentlich geht es ein bisserl weniger holprig – wir installieren den Nvidia-Treiber auch im Container. Ja, der muss zweimal installiert werden. Aber zumindest muss er nicht zweimal runtergeladen werden. Mit diesem gerade gelernten Befehl schiebt man den Installer in den Container:
pct push <ctid> NVIDIA-Linux-x86_64-<version>.run /root/NVIDIA-Linux-x86_64-<version>.run
Und schon lungert der Treiber im Container herum:
Noch einmal chmod
-en vor dem Ausführen:
chmod +x NVIDIA-Linux-x86_64-<version>.run
Im Container können wir uns zumindest die Kernel-Module sparen:
./NVIDIA-Linux-x86_64-<version>.run --no-kernel-module
Keine Kernel-Module…
WARNING: You specified the '--no-kernel-modules' command line option, nvidia-installer will not install any kernel modules as part of this driver installation, and it will not remove existing NVIDIA kernel modules not part of an earlier NVIDIA driver installation. Please ensure that NVIDIA kernel modules matching this driver version are installed separately.
Noch eine bereits bekannte Warnung:
32-bit kompatible Librarier installieren? Das wurde bei der Host-Treiberinstallation nicht gefragt. Keine Ahnung:
Was sagt der Chatbot dazu?
Also eigentlich braucht es die nicht, aber Schaden sollte es auch keinen anrichten, oder?
Naja, vielleicht lassen wir die zur Zeit noch sein. Warum ist ChatGPT eigentlich seit einiger Zeit so scharf auf sinnlose Emojis? Lenkt eher vom Inhalt ab in dem Fall und wird auch nicht den Inhalt unterstreichend. 🚀
Weiter geht’s:
WARNING: This NVIDIA driver package includes Vulkan components, but no Vulkan ICD loader was detected on this system. The NVIDIA Vulkan ICD will not function without the loader. Most distributions package the Vulkan loader; try installing the "vulkan-loader", "vulkan-icd-loader", or "libvulkan1" package.
Herr Chatbot?
Danke, aber schon wieder diese blöde Rakete.
Endlich wird installiert:
Und auch hier bestätigen wir wieder mit ja:
Endlich:
Und die Grafikkarte wird angezeigt:
Stop! Zuerst Snapshot und Template einrichten
Jetzt ist man natürlich geneigt sofort diverse Progrämmchen zu installieren und zu schauen, ob alles funktioniert. Das ist aber ein Fehler. Wir machen jetzt zuerst einen Snapshot, um schnell und einfach wieder auf diesen funktionalen Stand zurückkehren zu können. Zusätzlich erstellen wir auch gleich ein Template aus diesem Container. Damit kann man exakt dieses Setup per Knopfdruck einfach klonen und spart sich doch einiges an Arbeit.
Update: Man muss zuerst ein Template erstellen, dann einen Snapshot einrichten, sonst geht es nicht.
Snapshots gehen denkbar einfach, man klickt auf “Snapshot” wenn der Container ausgewählt ist und klickt dann auf “Take Snapshot” und vergibt einen sinnvollen Namen (wie “post-nvidia-treiber-pre-install”):
So sieht das aus:
Wenn etwas schief geht, kann man einfach zu diesem Zustand zurückkehren. Ich empfehle auch nach der Installation von WhisperX und wenn man verifiziert hat, dass es funktioniert, noch einen weiteren Snapshot anzulegen. Das gibt maximale Flexibilität.
Als nächstes wollen wir ein Template aus dem Container erstellen. Den Container zuerst runterfahren und dann “Convert to template” anklicken und bestätigen:
Oje, genau verkehrt herum gemacht:
Also Snapshot löschen, Template erstellen, Container daraus erstellen/klonen und diesen dann Snapshotten.
Rechtsklick auf nunmehriges Template und auf “Clone” klicken:
Was ich nicht bedacht habe, bzw. wieder vergessen habe, ist, dass jetzt ja die Container ID (hier 321) belegt ist. Naja, das war nur halb durchdacht. Aber vielleicht kann ich da eine kleine Rochade machen:
Diesen Container wandle ich sogleich in ein neues Template um, sichere aber den Ursprungscontainer noch ganz wo anders hin, nicht, dass das dann nicht geht:
Und löschen:
Bestätigen:
Jetzt können wir unseren Container wieder mit der richtigen ID erstellen bzw. klonen:
So und jetzt noch einmal einen Snapshot erstellen:
WhisperX mit GPU Unterstützung installieren
Diese Installation ist der “CPU only” Variante sehr ähnlich, daher verweise ich auch auf den Beitrag für die Details.
Sobald man die venv
erstellt hat muss man nur mehr den folgenden Befehl ausführen:
pip install whisperx
Und fast schon klassischer Test mit Beispielvideo:
Oje, es at sich nur kurz was getan:
Und diesen Fehler ausgeworfen:
No language specified, language will be first be detected for each audio file (increases inference time).
Lightning automatically upgraded your loaded checkpoint from v1.5.4 to v2.5.1. To apply the upgrade to your files permanently, run `python -m pytorch_lightning.utilities.upgrade_checkpoint venv/lib/python3.12/site-packages/whisperx/assets/pytorch_model.bin`
Model was trained with pyannote.audio 0.0.1, yours is 3.3.2. Bad things might happen unless you revert pyannote.audio to 0.x.
Model was trained with torch 1.10.0+cu102, yours is 2.6.0+cu124. Bad things might happen unless you revert torch to 1.x.
>>Performing transcription...
/home/whisperxuser/whisperx/venv/lib/python3.12/site-packages/pyannote/audio/utils/reproducibility.py:74: ReproducibilityWarning: TensorFloat-32 (TF32) has been disabled as it might lead to reproducibility issues and lower accuracy.
It can be re-enabled by calling
>>> import torch
>>> torch.backends.cuda.matmul.allow_tf32 = True
>>> torch.backends.cudnn.allow_tf32 = True
See https://github.com/pyannote/pyannote-audio/issues/1370 for more details.
warnings.warn(
Warning: audio is shorter than 30s, language detection may be inaccurate.
Could not load library libcudnn_ops_infer.so.8. Error: libcudnn_ops_infer.so.8: cannot open shared object file: No such file or directory
Aborted
Es fehlt wohl das libcudnn
Paket, also installieren (wieder als root
User im Container) das nvidia-cuda-toolkit
…
apt install nvidia-cuda-toolkit
auch wenn das fast schon weh tut mit über 2 GB an Speicherplatzbedarf:
Und geholfen hat es leider auch nicht. Hier ist eine Diskussion, wo es genau zu diesem Problem gekommen ist und es wird empfohlen Cuda Version 11.8 zu installieren. Ich glaube ich werde mir das später noch einmal ansehen und in Teil 2 fertig einrichten.