Post

Accélération matérielle GPU Passthrough sous Proxmox

Proxmox Virtual Environment (Proxmox VE) est une plateforme de virtualisation open source qui combine deux technologies de virtualisation majeures : la virtualisation KVM (Kernel-based Virtual Machine) et les conteneurs basés sur LXC (Linux Containers). Elle offre une solution robuste et flexible pour la gestion de machines virtuelles (VMs) et de conteneurs Linux.

L’un des aspects les plus excitants de Proxmox est sa capacité à offrir l’accélération matérielle GPU Passthrough, une fonctionnalité puissante qui permet aux VMs de tirer parti des capacités graphiques de la carte graphique d’un hôte, améliorant ainsi les performances des applications gourmandes en graphiques.

Préambule

Ici, je considère les points suivants comme étant présent :

  • Proxmox PVE version 8 (minimum)
  • VM Debian 12
  • GPU Nvidia

Qu’est-ce que c’est

L’accélération matérielle GPU Passthrough est une technique qui permet à une machine virtuelle d’accéder directement à une carte graphique physique, contournant ainsi la virtualisation de la carte graphique. Cela signifie que la VM peut utiliser les ressources graphiques de la carte graphique comme si elle était exécutée sur un matériel physique.

Cette approche améliore considérablement les performances des applications nécessitant des capacités graphiques, telles que les jeux, la modélisation 3D, la CAO (Conception Assistée par Ordinateur), la VR (Réalité Virtuelle), et d’autres charges de travail intensives en graphiques.

Dans le contexte de Proxmox, l’accélération matérielle GPU Passthrough est particulièrement utile pour les utilisateurs qui souhaitent exécuter des VMs avec des besoins graphiques élevés. Cela peut inclure des développeurs de jeux, des concepteurs graphiques, des professionnels de la vidéo, et bien d’autres.

Prérequis

Voici une liste d’exigences de base adaptée du wiki Arch :

  • Configuration requise pour le processeur : Votre processeur doit supporter la virtualisation matérielle et l’IOMMU. La plupart des nouveaux processeurs supportent cela.

  • Exigences relatives à la carte mère : Votre carte mère doit supporter IOMMU. Des listes peuvent être trouvées sur le wiki Xen et sur Wikipedia. Notez que ces deux listes sont incomplètes et très obsolètes, et que la plupart des cartes mères récentes supportent l’IOMMU.

  • Exigences en matière de GPU : La ROM de votre GPU ne doit pas nécessairement supporter l’UEFI, mais la plupart des GPU modernes le font. Si la ROM de votre GPU supporte l’UEFI, il est recommandé d’utiliser OVMF (UEFI) au lieu de SeaBIOS. Pour une liste de GPU ROMs, voir la collection de GPU ROMs de Techpowerup.

Vérifications

Source : Proxmox

Vérifier que l’IOMMU est activé

Redémarrez, puis exécutez (en root) :

1
dmesg | grep -e DMAR -e IOMMU

Il devrait y avoir une ligne qui ressemble à DMAR : IOMMU enabled. S’il n’y a pas de résultat, c’est que quelque chose ne va pas.

Vérifier que le remappage des interruptions de l’IOMMU est activé

Il n’est pas possible d’utiliser PCI passthrough sans remappage d’interruption. L’affectation de périphérique échouera avec ‘Failed to assign device “[device name]” : Operation not permitted ou Interrupt Remapping hardware not found, passing devices to unprivileged domains is insecure.

Tous les systèmes utilisant un processeur et un chipset Intel qui prennent en charge la technologie de virtualisation Intel pour Directed I/O (VT-d), mais qui ne prennent pas en charge le remappage d’interruptions, verront ce type d’erreur.

La prise en charge du remappage d’interruptions est assurée par les processeurs et les jeux de puces les plus récents (AMD et Intel).

Pour savoir si votre système prend en charge le remappage d’interruptions, procédez comme suit :

1
dmesg | grep 'remapping'

