Pourquoi cela a été cher jusqu’ici

Le VDI — Virtual Desktop Infrastructure — livre un bureau complet depuis un centre de données ou une instance cloud plutôt que depuis l’appareil devant vous. Un utilisateur se connecte depuis un portable, un client léger ou sa propre machine, et obtient un bureau Windows ou Linux familier dont les applications, les fichiers et le traitement se font tous de façon centralisée.

L’attrait pour une équipe informatique est que les correctifs, le contrôle d’accès et la protection des données se font tous au même endroit, et que les gens peuvent atteindre le même bureau de partout.

L’obstacle n’a jamais été l’hyperviseur. C’était le GPU.

Partager un GPU physique entre plusieurs bureaux a été le territoire de NVIDIA, et NVIDIA facture le logiciel vGPU qui fait le découpage. Cette licence est la raison pour laquelle le VDI avec graphismes accélérés par le matériel a surtout été l’apanage des structures aux budgets d’entreprise. Payer une redevance annuelle pour allumer quelque chose que le silicium sait déjà faire est une chose difficile à trouver enthousiasmante.

Intel a changé l’arithmétique avec la gamme Arc Pro. Ces cartes prennent en charge le découpage matériel par SR-IOV standard, qui est une fonction PCIe plutôt qu’un produit. À ce titre, il n’y a pas de serveur de licences, pas d’abonnement, et pas de logiciel vGPU séparé à acheter.

J’ai donc mis la main sur un Intel Arc Pro B50 pour voir avec quelle propreté il s’assemble avec Proxmox. La réponse courte : le mécanisme marche exactement comme annoncé, puis le micrologiciel s’est mis en travers. Les deux moitiés sont ci-dessous.

Comment une carte en devient plusieurs : fonction physique sur l'hôte, fonctions virtuelles aux invitésIntel Arc Pro Bxx03:00.0 — physical functionpilote hôte : xe03:00.1vfio-pci03:00.2vfio-pci03:00.3créée si pris en charge03:00.4créée si pris en chargebureau Windows 1accéléré matérielbureau Windows 2accéléré matérielbureau Windows 3accéléré matérielbureau Windows 4accéléré matérielAucune licence vGPU n'est en jeu à aucun moment. Le SR-IOV est une capacité PCIe que la carte annonceou non — celle-ci l'annonce à [320]. Combien de fonctions elle créera est fixé dansle micrologiciel, car chacune reçoit une tranche fixe de la mémoire de la carte : une tranche plus grande veut diremoins de fonctions. Un B50 de 16 Go en donne deux à 8 Go chacune ; les cartes de 24 et 32 Go en rapportent sept.
La fonction physique reste avec le pilote xe de l’hôte. Chaque fonction virtuelle est un périphérique PCIe à part entière, lié à vfio-pci et remis à un invité — la même machinerie de passthrough qu’une carte entière, juste plusieurs fois. La paire en pointillés dépend de la carte : combien de fonctions chacune créera est plus bas.

L’éléphant : il vous faut Windows d’abord

Avant que tout cela marche, la carte veut que son micrologiciel soit mis à jour. Intel livre cette mise à jour dans l’installeur du pilote Windows.

Ce qui est gênant, parce que la raison pour laquelle vous avez acheté la carte est de la faire tourner sous Proxmox.

Il y a un contournement qui n’a besoin que de Proxmox : montez une VM Windows, passez-lui la carte entière, laissez Windows mettre à jour le micrologiciel, puis rendez la carte à l’hôte. C’est une boucle d’amorçage, et il vaut de la connaître avant de planifier le montage plutôt qu’après.

Briser la boucle d'amorçage « Windows d'abord » avec une VM temporaireLe hic : le SR-IOV a besoin d'un micrologiciel à jour, et le micrologiciel est livré dans un installeur de pilote Windows.1Carte dans l'hôtelspci → 03:00.02Toute la carte → VM Windowshostpci0, Q35 + OVMF3Installer le pilote Intelle micrologiciel se met à jour avec4Redémarrer l'hôtela carte se réinitialisecarte rendue à Proxmox5SR-IOV présentlspci -v → [320]6tmpfiles.d au démarragenumvfs, unbind, bind7VF aux invitésautant que le micrologiciel permetLes étapes 2 et 3 n'existent que pour mettre à jour le micrologiciel. La VM Windows est temporaire — une fois la carte revenuesur l'hôte, elle ne joue plus de rôle, et rien du montage fini ne dépend de Windowstournant sur l'hyperviseur.
La carte ne peut pas faire de SR-IOV tant que son micrologiciel n’est pas à jour, et la mise à jour du micrologiciel arrive comme un pilote Windows. Une VM Windows temporaire avec la carte entière attachée brise la boucle.

Trouver la carte

Sur l’hôte Proxmox, lspci pour la localiser :

lspci

sortie de lspci sur l’hôte Proxmox montrant 03:00.0 VGA compatible controller\u00a0: Intel Corporation Battlemage G21

La voici à 03:00.0, rapportée comme Battlemage G21, le silicium derrière l’Arc Pro B50. Notez l’adresse. Vous en aurez besoin plusieurs fois, et il y a une fonction audio séparée à 04:00.0 qui l’accompagne.

Passer la carte entière à une VM Windows

Ajoutez la carte à une VM Windows comme périphérique PCI brut. Dans le matériel de la VM, c’est une entrée PCI Device : 0000:03:00 avec pcie=1 :

onglet matériel d’une VM Proxmox montrant 16 Gio de mémoire, 4 cœurs hôte, UEFI OVMF, machine pc-q35-10.1, VirtIO SCSI single, un périphérique d’état TPM, et PCI Device hostpci0 réglé sur 0000:03:00 avec pcie=1

Il vaut de remarquer ce que cette VM est par ailleurs, parce que rien n’y est accidentel : type de machine Q35, micrologiciel OVMF, VirtIO SCSI single, et un TPM pour Windows 11. Q35 en particulier n’est pas optionnel ici. Un GPU passé sur i440fx apparaît comme un périphérique PCI hérité, qui est la mauvaise forme pour un pilote graphique moderne. C’est traité dans Toujours utiliser Q35, pas i440fx.

Démarrez la VM et vérifiez que Windows voit la carte :

Gestion de l’ordinateur Windows, Gestionnaire de périphériques, Cartes graphiques montrant deux entrées Microsoft Basic Display Adapter, l’une signalée d’un avertissement

Elle apparaît comme un Microsoft Basic Display Adapter parce qu’aucun pilote n’est encore installé. C’est l’état attendu, et cela suffit. Windows a trouvé le matériel.

Mettre à jour le micrologiciel

Prenez le pilote à jour depuis la page de téléchargement Arc Pro B50 d’Intel. Au moment d’écrire, c’était la version 32.0.101.8306 (Q4.25), pour Windows 11 et Windows 10 22H2 :

page de téléchargements Arc Pro B50 Graphics d’Intel listant Intel Arc Pro Graphics pour Windows, version 32.0.101.8306 Q4.25, datée du 23 décembre 2025

Installez-le, et laissez la mise à jour du micrologiciel se dérouler dans le processus plutôt que d’annuler trop tôt. Cette étape de micrologiciel est toute la raison de ce détour.

Quand elle finit, rendez la carte à l’hôte et redémarrez, pour qu’elle se réinitialise pleinement sous Proxmox.

Confirmer que le SR-IOV est là

Demandez maintenant à la carte ce qu’elle sait faire :

lspci -v

sortie de lspci -v pour 03:00.0 montrant kernel driver in use xe, IOMMU group 13, et des capacités dont Alternative Routing-ID Interpretation, Address Translation Service, Physical Resizable BAR, Virtual Resizable BAR et Single Root I/O Virtualization à 320

La ligne qui compte :

Capabilities: [320] Single Root I/O Virtualization (SR-IOV)

C’est toute la proposition en une ligne de sortie de lspci, sans aucune licence attachée.

Trois autres choses dans cette sortie valent d’être lues pendant que vous y êtes :

  • Kernel driver in use: xe — la carte est sur le pilote xe plus récent d’Intel plutôt que sur i915, et c’est lui qui créera les fonctions virtuelles.
  • [420] Physical Resizable BAR et [220] Virtual Resizable BAR — la carte prend en charge les BAR redimensionnables, et ses fonctions virtuelles aussi. Il vaut de savoir ce que cela vous coûte en espace d’adressage si vous en passez plusieurs : voir PCIe Resizable BAR et les GPU modernes.
  • IOMMU group 13 — la carte est dans un groupe à elle, ce qui est ce que vous voulez pour un passthrough propre. Pourquoi cela compte est dans l’article sur la taxe IOMMU.

Créer les fonctions virtuelles au démarrage

Les fonctions virtuelles ne sont pas persistantes. Les demander est une écriture dans sysfs, donc cela doit se faire à chaque démarrage.

tmpfiles.d est une façon propre de faire cela de façon déclarative, plutôt que de boulonner un script sur un fichier d’unité :

cat /etc/tmpfiles.d/b50-setup.conf montrant une écriture dans sriov_numvfs, quatre écritures unbind vers le pilote xe, et quatre écritures bind vers vfio-pci

Le fichier fait trois tâches dans l’ordre.

Créer les fonctions virtuelles, en écrivant le nombre dans le sriov_numvfs de la fonction physique :

w /sys/devices/pci0000:00/0000:00:01.1/0000:01:00.0/0000:02:01.0/0000:03:00.0/sriov_numvfs  - - - -  4

Détacher chaque nouvelle fonction de xe, parce que le pilote de l’hôte les réclame dès qu’elles apparaissent et qu’un invité ne peut pas avoir un périphérique que l’hôte tient :

w /sys/bus/pci/drivers/xe/unbind - - - - 0000:03:00.1
w /sys/bus/pci/drivers/xe/unbind - - - - 0000:03:00.2
w /sys/bus/pci/drivers/xe/unbind - - - - 0000:03:00.3
w /sys/bus/pci/drivers/xe/unbind - - - - 0000:03:00.4

Les lier à vfio-pci, qui est ce qui les rend disponibles pour le passthrough :

w /sys/bus/pci/drivers/vfio-pci/bind - - - - 0000:03:00.1
w /sys/bus/pci/drivers/vfio-pci/bind - - - - 0000:03:00.2
w /sys/bus/pci/drivers/vfio-pci/bind - - - - 0000:03:00.3
w /sys/bus/pci/drivers/vfio-pci/bind - - - - 0000:03:00.4

Notez les adresses : la fonction physique est 03:00.0 et les fonctions virtuelles apparaissent de .1 à .4.

Un détail sur w qui explique l’ordre, et qui vous mordra si vous vous trompez. systemd le documente ainsi : « Write the argument parameter to a file, if the file exists. » sriov_numvfs n’existe qu’une fois qu’un pilote s’est lié à la fonction physique, et les chemins des fonctions virtuelles n’existent qu’une fois cette écriture faite. La séquence dans le fichier n’est donc pas stylistique. Chaque ligne dépend de ce que la précédente ait pris effet.

Pourquoi deux, et pas quatre

Le pilote 32.0.101.8306 — celui installé plus haut — porte le micrologiciel graphique BMG__21,1162, et c’est la version où Intel a d’abord officiellement activé le SR-IOV sur Arc Pro. Le défaut annoncé par Intel pour le B50 dans cette version est deux fonctions virtuelles, chacune avec un BAR de mémoire locale VF de 8 Go.

Ce qui fait du nombre de l’arithmétique plutôt qu’une politique. Le B50 a 16 Go. À 8 Go par fonction virtuelle, deux est tout ce qui tient.

Il y a une subtilité à connaître si vous cherchez un contournement. Avant que le support officiel existe, certains ont fait tourner un micrologiciel plus ancien qui exposait 12 fonctions virtuelles sur un B50, et revenir au pilote 32.0.101.6979 restaure ce nombre. Ces 12 partageaient les mêmes 16 Go, donc chacune avait une fraction de la mémoire que les miennes ont. La position d’Intel est que deux a été choisi délibérément pour donner à chaque fonction assez de calcul, de capacité et de bande passante pour se comporter de façon prévisible.

Le plafond peut donc être déplacé, mais pas par vous. Le nombre maximum de VF et la taille du BAR de mémoire locale VF vivent dans l’IFWI, il n’y a pas d’outil public pour changer l’un ou l’autre, et la réponse prise en charge sur une pile à jour est deux.

Combien de bureaux chaque carte vous donne

Le B50 est la petite carte de la famille, et ses deux fonctions sont le plancher de la famille. Si le nombre de sièges est ce qui vous importe, achetez plus haut dans la gamme.

Toute la gamme Battlemage Arc Pro fait du SR-IOV. Ce qui diffère, c’est combien de fonctions le micrologiciel taillera, et cela suit la mémoire :

CarteMémoireVF sur la pile prise en charge actuelleVu ailleurs
Arc Pro B5016 Go2, à 8 Go de BAR VF chacune — le défaut documenté d’Intel12 sur micrologiciel pré-officiel, via le pilote 32.0.101.6979
Arc Pro B6024 Go7 rapportées24 sur un micrologiciel ASRock précoce, ramenées à 7 par un plus tardif
Arc Pro B60 Dual2 × 24 Go7 par GPU — deux GPU, donc 14 depuis un emplacementcomme ci-dessus ; les deux moitiés sont indépendantes
Arc Pro B6532 Goaucun nombre publié trouvé—
Arc Pro B7032 Go7 rapportées, sur micrologiciel 85174 sur micrologiciel plus ancien

Seule la ligne du B50 est documentée par Intel. Les nombres du B60 et du B70 sont ceux que les gens rapportent de lspci, et ils ont bougé plus d’une fois. Le B60 en particulier est passé de 24 à 7 dans une mise à jour de micrologiciel, ce qui est le même genre de resserrement que le B50 a connu. Personne ne semble avoir publié de nombre de VF pour le B65 du tout, donc traitez cette ligne comme inconnue plutôt que comme zéro.

Deux choses découlent de ce tableau, et les deux comptent plus qu’aucun nombre isolé dedans.

Le nombre de VF est une division de mémoire, pas une fonction du die. La règle d’Intel est qu’un BAR de mémoire locale VF plus grand veut dire moins de fonctions. C’est pourquoi la carte de 16 Go en donne deux et les cartes de 32 Go en donnent sept : rien dans les shaders du GPU ne le décide.

Vérifiez la carte que vous êtes sur le point d’acheter, pas la famille. La présence du SR-IOV a varié entre fabricants de cartes sur la même puce — le B60 Blower de Sparkle est d’abord sorti sans la capacité visible du tout et ne l’a gagnée qu’après une mise à jour de micrologiciel igsc. Demandez la sortie de lspci -v du modèle exact, ou budgétez une mise à jour de micrologiciel avant de compter sur tout cela.

Le B60 Dual, ce sont deux cartes portant un seul support

Le B60 Dual 48G Turbo de Maxsun est l’intéressant pour le nombre de sièges, et la chose à comprendre est que les 48 Go ne sont pas un pool.

Ce sont deux GPU B60 — deux dies BMG-G21 — sur une carte, avec 24 Go de GDDR6 câblés à chacun, et aucune puce de pont PCIe entre eux. Les deux dies pendent droit aux doigts dorés x16 à PCIe 5.0 x8 chacun.

Ce qui veut dire que l’hôte doit découper l’emplacement pour vous. La carte a besoin que l’emplacement x16 primaire soit bifurqué en x8/x8, et la plupart des cartes grand public ne l’activent pas par défaut. C’est un réglage de micrologiciel que vous allez chercher, dans la même catégorie que les réglages IOMMU et ACS dont tout ceci a besoin.

Faites-le bien et le système d’exploitation voit deux GPU séparés, chacun avec sa propre fonction physique et sa propre capacité SR-IOV. Vous obtenez donc deux lots de fonctions virtuelles depuis un emplacement — 14 sièges si chaque die se comporte comme un seul B60 — et le fichier tmpfiles.d ci-dessus double, une écriture sriov_numvfs par die.

Faites-le mal et vous voyez un GPU et la moitié de la carte est invisible.

Il vaut d’être clair sur ce que les 48 Go ne sont pas : un invité attaché à une fonction virtuelle sur le premier die ne peut pas atteindre la mémoire du second die. Ce sont deux cartes de 24 Go dans un seul espace physique, ce qui est exactement ce que vous voulez pour des sièges VDI et exactement ce que vous ne voulez pas pour un seul gros modèle.

Donc : si deux sièges suffisent, le B50 est une carte de 70 W qui le fera. Si vous en voulez sept, planifiez autour d’un B70. Si vous en voulez quatorze et avez une carte qui bifurque, le B60 Dual vous y mène en un seul emplacement.

Peut-on faire de l’IA sur une fonction virtuelle ?

Réponse courte : traitez-le comme non pris en charge. Réponse plus longue, parce que la raison compte et n’est pas celle que vous devineriez.

Ce sont des cartes vendues comme cartes d’IA et elles ne font pas semblant. Les 128 moteurs XMX du B50 sont notés à 170 TOPS de pointe, le B70 à 367, et l’histoire logicielle d’Intel est réelle — vLLM sert des modèles de 8B jusqu’à 120B sur les Arc Pro série B, et IPEX-LLM et le backend SYCL de llama.cpp tournent tous deux dessus.

Mais regardez comment chacun de ces résultats est produit. Les propres chiffres Arc Pro de vLLM viennent d’un conteneur Docker sur métal nu, sur des systèmes avec quatre et huit cartes B60 entières faisant du parallélisme de tenseurs. Le billet d’Intel ne mentionne le SR-IOV ni les fonctions virtuelles pas une seule fois.

Ce schéma tient partout où j’ai regardé. Intel cantonne les cas d’usage du SR-IOV au bureau distant virtualisé, à l’accélération graphique du système invité, et à l’encodage et au décodage média. Le calcul n’est pas sur cette liste, et je n’ai pas pu trouver un seul cas publié de quiconque faisant tourner de l’inférence LLM dans une VM attachée à une fonction virtuelle.

Ce que les gens font réellement est parlant : ils font tourner le modèle dans Docker sur l’hôte, et remettent des fonctions virtuelles aux VM pour les bureaux. Une personne faisant les deux à la fois rapporte simplement que « VRAM gets pretty tight » — la VRAM devient assez juste.

Ce qui est le vrai problème, et c’est de l’arithmétique plutôt qu’un support de pilote.

Une fonction virtuelle obtient une tranche fixe de mémoire locale — 8 Go sur le B50, fixé dans le micrologiciel. Cette tranche est le plafond dur pour les poids plus le cache KV dans cet invité, et elle ne grandit pas parce que la carte en a plus. Un modèle 8B en FP16 fait environ 16 Go de poids avant que vous n’ajoutiez le moindre contexte, donc il ne tient pas dans une fonction virtuelle de B50 sur aucun pilote. Quantifiez en Q4 et un 8B tient dans environ 4 Go, laissant quelques Go pour le contexte — ce qui marche, mais est loin de ce que la carte sait faire non divisée.

Les deux charges se disputent donc la même mémoire, et le partage est décidé dans le micrologiciel avant qu’aucune des deux ne démarre.

Si l’IA est le travail, ne divisez pas la carte. Passez le tout à une seule VM — le même passthrough hostpci0 utilisé pour la mise à jour du micrologiciel plus tôt dans ce billet — ou faites tourner le conteneur sur l’hôte et sautez la virtualisation pour cette charge. Les deux donnent au modèle les 16 Go entiers et tout le réseau XMX.

Si le VDI est le travail, les fonctions virtuelles sont justes, et attendez des graphismes de bureau plutôt qu’un serveur d’inférence derrière chacune. Les bureaux accélérés par le matériel, la lecture vidéo et l’encodage marchent. C’est pour cela que le mécanisme est documenté.

Il vaut de dire clairement : l’absence de preuve publiée n’est pas la preuve que cela échoue. Le pilote xe expose le calcul par Level Zero et OpenCL, et il est tout à fait possible qu’un invité adossé à une VF les amène sans souci. Mais rien d’Intel ne dit que c’est validé, personne ne semble l’avoir montré marchant, et le plafond de mémoire limite le gain même si c’est le cas. Ce n’est pas quelque chose sur quoi bâtir un plan.

Ce que cela vaut quand même

Deux fonctions virtuelles, ce sont deux bureaux Windows accélérés par le matériel depuis une carte, sans licence vGPU, sans abonnement et sans serveur de licences. Sur un hyperviseur dont l’exploitation ne coûte rien. C’est assez pour prouver que l’approche marche, ce qui est le travail honnête d’un B50. C’est le bas de la gamme.

Pour un déploiement VDI réel, je spécifierais le B60 Dual.

Quatorze fonctions depuis un emplacement — si chaque die se comporte comme un seul B60 — le met dans le même territoire de nombre de sièges que les cartes NVIDIA vendues pour cette charge, à un prix bien plus bas, et sans rien à licencier par utilisateur. Cette dernière partie est celle qui compose. Les vApps, vPC et RTX vWS de NVIDIA sont tous licenciés par utilisateur simultané, soit comme abonnement annuel, soit comme licence perpétuelle qui doit être achetée à côté d’un abonnement de support et de maintenance de cinq ans. Chaque siège est une ligne de facture, et elle revient. Côté Intel, il n’y a pas de ligne équivalente. Vous achetez la carte.

Et le mécanisme est la partie qui compte à long terme. Le SR-IOV sur le GPU est une capacité PCIe, pas un palier de produit, donc le fichier tmpfiles.d grandit simplement pour correspondre à ce que la carte permet.

La forme est une écriture sriov_numvfs, puis un unbind et un bind pour chaque fonction — donc deux fonctions font cinq lignes, et les neuf ci-dessus sont quatre fonctions demandées sur une carte qui en livre deux. Sept fonctions font quinze lignes. Un B60 Dual en fait trente, parce que chaque die est sa propre fonction physique et obtient sa propre écriture sriov_numvfs.

Rien d’autre ne change à mesure que vous l’échelonnez. Aucun serveur de licences n’apparaît à aucun moment dans ce fichier.

Références