"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

GPU-Virtualisierung in Hyper-V

mr.nice. 29.11.2022 - 10:40 3745 6
Posts

mr.nice.

Moderator
differential image maker
Avatar
Registered: Jun 2004
Location: Wien
Posts: 6481
Hallo Leute,
ich bin in den letzten Tagen auf ein ziemlich interessantes Thema gestoßen, das sich mit aktuellen Windows Professional Versionen und ein paar Powershell-Skripts relativ leicht in die Tat umsetzen lässt.
Und zwar geht es um die Paravirtualisierung der Grafikkarte in Hyper-V, mit dem Ziel die 3D-Beschleunigungs-Funktionalität sowohl dem Virtualisierer (Host), als auch darauf laufenden virtuellen Maschinen (Clients) zu Verfügung zu stellen.

Hardwaremäßig besteht mein Setup aus dem Laptop "Asus ROG Strix G15 Advantage Edition G513" mit 5900HX CPU, RX6800M GPU und 64 GB RAM als Host und dem HP Elite X2, das auf die VM zugreift. Beim Client ist es eigentlich nur wichtig, dass dieser H.264 oder H.265 decoding in Hardware kann, 5 Ghz WiFi ist für niedrigere Latenz auch von Vorteil. Dadurch, dass der Laptop keinen MUX-Switch hat, bin ich auf keine großen Probleme gestoßen. Das einzige was dazu notwendig war um ein Bildschirmsignal zu erhalten war, dass ich beide Grafikadapter an die VM durchreichen musste. Zuerst habe ich die RX6800M per easy-gpu-pv Setup an die VM angebunden und dann habe ich händisch nach dem shutdown der VM, mit
Code:
Add-VMGpuPartitionAdapter -VMName $vm
die zweite GPU hinzugefügt, die den Namen AMD Radeon(TM) Graphics trägt und eigentlich in der CPU sitzt. Der virtuellen Maschine habe ich 8 logische Kerne, 16 GB RAM und 250 GB auf der NVMe Disk zugewiesen.

Wenn man in den VMs spielen will, ist es von Vorteil etwas anderes als RDP zu verwenden, denn z.B. FullHD @ 60 Hz sind mit dem Remote Desktop Protokoll aktuell noch nicht möglich. Ein schöner Nebeneffekt an dem GPU-Passthrough ist die Tatsache, dass auch die Video-Encoding Engine zur Verfügung steht und einer Fernsteuerungsmöglichkeit mit niedriger Latenz und umgeleiteter Tonausgabe somit kein gravierendes Hindernis im Weg ist.

Es gibt hier verschiedene Möglichkeiten dies technisch umzusetzen und ich will keine Empfehlungen aussprechen, mir bekannte Programme dafür sind:
AMD Link
Nvidia Gamestream
Sunshine (game stream host)
Moonlight (game stream client)
Parsec (game stream client + host + relay server)

Ich habe mich für den proof-of-concept für Parsec entschieden, da dies für Privatanwender kostenfrei nutzbar ist und sich leicht implementieren ließ, es fungiert sowohl als relay server für eine verschlüsselte P2P-Verbindung zwischen Host und Client und es kümmert sich um Video en- und decoding, wie auch Ton und Eingabegeräte. Die Umsetzung habe ich mit Windows 11 Professional am Host und in der VM gemacht, als erstes galt es das Hyper-V Feature am Host zu aktivieren. Easy-GPU-PV und die beinhalteten Powershell Skripts halfen mir enorm bei der weiteren Fertigstellung. Die Powershell Skripts erstellen die VM, partitionieren die GPU nach den eigenen Bedürfnissen, ich habe 50% gewählt, kopieren die Gerätetreiber in die dafür vorgesehenen Verzeichnisse, fügen die GPU der VM hinzu und installieren Windows und parsec in der VM.

Dann habe ich das OpenCL and OpenGL Compatibility Pack am Host und in der VM installiert und, was sonst, als erstes Quake 3 Gold Edition installiert. Was soll ich sagen, es funktioniert fast schon zu gut, die Quake 3 VM hat auf 1600x1200 @ 60Hz 32-Bit mit hohen Einstellungen noch nie mehr als 10% Last auf der RX6800M verursacht, man könnte vermutlich also eine ganze Menge VMs laufen lassen. Als nächstes habe ich Unreal Tournament GOTY Edition getestet, im Direct3D Modus 1920x1080 mit hohen Einstellungen waren es bis zu 25% Last auf der RX6800M.
Wenn die VM mit einem externen, virtuellen Hyper-V Switch verbunden ist, kann man auch gemeinsam im Internet spielen, man kann mit einem internen Switch auch eine eigene, virtuelle kleine LAN-Party machen. Die Blizzard Spiele die ich erfolgreich getestet habe sind: Starcraft Remastered, Heroes of the Storm, Diablo III, die restlichen Spiele funktionieren vermutlich auch. Was ich nicht auf Anhieb zum Laufen gebracht habe ist Diablo 2 Resurrected, das schmierte ab mit einem "Failed to Initialize Graphics Device". Was nicht gut funktioniert hat ist das Game-Verzeichnis des Hosts in die VM einzubinden um so Speicherplatz zu sparen, jede Game-Instanz will ihr eigenes Verzeichnis. Im 3DMark Time Spy hat die "Mystery Machine" 10600 Punkte erzielt.

Leider muss man sagen, es gibt einige Publisher die nicht wollen, dass man in virtuellen Maschinen spielt, z.B. League of Legends und World of Tanks ließen mich nicht auf die game server connecten. Also für alles lässt es sich nicht ohne weiteres verwenden, aber ältere Spiele mit eigenem LAN-Modus funktionieren viele und auch die von mir getesteten Blizzard-Spiele liefen ziemlich gut.

Hilfreiche Links:
https://learn.microsoft.com/en-us/w...-assignment-dda
https://www.tenforums.com/virtualiz...v-guest-vm.html
https://github.com/jamesstringerparsec/Easy-GPU-PV
https://www.computerweekly.com/de/r...er-V-einrichten
https://forum.level1techs.com/t/2-g...2234/255?page=1

Bearbeitet von mr.nice. am 09.12.2022, 23:36 (Tippfehler korrigiert)

Römi

Hausmeister
Avatar
Registered: Feb 2001
Location: Bez. Tulln
Posts: 5310
Schön wenn das jetzt ohne spezieller GPU und Treibern geht. Bilde mir aber ein gelesen zu haben dass M$ das Feature nicht auf den normalen Server OS unterstützt, nur mit dem azure Stack :( (https://learn.microsoft.com/en-us/a...th-clustered-vm).

Immerhin, fürn Heimgebrauch nicht schlecht (geht glaub ich nur mit Win10/11?). Kann man sicher mal brauchen, für zocken in einer VM hätt ich derzeit aber keinen Bedarf.
Bearbeitet von Römi am 30.11.2022, 09:50

UnleashThebeast

Mr. Midlife-Crisis
Avatar
Registered: Dec 2005
Location: 127.0.0.1
Posts: 3551
Zitat aus einem Post von mr.nice.
Leider muss man sagen, es gibt einige Publisher die nicht wollen, dass man in virtuellen Maschinen spielt, z.B. League of Legends und World of Tanks ließen mich nicht auf die game server connecten.

"anticheat" Schlangenöl.

charmin

Super Moderator
10x
Avatar
Registered: Dec 2002
Location: aut_sbg
Posts: 14664
CUDA geht halt nicht im Hyper V. Oder gibts da schon neuigkeiten?

mr.nice.

Moderator
differential image maker
Avatar
Registered: Jun 2004
Location: Wien
Posts: 6481
Da bin ich mir nicht so sicher charmin. CUDA geht in WSL2 und das lässt sich auch in einer Hyper-V Windows VM installieren, wenn du den GPU-Passthrough machst könnte das schon klappen. Außer Nvidia hat da irgendwelche extra Hürden eingebaut, was ihnen jedenfalls zuzutrauen ist. Wichtig ist prinzipiell, dass Host und VM das gleiche OS verwenden.

https://developer.nvidia.com/blog/a...em-for-linux-2/
Bearbeitet von mr.nice. am 30.11.2022, 10:20

charmin

Super Moderator
10x
Avatar
Registered: Dec 2002
Location: aut_sbg
Posts: 14664
Verwende cuda in wsl2. Bin damals zu erscheinen von wsl2 eben mit hyper v gescheitert.
Kann aber wie du sagst dran liegen dass ich Linux im hyper v verwendet hab und Ned dasselbe wie meinen Host, nämlich Windows.
Bin eh total zufrieden, mich hat's nur interessiert ob ich damals zu deppert war bzw ob sich da was getan hat :)

mr.nice.

Moderator
differential image maker
Avatar
Registered: Jun 2004
Location: Wien
Posts: 6481
Ach ja, beim sharing der 6800m kann es beim ersten Verbinden mit parsec zur VM zu einem bug kommen. Workaround: Beide GPUs in die VM einbinden und kurzzeitig am Host die APU-Grafikeinheit deaktiveren und reaktivieren.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz