dertowa
Goto Top

Windows 11 Pro Hyper-V - GPU in VM

Hallo zusammen,
nachdem ich gestern noch gescheitert war scheine ich nun ein gutes Stück weiter zu sein und möchte den Fortschritt hier kurz teilen.

Hostsystem:
iGPU eines AMD Ryzen 7 9700X
  • AMD Radeon(TM) Graphics
PCIe
  • NVIDIA Quadro M2000

Ziel war es die NVIDIA Quadro einer VM zur Verfügung zu stellen.
Ich würde sagen, das ist geglückt:

screen1

screen2

Hier ein kleines HowTo, vielleicht hilft es jemandem.

Informationen
Bei NVIDIA lässt sich über die Powershell mit nvidia-smi einiges zur Grafikkarte auslesen:
nvidia-smi
Fri Dec  6 20:16:14 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 553.35                 Driver Version: 553.35         CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                     TCC/WDDM  | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  Quadro M2000                 WDDM  |   00000000:01:00.0 Off |                  N/A |
| 56%   32C    P8             12W /   75W |       0MiB /   4096MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

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

Um zu erfahren, 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-dc84
                       5897dd59}\GPUPARAV
ValidPartitionCounts : {32}

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

Mein erster Versuch ging also wie von Microsoft beschrieben mit:
Add-VMGpuPartitionAdapter -VMName Test
eine GPU zur VM "Test" zuzuweisen, ein anschließender Check in der Powershell zeigte aber keine sinnvolle Ausgabe:
PS C:\Users\Administrator> Get-VMGpuPartitionAdapter -VMName Test | FL InstancePath,PartitionId,PartitionVfLuid

InstancePath    :
PartitionId     :
PartitionVfLuid :
Die VM ließ sich aber problemlos starten und zeigte im Geräte-Manager die AMD iGPU, also grundlegend passiert da etwas.
Da ich die AMD iGPU aber nicht wollte, habe ich diese wieder entfernt:
Remove-VMGpuPartitionAdapter -VMName Test
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 TaskManager 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 der VM gemountet, die Treiberdateien eingefügt und die VHD wieder getrennt.
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

Der Standardbefehlt lautet -GPUName "AUTO", damit wird aber in meinem Fall wieder die AMD als Grafikkarte angenommen.

Da wie oben bildlich zu sehen nicht nur der Geräte-Manager die Grafikkarte zeigt, sondern auch die Auslastung am Host im Task-Manager korrekt zu sehen ist und jeder weiß, dass sich Furmark standardmäßig in einer VM nicht starten lässt, bin ich nun erstmal guter Dinge, dass das hier erfolgreich weitergeht. face-smile

Grüße
ToWa

Quellen:

Content-ID: 670034

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

Ausgedruckt am: 07.01.2025 um 18:01 Uhr

MysticFoxDE
MysticFoxDE 09.12.2024 um 06:51:22 Uhr
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 09.12.2024 aktualisiert um 12:11:22 Uhr
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 09.12.2024 um 12:22:54 Uhr
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 09.12.2024 um 14:06:40 Uhr
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 10.12.2024 um 07:48:11 Uhr
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