Si l’une des lignes suivantes s’affiche :

  • AMD-Vi: Interrupt remapping enabled
  • DMAR-IR: Enabled IRQ remapping in x2apic mode (‘x2apic’ can be different on old CPUs, but should still work)

alors le remappage est pris en charge.

Si votre système ne supporte pas le remappage des interruptions, vous pouvez autoriser les interruptions non sûres avec :

1
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf

Vérifier l’isolation de l’IOMMU

Pour que le PCI passthrough fonctionne, vous avez besoin d’un groupe IOMMU dédié pour tous les périphériques PCI que vous souhaitez affecter à une VM.

Lors de l’exécution d’un

1
pvesh get /nodes/{nodename}/hardware/pci --pci-class-blacklist ""

en remplaçant {nodename} par le nom de votre nœud.

Vous devriez obtenir une liste similaire à :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌──────────┬────────┬──────────────┬────────────┬────────┬───────────────────────────────────────────────────────────────────┬...
│ class    │ device │ id           │ iommugroup │ vendor │ device_name                                                       │
╞══════════╪════════╪══════════════╪════════════╪════════╪═══════════════════════════════════════════════════════════════════╪
│ 0x010601 │ 0xa282 │ 0000:00:17.0 │          5 │ 0x8086 │ 200 Series PCH SATA controller [AHCI mode]                        │
├──────────┼────────┼──────────────┼────────────┼────────┼───────────────────────────────────────────────────────────────────┼
│ 0x010802 │ 0xa808 │ 0000:02:00.0 │         12 │ 0x144d │ NVMe SSD Controller SM981/PM981/PM983                             │
├──────────┼────────┼──────────────┼────────────┼────────┼───────────────────────────────────────────────────────────────────┼
│ 0x020000 │ 0x15b8 │ 0000:00:1f.6 │         11 │ 0x8086 │ Ethernet Connection (2) I219-V                                    │
├──────────┼────────┼──────────────┼────────────┼────────┼───────────────────────────────────────────────────────────────────┼
│ 0x030000 │ 0x5912 │ 0000:00:02.0 │          2 │ 0x8086 │ HD Graphics 630                                                   │
├──────────┼────────┼──────────────┼────────────┼────────┼───────────────────────────────────────────────────────────────────┼
│ 0x030000 │ 0x1d01 │ 0000:01:00.0 │          1 │ 0x10de │ GP108 [GeForce GT 1030]                                           │
├──────────┼────────┼──────────────┼────────────┼────────┼───────────────────────────────────────────────────────────────────┼
.
.
.

Pour disposer de groupes IOMMU distincts, votre processeur doit prendre en charge une fonction appelée ACS (Access Control Services). Assurez-vous d’activer le paramètre correspondant dans votre BIOS.

Si vous n’avez pas de groupes IOMMU dédiés, vous pouvez essayer de déplacer la carte vers un autre emplacement PCI.

Si cela ne fonctionne pas, vous pouvez essayer d’utiliser le patch ACS override d’Alex Williamson. Cependant, cette solution doit être considérée comme une dernière option et n’est pas sans risque.

A ce jour, le patch ACS fait partie du noyau Proxmox VE et peut être invoqué via l’édition de la ligne de commande du noyau.

Ajouter :

1
pcie_acs_override=downstream

aux options de la ligne de commande de démarrage du noyau (grub ou systemd-boot).

Pour plus d’informations, consultez le blog d’Alex Williamson.

Mise en oeuvre

La mise en œuvre de l’accélération matérielle GPU Passthrough sous Proxmox nécessite quelques étapes clés :

  • Matériel compatible : Tout d’abord, vous aurez besoin d’une carte graphique compatible avec la virtualisation GPU Passthrough. Les cartes graphiques NVIDIA et AMD récentes sont généralement bien prises en charge. Assurez-vous que votre matériel est compatible avec IOMMU (Input-Output Memory Management Unit) pour permettre l’attribution directe des périphériques.

  • Configuration BIOS/UEFI : Accédez au BIOS ou à l’UEFI de votre serveur et assurez-vous que la virtualisation des extensions matérielles, telles que VT-d (Virtualization Technology for Directed I/O) pour les processeurs Intel ou AMD-Vi pour les processeurs AMD, est activée.

  • Configuration de Proxmox : Installez et configurez Proxmox VE sur votre serveur, en veillant à ce que votre matériel GPU soit reconnu et correctement configuré.

  • Configuration de la machine virtuelle : Créez une nouvelle machine virtuelle ou modifiez une existante. Dans les paramètres de la machine virtuelle, vous devrez spécifier le GPU physique que vous souhaitez affecter à la VM. Cela se fait en utilisant le matériel PCIe Passthrough dans la configuration de la VM.

  • Installation du pilote : Dans la VM, installez le pilote approprié pour la carte graphique. Cela peut être un pilote NVIDIA, AMD ou un autre pilote compatible avec votre matériel.

  • Configuration de l’application : Enfin, configurez l’application ou le logiciel que vous souhaitez exécuter dans la VM pour utiliser le GPU. Vous devrez peut-être apporter des modifications de configuration spécifiques à l’application pour lui permettre de tirer parti de l’accélération GPU.

Avantages

L’accélération matérielle GPU Passthrough sous Proxmox offre de nombreux avantages, notamment :

  • Performances améliorées : Les applications gourmandes en graphiques fonctionnent beaucoup plus rapidement dans une VM avec accès direct au GPU.

  • Isolation des ressources : Chaque VM peut avoir sa propre carte graphique dédiée, garantissant une isolation complète des ressources.

  • Flexibilité : Vous pouvez utiliser des cartes graphiques haut de gamme pour exécuter plusieurs VMs avec des besoins graphiques différents.

  • Consolidation des ressources : Avec l’accélération GPU Passthrough, vous pouvez consolider plusieurs charges de travail graphiques sur un seul serveur physique.

Limitations

Cependant, il est important de noter que l’accélération matérielle GPU Passthrough peut être complexe à mettre en place et nécessite un matériel compatible. De plus, les cartes graphiques professionnelles (par exemple, les cartes NVIDIA Quadro) peuvent nécessiter des étapes de configuration plus avancées en raison de leurs pilotes spécifiques.

De plus, il y a des limitations en termes de compatibilité logicielle, car tous les systèmes d’exploitation invités et toutes les applications ne prennent pas en charge l’accélération GPU Passthrough. Par conséquent, il est essentiel de faire des recherches approfondies sur la compatibilité avant de mettre en œuvre cette fonctionnalité.

GPU passthrough

A lire attentivement : https://pve.proxmox.com/wiki/ PCI_Passthrough#GPU_passthrough

Pour commencer, il est souvent utile que l’hôte n’essaie pas d’utiliser le GPU, ce qui permet d’éviter les problèmes liés au découplage et au recouplage du pilote de l’hôte avec le périphérique. Il est parfois utile de s’assurer que les messages POST du BIOS hôte s’affichent sur un autre GPU.

Cela peut parfois être réalisé via les paramètres du BIOS, en déplaçant la carte dans un autre emplacement ou en activant/désactivant la prise en charge de l’amorçage hérité.

Blacklist des pilotes

Voici une liste des pilotes les plus courants et de la manière de les mettre sur liste noire :

  • AMD GPUs
1
2
echo "blacklist amdgpu" >> /etc/modprobe.d/blacklist.conf
echo "blacklist radeon" >> /etc/modprobe.d/blacklist.conf
  • NVIDIA GPUs
1
2
echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia*" >> /etc/modprobe.d/blacklist.conf
  • Intel GPUs
1
echo "blacklist i915" >> /etc/modprobe.d/blacklist.conf

Après le blacklist, vous devrez redémarrer.

Activer le IOMMU

Ajoutez une nouvelle ligne et ajoutez l’une des deux lignes ci-dessous, selon que vous utilisez un processeur AMD ou un processeur Intel.

  • AMD :
    1
    
    GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
    
  • Intel :
    1
    
    GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
    

