dertowa
Goto Top

Windows 11 Pro Hyper-V - GPU in VM

Hallo zusammen,
nachdem ich mit DDA mangels Server-OS noch gescheitert war gibt es wohl noch eine nicht so recht dokumentierte Möglichkeit, welche ich nun auf zwei Hosts erfolgreich einrichten konnte.

Hostsysteme:
iGPU eines AMD Ryzen 7 9700X bzw. eines AMD Ryzen 5 5600G
  • AMD Radeon(TM) Graphics
PCIe
  • NVIDIA Quadro M2000

Ziel war es die NVIDIA Quadro einer VM zur Verfügung zu stellen.
An den Systemen läuft das Blech über die integrierte GPU, an der NVIDIA Quadro hängt also kein Monitor (sollte aber unerheblich sein).
Vorweggenommen sei, dass das genutzte Skript für die Treiberdateien auf die Anpassungen von NVIDIA Grafikkarten ausgelegt ist.

Genutzte Software:
  • Microsoft Windows 11 Pro (24H2)
  • NVIDIA Quadro Treiber 553.35 oder 553.50

In Kürze was zu tun ist, bzw. was ich getan habe:
  • Virtualisierungseinstellungen im BIOS eingestellt (damit später Hyper-V auf dem Microsoft Windows installiert werden kann)
  • Microsoft Windows am Blech installiert und alle notwendigen Systemtreiber eingebunden
  • Hyper-V Rolle hinzugefügt
  • VM anlegen (Name Test)
  • Basisinstallation der VM (ebenfalls mit Windows 11 Pro)
  • VM abschalten

Damit kann es mit der Zuweisung der Grafikkarte weitergehen, beschaffen wir uns erstmal die grundlegenden Informationen, welche GPUs für die Partitionierung zur Verfügung stehen:
Get-VMHostPartitionableGpu | FL Name,ValidPartitionCounts
Name: \\?\PCI#VEN_1002&DEV_13C0&SUBSYS_88771043&REV_C5#4&1ebe6a9c&0&0041#{064092b3-625e-43bf-9eb5-dc845897dd59}\GPUPARAV
ValidPartitionCounts : {32}

Name: \\?\PCI#VEN_10DE&DEV_1430&SUBSYS_119010DE&REV_A1#4&1babdf5b&0&0009#{064092b3-625e-43bf-9eb5-dc845897dd59}\GPUPARAV
ValidPartitionCounts : {32}

Die erste Ausgabe ist bei mir die iGPU von AMD, diese würde primär genutzt, daher muss die Zuweisung ein wenig expliziter vorgenommen werden als nur im Standard die Befehle durchzuhauen.

Zuweisen einer Grafikkarte: Add-VMGpuPartitionAdapter
Entfernen zugewiesener Grafikkarten: Remove-VMGpuPartitionAdapter

Nach einem Blick in die Hilfe des VMGpuPartitionAdapter - Befehls habe ich mir das wie folgt zusammengereimt:
Add-VMGpuPartitionAdapter -VMName Test -InstancePath "\\?\PCI#VEN_10DE&DEV_1430&SUBSYS_119010DE&REV_A1#4&1babdf5b&0&0009#{064092b3-625e-43bf-9eb5-dc845897dd59}\GPUPARAV"  
Es steht zwar nirgends, dass der InstancePath = Name ist, aber das geht. face-big-smile
Die Grafikkarte wurde nun zwar in der VM gelistet, aber mit einem Ausrufezeichen versehen.

Das Treibersetup von NVIDIA innerhalb der VM auszuführen, führte nur zu einem Fehler bei der Erkennung der Grafikkarte und auch über den Geräte-Manager konnte manuell kein Treiber installiert werden, da angeblich bereits der beste Treiber für "Microsoft Hyper-V-Video" installiert sei.
...niemand hat versucht den Microsoft Hyper-V-Video - Treiber zu aktualisieren. face-wink
Für die Treiberdateien habe ich mich dann einem Skript von GitHub bedient (siehe Quellen).
Damit wird die VHD(x) der VM gemountet, die Treiberdateien eingefügt und einige Zuordnungen umgebogen, danach die VHD(x) wieder getrennt.
Das Skript ist aus dem Ordner in dem es liegt auszuführen.
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass –Force
.\Update-VMGpuPartitionDriver.ps1 -VMName Test -GPUName "NVIDIA Quadro M2000"  
Mounting Drive...
Copying GPU Files - this could take a while...
INFO   : Finding and copying driver files for NVIDIA Quadro M2000 to VM. This could take a while...
Dismounting Drive...
Done…
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Restricted –Force

Achtung!
Beim Skript kann es zu Fehlern kommen, wenn der VHD(x) nicht automatisch ein Laufwerksbuchstabe zugewiesen wird.
In diesem Fall sollte die VHD(x) vorab einmal manuell gemountet werden und über die Datenträgerverwaltung einen Laufwerkbuchstaben zugewiesen bekommen.
mount
Anschließend kann man diese wieder trennen. Wenn das Skript die VHD(x) nun mountet nimmt Windows den zuvor zugewiesenen Laufwerksbuchstaben und alles fluppt.

