GPU passthru w Proxmoxie dla OpenCL, uff
Przetłumaczone automatycznie z angielskiego. Przeczytaj oryginał
Możesz włożyć swoje #GPU do serwera z #Proxmox i przekazać moc obliczeniową do maszyn wirtualnych… na wypadek, gdybyś chciał uruchamiać swoje rzeczy AI/ML obok zwirtualizowanego NAS-a 😀
W końcu mi się udało. Tak mi się wydaje. Ta instalacja Proxmoxa jest prosta, to tylko pojedynczy węzeł do eksperymentów, co stanowi połowę sprawy. Drugą częścią jest konfiguracja VM. Możesz zapytać, do czego właściwie potrzebuję GPU w maszynie wirtualnej? Może się przydać, ponieważ sprzęt jest w stanie obsłużyć kilka dodatkowych GPU i mogę używać ich wszystkich jednocześnie w różnych konfiguracjach, a nawet w różnych systemach operacyjnych. Tak jak robi się to w środowiskach chmurowych – ta konfiguracja naśladuje coś takiego, uruchamiając komputer klasy serwerowej z GPU klasy centrum danych na pokładzie. Podczas tego testu użyłem NVIDIA GTX 650 Ti, która jest kartą konsumencką, ale skoro potwierdziłem, że działa, to włożę tam inne swoje karty, takie jak NVIDIA Tesla K20xm czy FX 5800, z dużo większą liczbą shaderów/rdzeni, które można wykorzystać w aplikacjach OpenCL dla AI/ML. I zobaczysz, jak łatwo przekroczyć maksymalną temperaturę GPU.
Spis treści #
Konfiguracja Proxmoxa #
GRUB #
Pierwszą rzeczą do zmodyfikowania są opcje GRUB-a. A więc:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on initcall_blacklist=sysfb_init video=efifb:off video=vesa:off video=simplefb:off kvm.ignore_msrs=1 vfio_iommu_type1.allow_unsafe_interrupts=1 modprobe.blacklist=radeon,nouveau,nvidia,nvidiafb,nvidia-gpu vfio-pci.ids=10de:11c6,10de:0e0b"Mam Intel Xeon E5645, więc w moich opcjach umieściłem intel_iommu. Jeśli masz AMD lub coś innego, trzeba to dostosować. Jeśli chodzi o blacklistowanie modułów, wolę zostawić je wszystkie, bo możesz chcieć włożyć do swojej konfiguracji różne karty. Bez tego Debian (na którym działa Proxmox) spróbuje załadować moduły/sterowniki i przełączy czarny ekran konsoli na wyższą rozdzielczość. Jeśli zablokujesz te moduły, otrzymasz obraz w niskiej rozdzielczości. To właśnie powinieneś w tym momencie zobaczyć. Całkowicie zmienną częścią jest vfio-pci.ids (które można uzyskać poleceniem lspci). Pierwszy identyfikator dotyczy karty graficznej, a drugi urządzenia audio. Dodałem oba, choć na pewno będę używał tylko pierwszego.
Pozostałe konfiguracje #
Druga rzecz do zmodyfikowania:
root@lab:~# cat /etc/modprobe.d/blacklist.conf
blacklist nouveau
blacklist nvidiaTrzecia:
root@lab:~# cat /etc/modprobe.d/iommu_unsafe_interrupts.conf
options vfio_iommu_type1 allow_unsafe_interrupts=1Wygląda na to, że ta jest zbędna, bo pojawia się również w opcjach GRUB-a.
Czwarta zmiana:
root@lab:~# cat /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:11c6,10de:0e0b disable_vga=1Tu tak samo – myślę, że można to mieć albo tutaj, albo w sekcji GRUB-a.
Następnie lista modułów, które powinny być włączone:
root@lab:~# cat /etc/modules
# /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.
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfdKolejną rzeczą jest zastosowanie opcji GRUB-a za pomocą jednego z tych poleceń:
update-grub
proxmox-boot-tool refreshJestem trochę zdezorientowany, bo oficjalna dokumentacja (dostępna tutaj) mówi, że należy wykonać pierwsze, ale uruchomienie tego polecenia informuje nas, że zamiast tego powinniśmy uruchomić drugie.
Aby sprawdzić, czy wszystkie powyższe zmiany w ogóle coś zmieniły, zrestartuj system, a następnie:
dmesg | grep -e DMAR -e IOMMUJeśli widzisz komunikat „IOMMU enabled”, możesz iść dalej, w przeciwnym razie trzeba zastosować inną konfigurację. W moim przypadku pojawił się problem z komunikatem, że mój chipset Intela jest niestabilny z remapowaniem IOMMU, więc ta funkcja zostanie wyłączona. Stąd, jak sądzę, potrzeba opcji „allow_unsafe_interrupts”. Aby sprawdzić, czy masz działające grupy IOMMU:
find /sys/kernel/iommu_groups/ -type lPowinieneś zobaczyć tu jakieś wpisy.
Maszyna wirtualna #
Tym razem wypróbowałem 3 konfiguracje VM z Ubuntu 20 LTS Desktop. Są dwa główne czynniki, które należy wziąć pod uwagę. Różne warianty mogą działać, ale nie jest to w pełni przewidywalne, gdy w grę wchodzi wiele czynników.
Q35 & UEFI #
Pierwszy to użycie Q35 zamiast i440fx. W ten sposób powinieneś móc korzystać z PCI-E. Próbowałem na i440fx i GPU jest widoczne, ale niedostępne. Proces weryfikacji obejmuje:
- clinfo pokazujący dodatnią liczbę platform
- nvidia-smi pokazujący listę procesów używających dedykowanego GPU
- stronę „O systemie” w Ubuntu informującą, że używamy konkretnego sterownika NVIDIA (choć to kwestia dyskusyjna…)
Druga rzecz to użycie UEFI zamiast domyślnego BIOS-u, ale wymaga to sprawdzenia, czy Twoje GPU faktycznie obsługuje UEFI. Wypróbowałem więc Q35 i UEFI i ta kombinacja pozwala, żeby to wszystko jakoś działało. Jeśli chodzi o UEFI, wyłączyłem secure boot w UEFI/BIOS-ie maszyny wirtualnej.

Co do sterownika (w moim przypadku NVIDIA), używam nvidia-driver-470-server, ale inne też wydają się działać. Dziwne, że strona „O systemie” w Ubuntu pokazuje llvmpipe zamiast tego sterownika, ale strona sterowników mówi, że system używa sterownika NVIDIA. Nie jestem pewien, kto ma tu rację.

Lista sterowników:

Resetowanie urządzenia #
Ostatnią rzeczą, która uniemożliwia działanie tej konfiguracji, jest „usunięcie” urządzeń podczas startu (/root/fix_gpu_pass.sh):
#!/bin/bash
echo 1 > /sys/bus/pci/devices/ID/remove
echo 1 > /sys/bus/pci/rescanGdzie ID to identyfikator urządzenia PCI-E na poziomie VM, który można sprawdzić poleceniem lspci -n. Dodaj go do crontaba na czas restartu (crontab -e):
@reboot /root/fix_gpu_pass.shWeryfikacja OpenCL #
Jeśli więc widzisz konsolę VNC w Proxmoxie, Twoja VM się uruchamia i możesz się zalogować, możesz zainstalować sterownik, a lspci/nvidia-smi/clinfo pokazują poprawne wartości, to nadszedł czas na wielki, ostatni test, czyli sklonowanie repozytorium Git z moim kodem i próbę jego uruchomienia.
cd ~/Documents
git clone https://github.com/michalasobczak/publications/tree/master/simple-hpcNastępnie zainstaluj openjdk-19 i utwórz konfigurację Application dla modułu aiml, z modułem opencl w classpath. Może być też konieczne przebudowanie modułu opencl. Ostatecznie, jeśli widzisz tutaj platformy, to jesteś we właściwym miejscu.

Mam NVIDIA GeForce GTX 650 Ti umieszczoną w moim HP z800 jako drugie GPU, system poprawnie ją rozpoznaje, a kod działa dobrze. Jeśli chodzi o wydajność, powiedziałbym, że wydaje się w porządku. Szybko porównałem NVS 4200M z tą kartą:
- NVS 4200M (profil konfiguracji CL2.0): 30 – 40 ms
- GTX 650 Ti (profil konfiguracji CL3.0): 4 – 5 ms
Jest jeden haczyk dotyczący diagnostyki, bo nvidia-smi nie pokazuje wykorzystania GPU ani listy procesów, ale pokazuje zużycie pamięci. Zwiększanie rozmiaru zmiennych lokalnych (tablic) bezpośrednio przekłada się na wzrost wykorzystania pamięci, dlatego zakładam, że to wciąż jakoś działa! Może nawet nie tak źle.
Przegrzewanie Tesli K20xm #
Jak wspomniałem wcześniej, po udanej konfiguracji z konsumenckim GPU nadszedł czas, by spróbować karty klasy centrum danych. Mam Teslę K20xm, która jest dość wydajna nawet jak na dzisiejsze standardy. Ma mnóstwo pamięci (6GB) i masę rdzeni (2688), nawet więcej niż mój RTX 3050 Ti (2560). Oczywiście jako sprzęt poprzedniej generacji będzie mniej wydajna energetycznie i będzie pobierać więcej prądu. I tu właśnie jest problem. To GPU może pobierać do 235W. Mam zasilacz o mocy ponad 1000W, ale istnieje pewne ograniczenie mocy wyjściowej PCI-E gen 2. Maksimum, jakie widziałem na tym GPU podczas testów passthru, to 135W. Po kilku minutach temperatura rośnie z 70 do 100 stopni Celsjusza, co powoduje, że system je wyłącza… uruchomienie nvidia-smi daje mi taki komunikat błędu, uprzejmie prosząc o restart:

No i proszę, zupełnie zapomniałem, że to GPU należy do porządnej obudowy serwerowej z ekstremalnie głośnymi wentylatorami, których w HP z800 w obszarze PCI-e po prostu brakuje. Ten komputer ma mnóstwo różnych wentylatorów, nawet na modułach pamięci, ale ten obszar nie jest w ogóle chłodzony. Po restarcie komputera GPU wraca do życia. Poza samym problemem z temperaturą, po przekroczeniu mniej więcej 90 stopni następuje spadek wydajności – zwalnia kilkukrotnie, a w okolicach 100 stopni całkowicie się wyłącza.
Dalsza lektura & rozwiązywanie problemów #
- https://pve.proxmox.com/wiki/Pci_passthrough
- https://forum.proxmox.com/threads/gpu-passthrough-to-vm-everything-seems-working-but-it-doesnt.107881/
- https://theorangeone.net/posts/lxc-nvidia-gpu-passthrough/
- https://forum.proxmox.com/threads/problem-with-gpu-passthrough.55918/
- https://forum.proxmox.com/threads/vga-passthrough-error-device-does-not-support-requested-feature-x-vga.35727/