Ensuite vous devez mettre GRUB à jour pour qu’il prenne en compte la modification :

1
sudo update-grub

Chargement des modules

Exécutez la commande ci-dessous pour modifier le fichier des modules et ajouter les modules requis.

1
nano /etc/modules

Ce fichier sera vierge, ajoutez les informations ci-dessous, puis enregistrez le fichier.

1
2
3
vfio
vfio_iommu_type1
vfio_pci

Configuration de la VM

Il est nécessaire que la VM soit configurée comme suit :

  • BIOS : OVMF (UEFI)
  • Affichage : aucun (none)
  • Machine : q35
  • Périphérique PCI (hostpci0) : 0000:01:00,pcie=1,x-vga=1
  • Emuler comme une tablette graphique : Non
  • Amélioration SPICE : aucun

Il est nécessaire d’activer les dépots non free (Debian 12):

1
2
3
4
5
6
7
8
deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
deb-src http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware

deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb-src http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware

#deb http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware
#deb-src http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware

La partie concernée ici est non-free non-free-firmware.

Ensuite vous faites une mise à jour d’apt :

1
sudo apt update

Pour une accélération matérielle avec un GPU Nvidia, il vous faudra installer nvidia-detect :

1
apt install nvidia-detect

Ensuite, vous lancer l’utilitaire afin de savoir quel pilote graphique installer :

1
sudo nvidia-detect

Ce qui va vous donner un résultat approchant (selon votre configuration) :

1
2
3
4
5
6
7
8
9
10
Detected NVIDIA GPUs:
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP107GL [Quadro P400] [10de:1cb3] (rev a1)

Checking card:  NVIDIA Corporation GP107GL [Quadro P400] (rev a1)
Your card is supported by all driver versions.
Your card is also supported by the Tesla drivers series.
Your card is also supported by the Tesla 470 drivers series.
It is recommended to install the
    nvidia-driver
package.

La partie importante ici est “It is recommended to install the” qui vous indique quel pilote graphique est le plus adapté; qu’il vous suffira ensuite d’installer :

Dans mon cas :

1
apt install nvidia-driver

Il est aussi utile, pour Jellyfin par exemple, d’installer les paquets supplémentaires suivant :

1
apt install libnvcuvid1 libnvidia-encode1 libnvidia-decode libnvidia-encode libnvidia-container-tools nvidia-container-runtime nvidia-docker2

Pour l’utilisation sous Docker, il est aussi nécessaire d’installer les paquets suivants :

1
apt install nvidia-container-toolkit libnvidia-container-tools nvidia-container-runtime nvidia-docker2

Ainsi que d’activer la prise en charge Nvidia par Docker :

1
sudo nvidia-ctk runtime configure --runtime=docker

Une fois fait, il est requis de redémarrer Docker pour que cela soit pris en charge :

1
sudo systemctl restart docker

Vérifications

Arriver là, vous devre redémarrer Proxmox PVE pour que l’ensemble des modifications soient prises en compte (PVE & VM)

Afin de vérifier que le GPU Passthrough est opérationnel, vous pouvez lancer la commande suivante dans la VM :

1
sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi

Ce qui devrait vous donner un résultat ressemblant à ça :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.125.06   Driver Version: 525.125.06   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:01:00.0 Off |                  N/A |
| 34%   31C    P8    N/A /  30W |      1MiB /  2048MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

Conclusion

En conclusion, l’accélération matérielle GPU Passthrough sous Proxmox est une fonctionnalité puissante qui peut améliorer considérablement les performances des VMs nécessitant des ressources graphiques. Cependant, elle nécessite une planification minutieuse, une configuration matérielle adéquate et une connaissance technique pour être mise en place avec succès. Une fois en place, elle peut ouvrir de nouvelles possibilités pour les utilisateurs qui dépendent de l’accélération graphique dans leur environnement de virtualisation.

Cet article est sous licence CC BY 4.0 par l'auteur.

© 2022- Olivier. Certains droits réservés.

Propulsé par τζ avec le thème Χ