Im Anschluss noch per Powershell eine Anpassung an den VM-Einstellungen vornehmen, welche aus dem DDA-Bereich stammt:
Set-VM -VMName Test -GuestControlledCacheTypes $true -LowMemoryMappedIoSpace 1Gb -HighMemoryMappedIoSpace 32Gb


Ich würde sagen, das Ergebnis spricht für sich:
screen1

screen2
Wie bildlich zu sehen ist die Grafikkarte nicht einfach nur im Geräte-Manager, sondern zeigt die Auslastung im Task-Manager des Hosts korrekt an und jeder weiß, dass sich Furmark standardmäßig in einer VM nicht starten lässt.

Grüße
ToWa

Quellen:

Edit:
  • Powershell-Befehl für VM-Einstellung hinzugefügt, da ansonsten die GPU in der VM nicht korrekt zum Treiber gemappt wird.
  • Hinweis zu fehlendem Laufwerkbuchstaben hinzugefügt.
  • Beitrag allgemein überarbeitet

Content-ID: 670034

Url: https://administrator.de/tutorial/windows-11-pro-hyper-v-gpu-in-vm-670034.html

Printed on: January 14, 2025 at 07:01 o'clock

MysticFoxDE
MysticFoxDE Dec 09, 2024 at 05:51:22 (UTC)
Goto Top
Moin @dertowa,

😯 ... ähm, ich sehe zwar was du da gemacht hast, so ganz kann ich es aber nicht wirklich verstehen.
Denn das ist weder DDA noch wirklich GPU-Partitioning, sondern eher GPU-Sharing, was ich aber so in keiner einzigen offiziellen MS Doku finde. 😖

Denn bei DDA würdest du die GPU nur noch in der VM sehen, in die du die GPU gemountet hast und für GPU-Partitioning müsstest du die GPU vorher mit ...

Set-VMHostPartitionableGpu -Name "<GPU-name>" -PartitionCount <partition-count>  

... aufteilen, was du wie ich sehe jedoch nicht wirklich gemacht hast. 🙃

Ausserdem sollte GPU-Partitioning laut NVIDIA selbst, nur mit zusätzlichen Lizenzen funktionieren die du auch nicht benutzt.

Sehr spannend ... ich frag mal einen MVP wie das überhaupt möglich ist.

Gruss Alex
dertowa
dertowa Dec 09, 2024 updated at 11:11:22 (UTC)
Goto Top
Zitat von @MysticFoxDE:

Set-VMHostPartitionableGpu -Name "<GPU-name>" -PartitionCount <partition-count>  

... aufteilen, was du wie ich sehe jedoch nicht wirklich gemacht hast. 🙃
Richtig, habe ich nicht, da in der Doku bei den speziellen Karten die
  • ValidPartitionCounts
variabel angegeben sind, als 16, 12, 8, 4...
Bei meiner alten Quadro werden nur 32C aufgelistet, daher habe ich darauf verzichtet.
Ich wollte die Grafikkarte ja auch nur in einer VM, ob es über mehrere geht steht bei mir noch als Versuch aus.

Ausserdem sollte GPU-Partitioning laut NVIDIA selbst, nur mit zusätzlichen Lizenzen funktionieren die du auch nicht benutzt.

Jap, dafür gibt es ja auch die in der MS-Doku genannten speziellen Grafikkarten. face-smile

P.S.: Aber es freut mich, dass ich dich auch mal mit etwas überraschen kann. face-big-smile

Grüße
ToWa
MysticFoxDE
MysticFoxDE Dec 09, 2024 at 11:22:54 (UTC)
Goto Top
Moin @dertowa,

Richtig, habe ich nicht, da in der Doku bei den speziellen Karten die
  • ValidPartitionCounts
variabel angegeben sind, als 16, 12, 8, 4...
Bei meiner alten Quadro werden nur 32C aufgelistet, daher habe ich darauf verzichtet.
Ich wollte die Grafikkarte ja auch nur in einer VM, ob es über mehrere geht steht bei mir noch als Versuch aus.

ähm ja, aber GPU-Partitionierung sollte eigentlich nur dann funktionieren, wenn die entsprechende GPU auch aufgeteilt ist. 🙃

Jap, dafür gibt es ja auch die in der MS-Doku genannten speziellen Grafikkarten. face-smile

Aber die hast du doch nicht verwendet ... oder?

P.S.: Aber es freut mich, dass ich dich auch mal mit etwas überraschen kann. face-big-smile

Ich fürchte, damit bist du noch nicht ganz durch ... denn, sehe ich das richtig, dass trotz dessen, dass du die GPU der VM zugeordnet hast, diese auch noch im Taskmanager des Host-OS zu sehen ist und zwar mit der Auslastung, die eigentlich innerhalb der VM erfolgt?

Gruss Alex
dertowa
dertowa Dec 09, 2024 at 13:06:40 (UTC)
Goto Top
Zitat von @MysticFoxDE:

ähm ja, aber GPU-Partitionierung sollte eigentlich nur dann funktionieren, wenn die entsprechende GPU auch aufgeteilt ist. 🙃

Klar, ob jetzt aber DDA, Shared oder Partitionierung ist mir eigentlich relativ, so lang die Performance in der VM ankommt.

Aber die hast du doch nicht verwendet ... oder?
Nein, es ist eine einfache Quadro und keine spezielle Karte, auch die iGPU von AMD funktioniert wie oben beschrieben in der VM.

Ich fürchte, damit bist du noch nicht ganz durch ... denn, sehe ich das richtig, dass trotz dessen, dass du die GPU der VM zugeordnet hast, diese auch noch im Taskmanager des Host-OS zu sehen ist und zwar mit der Auslastung, die eigentlich innerhalb der VM erfolgt?
Ganz genau so und innerhalb der VM habe ich die entsprechende 3D Leistung für Furmark bzw. ich kann Furmark ohne Fehlermeldung starten und nutzen. face-smile

P.S.: Mach mir das hier nicht madig, ich würde ja auch DDA nutzen, aber das geht wohl nur mit Microsoft Server und nicht mit Windows. face-sad

Grüße
ToWa
MysticFoxDE
MysticFoxDE Dec 10, 2024 at 06:48:11 (UTC)
Goto Top
Moin @dertowa,

zuerst das Wichtigste.

> P.S.: Mach mir das hier nicht madig,

ich habe das keineswegs vor, im Gegenteil.
Ich bin sehr darüber erstaunt, dass es genau so funktioniert und würde daher auch sehr gerne verstehen, warum das so ist.

ich würde ja auch DDA nutzen, aber das geht wohl nur mit Microsoft Server und nicht mit Windows. face-sad

Na ja, der Kernel eines Windows 24H2 ist zu 100% baugleich wie auch der kernel eines Server 2025, daher sollten die meisten Dinge die auf einem Server laufen, theoretisch auch auf den Client möglich sein. 🙃
Ich habe selber schon vor etwa zwei jahren MPIO auf meiner W11 Workstation aktiviert gehabt, was eigentlich auch nur die Server können sollten. 😁

Jedoch, das was du hier zauberst ist auch bei einem Server nicht dokumentiert, daher finde ich das Ganze auch besonders spannend.

Klar, ob jetzt aber DDA, Shared oder Partitionierung ist mir eigentlich relativ, so lang die Performance in der VM ankommt.

Ich würde es aber gerne verstehen, wie vor allem dieser Shared-Modus funktioniert, den du zu benutzen scheinst,
der bisher offiziel, sprich, seitens Microsoft, jedoch nirgends dokumentiert ist.

Denn ich finde diesen Modus übrigens mitunter auch deswegen sehr interessant, weil du dafür so wie es aussieht auch keine zusätzlichen Lizenzen benötigst. 😉
Was übrigens auch der Grund sein könnte, warum dieser so gut versteckt/offiziel undokumentiert ist. 🙃

Aber die hast du doch nicht verwendet ... oder?
Nein, es ist eine einfache Quadro und keine spezielle Karte, auch die iGPU von AMD funktioniert wie oben beschrieben in der VM.

Meine Frage bezog sich eher auf die spezieellen GPU-P Treiber von NVIDIA.
Aber, da du schreibst, dass das auch mit der AMD GPU funktioniert, was ich übrigens auch sehr sehr spannend finde,
wirst du wohl dafür nicht die NVIDIA Treiber benutzt haben.
Sprich, das was du gemacht hast, hast du so wie es aussieht mit den Standardtreibern der entsprechenden GPU's hinbekommen.

Kannst du vielleicht auch mal testen, ob du die GPU genau so parallel auch einer weiteren VM zuweisen und auch aktiv in beiden VM's benutzen kannst, danke.

Gruss Alex
dertowa
dertowa Jan 10, 2025 updated at 21:29:02 (UTC)
Goto Top
Kleines Update des Beitrags mit einer Korrektur bzw. Erweiterung der Befehle, da nach einer Neuinstallation des Systems das gemäß Beitrag nicht mehr zum Laufen zu bekommen war. face-big-smile

Am Montag geht das dann in eine tägliche Nutzung über, mal sehen was noch auffällt.
Ebenfalls steht ein Test bei der Zuweisung zu mehreren VMs noch an.

Was ich aber eben mal noch getestet habe, die Performance von Furmark am Host bei einer Renderauflösung von 800x600 = ~40 FPS.
Innerhalb der VM liege ich bei selbiger Auflösung bei ~39 FPS.

P.S.: Ich mache den Beitrag die Tage auch mal noch "schön" bzw. räume mal auf.
Ein wenig unübersichtlich ist er irgendwie.

Grüße
ToWa