C’è stato un tempo in cui era possibile condividere la scheda video fisica (Graphical Processing Unit GPU) con le macchine virtuali in Hyper-V. La funzionalità si chiamava RemoteFX vGPU ed era stata introdotta in Windows 7.

Quel tempo è però finito con Windows 10, versione 1809 e Windows Server 2019, quando Microsoft ha rimosso la funzionalità a causa di problemi di sicurezza, ben documentati alla pagina KB4570006: Update to disable and remove the RemoteFX vGPU component in Windows - Microsoft Support

Nelle versioni di Windows Server LTSC (Windows Server 2016, Windows Server 2019) and Windows Server SAC (Windows Server, version 1803 e successive) è stata introdotta una nuova tecnologia capace di avere delle vGPU sicure, chiamata Discrete Device Assignment (DDA), documentata alla pagina Deploy graphics devices using Discrete Device Assignment | Microsoft Learn

Grazie alla tecnologia Discrete Device Assignment (DDA) è possibile passare un intero dispositivo PCIe in una macchina virtuale. Ciò consente l'accesso ad alte prestazioni ai dispositivi come i dischi NVMe o le schede grafiche dall'interno di una macchina virtuale, consentendo di sfruttare i driver nativi dei dispositivi.

Il problema però è che Discrete Device Assignment (DDA) è disponibile solo in Hyper-V e non in Client Hyper-V, quello per intenderci disponibile in Windows 10 o in Windows 11.

 

In Windows 10 e in Windows 11 è però possibile utilizzare il GPU Partitioning (GPU-P) introdotto in Windows 10 Pro/Enterprise, versione 1903. Grazie al GPU Partitioning potete far vedere la scheda grafica fisica del vostro computer all’interno delle macchine virtuali Hyper-V.

È possibile aggiungere la scheda video alle VM utilizzando la cmdlet Add-VMGpuPartitionAdapter, che non è documentata da Microsoft. ☹

Tra i problemi che ho riscontrato è stato far funzionare i driver video all’interno della VM, che non possono essere installati nella Guest VM ma devono essere copiati dalla macchina host e incollati nella stessa posizione all’interno della VM.

Per fortuna mi sono imbattuto nel progetto Easy-GPU-PV: A Project dedicated to making GPU Partitioning on Windows easier!

Leggete le istruzioni riportate per assicurarvi di avere tutti i prerequisiti di utilizzo degli script messi a disposizione da James Stringer e dai suoi collaboratori.

 

Il progetto permette di semplificare di molto la GPU Paravirtualization in Windows Hyper-V in quanto si occuperà di copiare i driver dal vostro computer per poterli installare nella VM.

 

Prerequisiti

Prima di cominciare è necessario che:

  • La VM a cui volete collegare la scheda video sia di Generazione 2
  • La VM non usi la memoria dinamica e i checkpoint
  • La scheda video montata sull’host fisico suppporti la funzionalità di partizionamento (che permette la condivisione della scheda con le VM)

Per verificare se la scheda video possa essere partizionata potete lanciare il comando Get-VMPartitionableGpu (in Windows 10) oppure  Get-VMHostPartitionableGpu (in Windows 11). Nella figura sotto è mostrato l’output del comando effettuato su un mio host con Windows 10 22H2, che mostra che la mia GPU è partizionabile.

 

 

Figura 1: Output del comando Get-VMPartitionableGpu

 

A questo punto potete effettuare il download del progetto Easy-GPU-PV: A Project dedicated to making GPU Partitioning on Windows easier! ed estrarlo in una cartella dell’host Hyper-V.

 

 

 

Figura 2: Download del progetto Easy-GPU-PV

 

 

 

Figura 3: Contenuto del progetto Easy-GPU-PV

 

Eseguite da un prompt di PowerShell eseguito con privilegi elevati lo script .\Update-VMGpuPartitionDriver.ps1 -VMName "Nome della VM" -GPUName "AUTO" sostituendo il nome della VM da configurare. L’opzione -GPUName "AUTO" è obbligatoria in Windows 10 e serve a riconoscere la scheda video installata sull’host tramite lo script PreChecks.ps1, mentre in Windows 11 può essere sia AUTO che contenere il nome della scheda video.

Lo script si occuperà di spegnere la macchina virtuale (se è accesa), prelevare i driver della scheda video dal computer host e, dopo aver montato il disco VHD della VM, di copiare i driver nella stessa posizione all’interno della VM. La copia dei driver può durare alcuni minuti.

 

NOTA: Per poter eseguire lo script potrebbe essere necessario modificare la Execution Policy.

 

 

 

Figura 4: Esecuzione dello script che copia i driver della scheda video dall'host alla VM

 

Per poter aggiungere la scheda video alla VM, aprite un prompt di PowerShell (o PowerShell ISE) con privilegi elevati ed eseguite i seguenti comandi, ricordandovi di dare alla variabile $vm il nome della VM da configurare.

 

$vm = "Nome della VM da configurare"

if (Get-VMGpuPartitionAdapter -VMName $vm -ErrorAction SilentlyContinue) {

Remove-VMGpuPartitionAdapter -VMName $vm

}

Set-VM -GuestControlledCacheTypes $true -VMName $vm

Set-VM -LowMemoryMappedIoSpace 1Gb -VMName $vm

Set-VM -HighMemoryMappedIoSpace 32Gb -VMName $vm

Add-VMGpuPartitionAdapter -VMName $vm

 

 

 

Figura 5: Aggiunta della scheda video alla VM

 

Test di funzionamento

Quando accenderete la VM, aprendo Gestione periferiche, noterete che nella VM ci sarà la scheda video del vostro host, come mostrato in figura:

 

 

 

Figura 6: La scheda video è stata montata correttamente all'interno della VM

 

Ho anche eseguito un benchmark della scheda video all’interno della VM aprendo il browser e collegandomi alla pagina HTML5 Fish Bowl (testdrive-archive.azurewebsites.net). Configurate il parametro Fish su Auto per testare le performance della scheda video all’interno della VM.

 

 

 

Figura 7: Benchmark della scheda video all'interno della VM

 

Ho notato però che nel Task Manager della VM non ci sono i contatori relativi alla GPU. Tutto però funziona correttamente.

 

 

 

Figura 8: Nel Task Manager della VM non ci sono i contatori relativi alla GPU

 

Mettendo a confronto due macchine virtuali eseguite sullo stesso host, una con la GPU ed una senza, la differenza come potete vedere dalla figura sotto è notevole.

 

 

Figura 9: Due macchine virtuali eseguite sullo stesso host di virtualizzazione con Windows 10, una con la GPU ed una senza

 

Aggiornamento dei driver

È importante che aggiorniate i driver della VM quando effettuate l’aggiornamento dei driver video dell’host. L’aggiornamento va eseguito in questo ordine:

  1. Riavviate l’host dopo aver aggiornato i driver della GPU
  2. Aprite un prompt di PowerShell con privilegi amministrativi e lanciate nuovamente lo script .\Update-VMGpuPartitionDriver.ps1 -VMName "Nome della VM" -GPUName "AUTO"

 

Conclusioni

Questa procedura non è documentata da Microsoft e quindi non è supportata. Pertanto, non usatela in produzione! In ogni caso è davvero interessante poter avere anche all’interno delle macchine virtuali la capacità di computing della scheda video. 😊