16.2. Gestion des périphériques NVIDIA vGPU
La fonction vGPU permet de diviser un périphérique GPU NVIDIA physique en plusieurs périphériques virtuels, appelés mediated devices
. Ces dispositifs médiatisés peuvent ensuite être affectés à plusieurs machines virtuelles (VM) en tant que GPU virtuels. Ces machines virtuelles peuvent ainsi partager les performances d'un seul GPU physique.
L'attribution d'un GPU physique aux VM, avec ou sans utilisation de périphériques médiatisés, rend impossible l'utilisation du GPU par l'hôte.
16.2.1. Configuration des périphériques NVIDIA vGPU
Pour configurer la fonction NVIDIA vGPU, vous devez télécharger les pilotes NVIDIA vGPU pour votre périphérique GPU, créer des périphériques médiatisés et les affecter aux machines virtuelles concernées. Pour des instructions détaillées, voir ci-dessous.
Conditions préalables
Votre GPU prend en charge les appareils à médiation vGPU. Pour obtenir une liste actualisée des GPU NVIDIA prenant en charge la création de vGPU, consultez la documentation du logiciel NVIDIA vGPU.
Si vous ne savez pas quel GPU utilise votre hôte, installez le paquetage lshw et utilisez la commande
lshw -C display
. L'exemple suivant montre que le système utilise un GPU NVIDIA Tesla P4, compatible avec vGPU.# lshw -C display *-display description: 3D controller product: GP104GL [Tesla P4] vendor: NVIDIA Corporation physical id: 0 bus info: pci@0000:01:00.0 version: a1 width: 64 bits clock: 33MHz capabilities: pm msi pciexpress cap_list configuration: driver=vfio-pci latency=0 resources: irq:16 memory:f6000000-f6ffffff memory:e0000000-efffffff memory:f0000000-f1ffffff
Procédure
- Téléchargez les pilotes NVIDIA vGPU et installez-les sur votre système. Pour obtenir des instructions, consultez la documentation de NVIDIA.
Si le programme d'installation du logiciel NVIDIA n'a pas créé le fichier /etc/modprobe.d/nvidia-installer-disable-nouveau.conf, créez un fichier
conf
de n'importe quel nom dans /etc/modprobe.d/, et ajoutez les lignes suivantes dans le fichier :blacklist nouveau options nouveau modeset=0
Régénérer le ramdisk initial pour le noyau actuel, puis redémarrer.
# dracut --force # reboot
Vérifiez que le noyau a chargé le module
nvidia_vgpu_vfio
et que le servicenvidia-vgpu-mgr.service
fonctionne.# lsmod | grep nvidia_vgpu_vfio nvidia_vgpu_vfio 45011 0 nvidia 14333621 10 nvidia_vgpu_vfio mdev 20414 2 vfio_mdev,nvidia_vgpu_vfio vfio 32695 3 vfio_mdev,nvidia_vgpu_vfio,vfio_iommu_type1 # systemctl status nvidia-vgpu-mgr.service nvidia-vgpu-mgr.service - NVIDIA vGPU Manager Daemon Loaded: loaded (/usr/lib/systemd/system/nvidia-vgpu-mgr.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2018-03-16 10:17:36 CET; 5h 8min ago Main PID: 1553 (nvidia-vgpu-mgr) [...]
En outre, si vous créez une vGPU basée sur un périphérique GPU NVIDIA Ampere, assurez-vous que les fonctions virtuelles sont activées pour le GPU physique. Pour plus d'informations, consultez la documentation de NVIDIA.
Générer un UUID de l'appareil.
# uuidgen 30820a6f-b1a5-4503-91ca-0c10ba58692a
Préparer un fichier XML avec une configuration du dispositif médiatisé, basée sur le matériel GPU détecté. Par exemple, l'exemple suivant configure un périphérique médiatisé de type
nvidia-63
vGPU sur une carte NVIDIA Tesla P4 qui fonctionne sur le bus PCI 0000:01:00.0 et utilise l'UUID généré à l'étape précédente.<device> <parent>pci_0000_01_00_0</parent> <capability type="mdev"> <type id="nvidia-63"/> <uuid>30820a6f-b1a5-4503-91ca-0c10ba58692a</uuid> </capability> </device>
Définissez un dispositif vGPU basé sur le fichier XML que vous avez préparé. Par exemple :
# virsh nodedev-define vgpu-test.xml Node device mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0 created from vgpu-test.xml
Optional: Vérifiez que le dispositif médiatisé est répertorié comme inactif.
# virsh nodedev-list --cap mdev --inactive mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
Démarrez le dispositif vGPU que vous avez créé.
# virsh nodedev-start mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0 Device mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0 started
Optional: Assurez-vous que le dispositif médiatisé est répertorié comme actif.
# virsh nodedev-list --cap mdev mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
Configurer le périphérique vGPU pour qu'il démarre automatiquement après le redémarrage de l'hôte
# virsh nodedev-autostart mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0 Device mdev_d196754e_d8ed_4f43_bf22_684ed698b08b_0000_9b_00_0 marked as autostarted
Attachez le dispositif médiatisé à une VM dont vous souhaitez partager les ressources vGPU. Pour ce faire, ajoutez les lignes suivantes, ainsi que l'UUID précédemment généré, aux sections <devices/> de la configuration XML de la VM.
<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'> <source> <address uuid='30820a6f-b1a5-4503-91ca-0c10ba58692a'/> </source> </hostdev>
Notez que chaque UUID ne peut être attribué qu'à une seule VM à la fois. En outre, si la VM n'a pas de périphériques vidéo QEMU, tels que
virtio-vga
, ajoutez également le paramètreramfb='on'
sur la ligne<hostdev>
.- Pour que toutes les fonctionnalités des périphériques vGPU soient disponibles sur les machines virtuelles assignées, configurez la licence du logiciel invité NVIDIA vGPU sur les machines virtuelles. Pour plus d'informations et d'instructions, consultez le Guide de l'utilisateur du serveur de licences logicielles NVIDIA Virtual GPU.
Vérification
Interrogez les capacités de la vGPU que vous avez créée et assurez-vous qu'elle est répertoriée comme active et persistante.
# virsh nodedev-info mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0 Name: virsh nodedev-autostart mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0 Parent: pci_0000_01_00_0 Active: yes Persistent: yes Autostart: yes
Démarrez la VM et vérifiez que le système d'exploitation invité détecte le périphérique médiatisé comme étant un GPU NVIDIA. Par exemple, si la VM utilise Linux :
# lspci -d 10de: -k 07:00.0 VGA compatible controller: NVIDIA Corporation GV100GL [Tesla V100 SXM2 32GB] (rev a1) Subsystem: NVIDIA Corporation Device 12ce Kernel driver in use: nvidia Kernel modules: nouveau, nvidia_drm, nvidia
Problèmes connus
- L'attribution d'un périphérique NVIDIA vGPU à une VM qui utilise un système d'exploitation invité RHEL 9 désactive actuellement la session Wayland sur cette VM et charge une session Xorg à la place. Ceci est dû à des incompatibilités entre les pilotes NVIDIA et Wayland.
Ressources supplémentaires
- Documentation du logiciel NVIDIA vGPU
-
La commande
man virsh
16.2.2. Suppression des périphériques NVIDIA vGPU
Pour modifier la configuration des périphériques vGPU assignés, vous devez supprimer les périphériques existants des machines virtuelles assignées. Pour plus d'informations, voir ci-dessous :
Conditions préalables
- La VM à partir de laquelle vous souhaitez supprimer le périphérique est arrêtée.
Procédure
Obtenez l'ID du dispositif médiatisé que vous souhaitez supprimer.
# virsh nodedev-list --cap mdev mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
Arrêter l'instance en cours d'exécution du dispositif vGPU.
# virsh nodedev-destroy mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0 Destroyed node device 'mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0'
Optional: Assurez-vous que le dispositif de médiation a été désactivé.
# virsh nodedev-info mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0 Name: virsh nodedev-autostart mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0 Parent: pci_0000_01_00_0 Active: no Persistent: yes Autostart: yes
Supprimez le périphérique de la configuration XML de la VM. Pour ce faire, utilisez l'utilitaire
virsh edit
pour modifier la configuration XML de la VM, et supprimez le segment de configuration de mdev. Le segment ressemblera à ce qui suit :<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci'> <source> <address uuid='30820a6f-b1a5-4503-91ca-0c10ba58692a'/> </source> </hostdev>
Notez que l'arrêt et le détachement du périphérique médiatisé ne le supprime pas, mais le conserve à l'adresse defined. Vous pouvez donc redémarrer et attacher le périphérique à une autre VM.
Optional: Pour supprimer le dispositif à médiation arrêté, supprimez sa définition.
# virsh nodedev-undefine mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0 Undefined node device 'mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0'
Vérification
Si vous avez seulement arrêté et détaché le périphérique, assurez-vous que le périphérique médiatisé est répertorié comme inactif.
# virsh nodedev-list --cap mdev --inactive mdev_30820a6f_b1a5_4503_91ca_0c10ba58692a_0000_01_00_0
Si vous avez également supprimé le périphérique, assurez-vous que la commande suivante ne l'affiche pas.
# virsh nodedev-list --cap mdev
Ressources supplémentaires
-
La commande
man virsh
16.2.3. Obtenir des informations sur votre système NVIDIA vGPU
Pour évaluer les capacités des fonctions vGPU à votre disposition, vous pouvez obtenir des informations supplémentaires sur les périphériques médiatisés de votre système, telles que
- Combien de dispositifs médiatisés d'un type donné peuvent être créés ?
- Quels sont les dispositifs à médiation déjà configurés sur votre système.
Procédure
Pour voir les périphériques GPU disponibles sur votre hôte qui peuvent prendre en charge les périphériques vGPU, utilisez la commande
virsh nodedev-list --cap mdev_types
. Par exemple, l'illustration suivante montre un système avec deux périphériques NVIDIA Quadro RTX6000.# virsh nodedev-list --cap mdev_types pci_0000_5b_00_0 pci_0000_9b_00_0
Pour afficher les types de vGPU pris en charge par un périphérique GPU spécifique, ainsi que des métadonnées supplémentaires, utilisez la commande
virsh nodedev-dumpxml
.# virsh nodedev-dumpxml pci_0000_9b_00_0 <device> <name>pci_0000_9b_00_0</name> <path>/sys/devices/pci0000:9a/0000:9a:00.0/0000:9b:00.0</path> <parent>pci_0000_9a_00_0</parent> <driver> <name>nvidia</name> </driver> <capability type='pci'> <class>0x030000</class> <domain>0</domain> <bus>155</bus> <slot>0</slot> <function>0</function> <product id='0x1e30'>TU102GL [Quadro RTX 6000/8000]</product> <vendor id='0x10de'>NVIDIA Corporation</vendor> <capability type='mdev_types'> <type id='nvidia-346'> <name>GRID RTX6000-12C</name> <deviceAPI>vfio-pci</deviceAPI> <availableInstances>2</availableInstances> </type> <type id='nvidia-439'> <name>GRID RTX6000-3A</name> <deviceAPI>vfio-pci</deviceAPI> <availableInstances>8</availableInstances> </type> [...] <type id='nvidia-440'> <name>GRID RTX6000-4A</name> <deviceAPI>vfio-pci</deviceAPI> <availableInstances>6</availableInstances> </type> <type id='nvidia-261'> <name>GRID RTX6000-8Q</name> <deviceAPI>vfio-pci</deviceAPI> <availableInstances>3</availableInstances> </type> </capability> <iommuGroup number='216'> <address domain='0x0000' bus='0x9b' slot='0x00' function='0x3'/> <address domain='0x0000' bus='0x9b' slot='0x00' function='0x1'/> <address domain='0x0000' bus='0x9b' slot='0x00' function='0x2'/> <address domain='0x0000' bus='0x9b' slot='0x00' function='0x0'/> </iommuGroup> <numa node='2'/> <pci-express> <link validity='cap' port='0' speed='8' width='16'/> <link validity='sta' speed='2.5' width='8'/> </pci-express> </capability> </device>
Ressources supplémentaires
-
La commande
man virsh
16.2.4. Services de streaming de bureau à distance pour NVIDIA vGPU
Les services de streaming de bureau à distance suivants sont pris en charge sur l'hyperviseur RHEL 9 avec NVIDIA vGPU ou NVIDIA GPU passthrough activé :
- HP ZCentral Remote Boost/Teradici
- NICE DCV
- Mechdyne TGX
Pour plus de détails sur l'assistance, voir la matrice d'assistance du fournisseur approprié.