Проброс видеокарты (GPU) в виртуальную машину Hyper-V

Проброс видеокарты (GPU) в виртуальную машину Hyper-V

В предыдущих версиях Hyper-V (начиная с Windows 7/Windows Server 2008R2) для проброса дискретной видеокарты с хоста в виртуальную машину можно было использовать технологию RemoteFX vGPU. Однако, начиная с Windows 10 1809 и Windows Server 2019, Майкрософт отключило поддержку RemoteFX. Вместо нее предлагается использовать новую технологию Discrete Device Assignment (DDA).

DDA позволяет пробросить PCI/PCIe устройства (включая GPU, NVMe) с хоста в виртуальную машину Hyper-V.

Основные требования к инфраструктуре для использования DDA в Hyper-V:

  • Доступно только для виртуальных машин Hyper-V второго поколения (Gen 2);
  • На ВМ должно быть отключены динамическая память и чекпоинты;
  • Физическая карта должна поддерживать технологию GPU Partitioning;
  • Если на хосте развернута среда WSL (Windows Subsystem for Linux), то при пробросе видеокарты с помощью GPU-P, в ВМ может появляться ошибка видеокарты с кодом 43;
  • Хотя SR-IOV (Single Root Input/Output Virtualization) не заявлена в требованиях DDA, без ее поддержки проброс GPU в ВМ работает не корректно.

Discrete Device Assignment доступна только в Windows Server с ролью Hyper-V. В десктопных версиях Windows 10/11 для предоставления общего доступа к видеокарте в виртуальных машинах можно использовать GPU Partitioning. В этой статье мы покажем, как пробросить видеокарту в виртуальную машину на Hyper-V.

Проброс видеокарты в виртуальную машину на Windows Server с Hyper-V

Discrete Device Assignment (DDA) позволяет пробросить PCIe устройства в виртуальную машину во всех версиях Windows Server, начиная с 2016.

Перед пробросом GPU в ВМ, нужно изменить ее конфигурацию.

Отключить автоматическое создание снапшотов (описано в статье об управлении запуском и порядке загрузки ВМ на Hyper-V):

Set-VM -Name VMName -AutomaticStopAction TurnOff

Настроить кэш и лимиты памяти для 32-разрядного пространства MMIO:

Set-VM -Name VMName -GuestControlledCacheTypes $True -LowMemoryMappedIoSpace 3Gb -HighMemoryMappedIoSpace 33280Mb

Затем нужно получить физический путь к PCIe устройству видеокарты на хосте Hyper-V. Для этого нужно открыть свойства GPU в диспетчере устройств, перейти на вкладку Details и выбрать свойство Location paths. Скопируйте значение, которое начинается с PCIROOT.

Получить PCI путь к видеокарте

Либо вы можете получить это значение с помощью PowerShell:
Get-PnpDevice | Where-Object {$_.Present -eq $true} | Where-Object {$_.Class -eq "Display"}|select Name,InstanceId

Отключить эту видеокарту на сервере Hyper-V в диспетчере устройств или с помощью PowerShell:

Dismount-VmHostAssignableDevice -LocationPath "PCIROOT(0)#PCI(0300)#PCI(0000)" –force

Теперь нужно пробросить GPU адаптер в виртуальную машину:

Add-VMAssignableDevice -VMName VMName -LocationPath "PCIROOT(0)#PCI(0300)#PCI(0000)"

Затем включите ВМ и проверьте, что ваша видеокарта появилась в диспетчере устройств в разделе Display Adapters вместе с устройством Microsoft Hyper-V Video.

Доступ к физической вдиеокарте из виртуальной машины Hyper-V

Драйвера видеокарты должны быть предварительно установлены в ВМ.

Чтобы отключить GPU от ВМ и подключить его к хосту:

Remove-VMAssignableDevice -VMName VMName -LocationPath $locationPath
Mount-VMHostAssignableDevice -LocationPath $locationPath

Использование GPU в виртуальных машинах Hyper-V на Windows 10/11

GPU Partitioning (GPU-P) доступно в виртуальных машинах Hyper-V на Windows 10/11, начиная с билда 1903. Проверьте, что ваша видеокарта поддерживает режим GPU Partitioning с помощью команды Get-VMPartitionableGpu (Windows 10) или Get-VMHostPartitionableGpu (для Windows 11).

Get-VMPartitionableGpu - проверить поддержку GPU Patritioning в Hyper-V

Для проброса видеокарты в ВМ используется командлет Add-VMGpuPartitionAdapter. Чтобы скопировать драйвера видеокарты с хоста Hyper-V в виртуальную машину нужно использовать скрипт Easy-GPU-PV (https://github.com/jamesstringerparsec/Easy-GPU-PV).

Скачайте ZIP архив с скриптом и распакуйте его в папку на хосте Hyper-V.

Скрипт Easy-GPU-PV для Hyper-V

Откройте консоль PowerShell с правами администратора и разрешите запуск PowerShell скриптов в текущей сессии (подробнее о PowerShell Execution Policy):

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass –Force

Выполняйте скрипт:

.Update-VMGpuPartitionDriver.ps1 -VMName VMName -GPUName "AUTO"

Скрипт скопирует драйвера видеокарты с хоста в ВМ.

Update-VMGpuPartitionDriver.ps1 - скопировать драйвера видеокарты в виртуальную машину Hyper-V

Теперь осталось настроить ВМ и пробросить в нее GPU:

Set-VM -VMName VMName -GuestControlledCacheTypes $true -LowMemoryMappedIoSpace 1Gb -HighMemoryMappedIoSpace 32Gb
Add-VMGpuPartitionAdapter -VMName VMName

Если вы обновили драйвера видеокарты на хосте Hyper-V, нужно обновить их в ВМ:

.Update-VMGpuPartitionDriver.ps1 -VMName VM Name -GPUName "AUTO"

PowerShell
Проброс видеокарты (GPU) в виртуальную машину Hyper-V