Aller au contenu
Conteneurs & Orchestration medium

GPU dans Incus : passer une carte NVIDIA à un conteneur ou une VM

6 min de lecture

logo incus

Faire tourner de l'inférence ou du calcul GPU dans une instance Incus, sans dédier une machine entière : c'est exactement ce que permet le device gpu. Pour un conteneur, Incus partage le GPU de l'hôte et injecte l'userspace NVIDIA tout seul (rien à installer dans le conteneur) ; pour une VM, c'est un passthrough PCI exclusif. Ce guide montre les deux, avec le piège des versions de pilote. Testé avec un NVIDIA H100 sur Incus 7.0.

  • La différence conteneur (partage) vs VM (passthrough exclusif).
  • Attacher un GPU NVIDIA à un conteneur avec nvidia.runtime.
  • Filtrer le bon GPU sur une machine multi-cartes.
  • Les pièges de version de pilote.
  • Un hôte avec un GPU NVIDIA et son pilote noyau installé (nvidia-smi fonctionne sur l'hôte).
  • Incus installé : voir installer Incus.
  • Pour l'injection automatique en conteneur : nvidia-container-toolkit (paquet libnvidia-container) sur l'hôte.

C'est le point à comprendre avant tout. Le device gpu ne fait pas la même chose selon le type d'instance.

TypeMécanismePartagePilote dans l'instance
ConteneurPartage des périphériques /dev/nvidia* de l'hôteOui, plusieurs instancesInjecté par nvidia.runtime
VMPassthrough PCI (VFIO)Non, exclusif à la VMÀ installer dans la VM

Pour de l'inférence partagée entre plusieurs environnements, le conteneur est le plus souple. Pour une isolation forte ou un OS invité différent, la VM prend le GPU en exclusivité.

L'élégance d'Incus : avec nvidia.runtime=true, il monte l'userspace NVIDIA de l'hôte (bibliothèques et nvidia-smi) dans le conteneur. Inutile d'installer le moindre paquet CUDA dedans.

  1. Lancer un conteneur avec le runtime NVIDIA activé :

    Fenêtre de terminal
    incus launch images:debian/13 gpu-lab -c nvidia.runtime=true
  2. Attacher le GPU avec un device de type gpu :

    Fenêtre de terminal
    incus config device add gpu-lab gpu0 gpu
    # Device gpu0 added to gpu-lab
  3. Vérifier dans le conteneur, sans rien y installer :

    Fenêtre de terminal
    incus exec gpu-lab -- nvidia-smi -L
    GPU 0: NVIDIA H100 PCIe (UUID: GPU-ada5ffa8-3c66-...)

Le GPU de l'hôte est vu tel quel dans le conteneur, avec les nœuds /dev/nvidia0 et /dev/nvidiactl exposés. Comme c'est un partage, plusieurs conteneurs peuvent recevoir le même GPU.

Sur une machine à plusieurs cartes, le device gpu sans filtre expose toutes les cartes. On restreint avec des propriétés de filtrage.

Fenêtre de terminal
# par identifiant de carte
incus config device add gpu-lab gpu0 gpu id=0
# par adresse PCI
incus config device add gpu-lab gpu0 gpu pci=0000:81:00.0

On peut aussi filtrer par vendorid/productid. C'est indispensable pour dédier une carte précise à une instance et en laisser d'autres libres pour l'hôte ou d'autres instances.

Pour une VM, le device gpu déclenche un passthrough PCI : la carte est détachée de l'hôte et rattachée à la VM, en exclusivité. L'hôte ne peut plus l'utiliser tant que la VM tourne.

Fenêtre de terminal
incus launch images:debian/13 gpu-vm --vm
incus config device add gpu-vm gpu0 gpu

Le problème le plus fréquent en conteneur : une incompatibilité de version entre le pilote noyau de l'hôte et l'userspace injecté. Comme nvidia.runtime monte l'userspace de l'hôte, les deux sont par construction alignés ici. En revanche, si vous installez manuellement des paquets NVIDIA dans le conteneur, ils peuvent entrer en conflit avec le pilote noyau de l'hôte (Failed to initialize NVML: Driver/library version mismatch). La règle : en conteneur, laisser nvidia.runtime gérer l'userspace, ne pas installer de pilote dedans.

  • Device gpu : partage en conteneur, passthrough PCI exclusif en VM.
  • En conteneur, nvidia.runtime=true injecte l'userspace NVIDIA : rien à installer dedans.
  • L'injection exige libnvidia-container (nvidia-container-toolkit) sur l'hôte.
  • Cibler une carte précise avec id=, pci= ou vendorid/productid.
  • En VM : pilote à installer dans l'invité, IOMMU requis sur l'hôte.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn