В ранних версиях Hyper-V для клиентских версий Windows 10 была возможность простого проброса дискретной видеокарты с помощью установки видеоадаптера RemoteFX. В актуальных версиях эта возможность исчезла, а документированный способ с помощью DDA (Discrete Device Assignment) подходит только для серверных версий системы. Однако, возможность подключения физической видеокарты компьютера в Hyper-V имеется.
В этой инструкции пошагово о том, как пробросить видеокарту компьютера в Hyper-V в Windows 11 или Windows 10 с использованием GPU Partitioning и какие особенности использования виртуальной машины при этом возникают. Близкая тема: Как пробросить USB накопители и другие устройства в Hyper-V. Создание виртуальных машин Hyper-V описано в этой инструкции.
Требования для подключения видеокарты в Hyper-V
Прежде чем приступить непосредственно к пробросу видеокарты, о том, какие условия должны выполняться для использования этой возможности:
- В виртуальной машине должна быть установлена Windows 10 (не ниже 20H1) или Windows Рекомендуется использование одинаковых версий системы (например, 22H2) на хосте и в виртуальной машине.
- Должно использоваться 2-е поколение виртуальной машины.
- После проброса создание контрольных точек будет недоступно (вариант решения будет представлен далее в статье). Если контрольные точки создаются автоматически, это может приводить к сбою виртуальной машины.
- Параллельная работа WSL (Windows Subsystem for Linux) и проброса видеокарты с использованием GPU-P может привести к сбоям (в частности, ошибка с кодом 43 в виртуальной машине).
Для проверки возможности использования видеокарты в Hyper-V посредством GPU Partitioning, вы можете использовать следующие команды PowerShell (от имени администратора), первая — для Windows 10, вторая — для Windows 11:
Get-VMPartitionableGpu
Get-VMHostPartitionableGpu
Если в результате выполнения команд вы видите список видеоадаптеров и информацию о них, можно продолжать.
Порядок проброса видеокарты в Hyper-V с помощью Easy-GPU-PV
Для подключения дискретной или интегрированной видеокарты в Hyper-V в этом примере будут использоваться готовые сценарии PowerShell Easy-GPU-PV, доступные в GitHub разработчика — зайдите на страницу, нажмите по кнопке «Code», скачайте ZIP-архив и распакуйте в удобное расположение на вашем компьютере.
Шаги для проброса видеокарты в Hyper-V:
- Выключите виртуальную машину, если она работает.
- Запустите Терминал или PowerShell от имени Администратора (правый клик по кнопке «Пуск» и выбор соответствующего пункта меню) и используйте следующие две команды для разрешения исполнения неподписанных скриптов:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
- Перейдите в каталог с извлеченными файлами Easy-GPU-PV с помощью команды
cd ПУТЬ_К_ПАПКЕ
- Выполните следующую команду, заменив имя виртуальной машины на нужное:
Update-VMGpuPartitionDriver.ps1 -VMName "ИМЯ_ВИРТУАЛЬНОЙ_МАШИНЫ" -GPUName "AUTO"
- Если команда из 4-го пункта выполняется с ошибками, возможны два варианта решения. При наличии на диске виртуальной машины нескольких разделов с буквами (помимо скрытых разделов) — удалить разделы кроме системного или установить для них атрибут «Скрытый»), выключить виртуальную машину и снова выполнить команду. В случае, если в виртуальной машине есть лишь один видимый раздел с Windows, смонтируйте VHDX с системой на хосте, назначьте букву этому разделу, размонтируйте виртуальный диск и снова выполните команду. Ещё один вариант — вручную задать букву диска, под которой монтируется системный диск в файле сценария PowerShell.
- Создайте файл .ps1 со следующим кодом, заменив имя виртуальной машины на нужное в первой строке и запустите его в PowerShell от имени Администратора:
$vm = "ИМЯ_ВИРТУАЛЬНОЙ_МАШИНЫ" 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
- Запустите виртуальную машину и проверьте доступность дискретной видеокарты в диспетчере устройств.
Если всё прошло успешно, с большой вероятностью, эффект от использования видеокарты в виртуальной машине вы увидите сразу — например, будут включены эффекты прозрачности и скругленные углы в Windows 11, отключенные в Hyper-V по умолчанию. Но следует учитывать, что при использовании видеокарты в Hyper-V есть некоторые особенности.
Особенности работы видеокарты в Hyper-V
Сначала о базовых нюансах после успешного проброса видеокарты в виртуальную машину Hyper-V:
- При обновлениях драйвера видеокарты на хосте, используйте команду (при выключенной виртуальной машине)
Update-VMGpuPartitionDriver.ps1 -VMName "ИМЯ_ВМ" -GPUName "AUTO"
- В диспетчере устройств в виртуальной машине в качестве драйвера будет отображаться не драйвер NVIDIA, а специальный драйвер Microsoft, и такие инструменты как панель управления NVIDIA не будут доступны.
- Для подключения к виртуальной машине с видеокартой разработчиком скрипта рекомендуется использовать ПО Parsec вместо стандартных средств подключения (но это не обязательно): для обеспечения лучшей производительности при подключении, отмены ограничения в 30 FPS и ограничений разрешения. Однако следует учитывать, что Parsec может не работать с виртуальной машиной с подключенной дискретной видеокартой ноутбука, а также ограничивать выбор разрешений в бесплатной версии для виртуальных машин без физического монитора (одно из решений предполагает установку виртуального монитора в виртуальной машине, подробнее — здесь)
- После подключения видеокарты контрольные точки для виртуальной машины создавать не получится. Одно из решений — временно отключать, а затем — вновь включать GPU Partitioning, обязательно при выключенной виртуальной машине. Достаточно использовать следующие команды в PowerShell, создав контрольную точку после выполнения первой из них
Remove-VMGpuPartitionAdapter -VMName "ИМЯ_ВИРТУАЛЬНОЙ_МАШИНЫ" Add-VMGpuPartitionAdapter -VMName "ИМЯ_ВИРТУАЛЬНОЙ_МАШИНЫ"
- В диспетчере задач в виртуальной машине GPU и его загрузка отображаться не будут.
Теперь о более насущных вещах, таких как работа игр и других программ, требующих ускорение видеокарты для работы:
- Игры и ПО, использующие API Vulkan, работать не будут, даже после установки VulkanRT.
- Некоторые игры и приложения OpenGL также могут не работать. В некоторых случаях может помочь установка OpenCL and OpenGL Compatibility Pack из Microsoft Store в виртуальной машине.
- Игры и ПО, принудительно выполняющие проверку совместимости графического оборудования при запуске, могут не запуститься, поскольку информация о подключенной видеокарте, отдаваемая гостевой системой, будет отличаться от таковой при её же использовании на хосте.
В моем тесте (Ноутбук, Windows 11 22H2, NVIDIA RTX 3060) проброс видеокарты удалось успешно выполнить. В дальнейшем для подключения к виртуальной машине использовались стандартные средства Hyper-V. Был опробован запуск:
- Небольшие любительские проекты на Unity и Unreal Engine с использованием RTX — успешно, всё работает без каких-либо проблем, при 30 FPS (ограничение подключения).
- Создание RAM-диска в памяти видеокарты из виртуальной машины — работает.
- Браузерные приложения, требующие аппаратного ускорения — работают отлично.
- Quake 2 RTX — без результата, так как используется Vulkan, а поддержка этого API отсутствует.
- Технологические демо от NVIDIA — неудачно, активно проверяют установленное оборудование при запуске.
Надеюсь, для кого-то из читателей инструкция будет полезной, а видеокарта в Hyper-V будет работать для выполнения актуальных задач.
В предыдущих версиях Hyper-V (начиная с Windows 7/Windows Server 2008R2) для проброса дискретной видеокарты с хоста в виртуальную машину можно было использовать технологию RemoteFX vGPU. Однако, начиная с Windows 10 1809 и Windows Server 2019, Майкрософт отключило поддержку RemoteFX. Вместо нее предлагается использовать новую технологию Discrete Device Assignment (DDA).
Содержание:
- Проброс видеокарты в виртуальную машину на Windows Server с Hyper-V
- Использование GPU в виртуальных машинах Hyper-V на Windows 10/11
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.
Либо вы можете получить это значение с помощью 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.
Драйвера видеокарты должны быть предварительно установлены в ВМ.
Чтобы отключить 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).
Для проброса видеокарты в ВМ используется командлет Add-VMGpuPartitionAdapter. Чтобы скопировать драйвера видеокарты с хоста Hyper-V в виртуальную машину нужно использовать скрипт Easy-GPU-PV (https://github.com/jamesstringerparsec/Easy-GPU-PV).
Скачайте ZIP архив с скриптом и распакуйте его в папку на хосте Hyper-V.
Откройте консоль PowerShell с правами администратора и разрешите запуск PowerShell скриптов в текущей сессии (подробнее о PowerShell Execution Policy):
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass –Force
Выполняйте скрипт:
.\Update-VMGpuPartitionDriver.ps1 -VMName VMName -GPUName "AUTO"
Скрипт скопирует драйвера видеокарты с хоста в ВМ.
Теперь осталось настроить ВМ и пробросить в нее 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"
Как ни крути, возможности систем виртуализации что до использования ими ресурсов «железа» ограничены, поэтому не стоит удивляться тому, что большая часть графических API не работает в VMware, VirtualBox или Hyper-V. Кстати, именно по этой причине в установленной на виртуальную машину Windows 11 могут быть недоступны такие эффекты как скругление окон.
Ничего личного, только бизнес
Что лежит в основе этих ограничений? В первую очередь политика производителей видеокарт и разработчиков систем виртуализации. Так, для виртуализации графических вычислений компания NVidia предлагает использовать специальные видеокарты GRID K1 и K2, стоимость которых значительно превышает стоимость «обычных» видеокарт. Если NVidia реализует возможность проброса в ВМ недорогих видеокарт, то кто станет покупать топовые?
Предложение от Hyper-V
Тем не менее, кое-что сделать таки можно. В отличие от VMware и VirtualBox, проброс дискретной видеокарты поддерживается системой Hyper-V, хотя опять же и не без ограничений. В ранних версиях Windows 10 для этого использовалась технология RemoteFX, в актуальных сборках Windows 10, а также в Windows 11 это решение не работает, и для задействования ресурсов физической видеокарты нужно использовать сторонние инструменты.
Сразу нужно отметить, что предлагаемое ниже решение имеет ряд ограничений, а именно:
- В Hyper-V допускается использование только Windows 10 20H1 и выше.
- Метод не поддерживается первым поколением виртуальных машин.
- После проброса возможны конфликты при параллельной работе ВМ и WSL.
- Функция создания контрольных точек для виртуальной машины будет отключена.
Если условия вас устраивают, следуйте дальнейшим инструкциям. Для начала убедитесь в возможности подключения видеокарты к Hyper-V, для чего запустите PowerShell от имени администратора и выполните команду Get-VMPartitionableGpu или Get-VMHostPartitionableGpu, если у вас Windows 11. В случае успеха в консоль будет выведен список видеоадаптеров и их свойств.
Затем:
- Скачайте со страницы разработчика github.com/jamesstringerparsec/Easy-GPU-PV архив с готовыми скриптами подключения видеокарты и распакуйте его в удобное расположение.
- Завершив работу виртуальной машины, откройте от имени администратора PowerShell и разрешите командами Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser и Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass выполнение в системе неподписанных сценариев.
- Командой cd путь перейдите в папку с содержимым распакованного архива Easy-GPU-PV-main.zip и выполните команду Update-VMGpuPartitionDriver.ps1 -VMName «NameMyVm» -GPUName «AUTO», где NameMyVm – название вашей виртуальной машины.
В случае успешного выполнения команды вы получите конкретный результат, например, появление ранее недоступных эффектов прозрачности в виртуальной ОС.
Ограничения проброса
Ожидать, что в случае удачного проброса видеокарты в Hyper-V виртуальная система сможет использовать все возможности графики, не стоит. Значительная их часть доступны по-прежнему не будут, в частности недоступными окажутся инструменты панелей управления графикой (NVIDIA или AMD), статистические данные загрузки GPU в Диспетчере задач, не будут работать также программы и функции, использующие Vulkan и некоторые другие популярные графические API.
Загрузка…
В общем-то не удивительно, что тема набирает популярность — задача иметь линух на хосте и полноценную игровую машину на винде гостем (или как здесь — винда в винде) для того, чтобы разделить мух и котлет все интереснее, тем более, что видеокарты все мощнее.
Вот только производители видеокарт тоже об этом знают и нифига этому не рады Да и производители гиперов тоже не сидят на месте.
Чтоюы видюха могла полностью использоваться виртуалкой — ее нужно просунуть туда целиком, как устрйоство, чтобы виртуалка ее нашла и поставила дрова. Мне известна только одна комбинация железа, гипера и оси, где по неподтвержденным данным этот финт ушами канает — видюха от ATI (НЕ NVidia!), гипер KVM, линух хостом, винда гостем.
Какое-то время я пробовал сам, но нифига не преуспел — в KVM видюха пробрасывается, но винда нифига не запускает дрова (потому что NVidia противодействует этому. Намеренно.) в ESXi дрова ставятся, но как «переключить» на нее «монитор» я так и не понял. В Hyper-V же я не уверен, что даже пробросить удастся.
Там статья по ссылке выше. Ее конечно стоит прочитать, но исключительно для самообразования, потому что автор скромно умолчал, сколько стоит GRID K1/K2 карта. Для справки — GRID K1 — порядка 200 тыс руб, GRID K2 — порядка 400 тыс
Пруф
Any IT admin knows that desktop performance must be high quality to provide quality UX, and in some cases, admins may need to configure GPU passthrough for power user virtual desktops.
When a virtual desktop needs to run graphically intensive workloads, admins may want to assign a GPU to those virtual desktops.
As a virtual desktop administrator, you can ensure the VM or virtual desktop makes direct use of your server’s physical graphics card. The exact method for mapping a physical GPU to a virtual desktop varies, depending on the type of virtualization host that you are using. This article examines a procedure that you can use for virtual desktops running on top of Microsoft’s Hyper-V.
At one point, the preferred method for tying a GPU to a Hyper-V virtual desktop involved RemoteFX. Starting with Microsoft Windows Server 2016, however, this is no longer an option. If you have Hyper-V virtual desktops that are currently configured to use RemoteFX, you can continue to do so. However, you will not be able to assign a RemoteFX 3D video adapter to a newly created VM (Figure 1).
The new method of assigning a GPU to a Hyper-V virtual desktop — also known as GPU passthrough — relies on Discrete Device Assignment (DDA). DDA enables Peripheral Component Interconnect Express hardware — particularly graphics adapters and non-volatile memory express (NVMe) storage devices — to be directly accessible with a virtual desktop.
GPU passthrough setup with Hyper-V
The first step in GPU passthrough for Hyper-V is to set the virtual desktop’s automatic stop action to Turn Off. One approach you could take is to map the VM name to a variable named VM$ because assigning a GPU is a per-VM operation and GPU passthrough will reference the VM name several times. If you wanted to set the VM name to Demo, for example, you could use this command:
$VM='Demo'
While you are at it, you will need to enable write combining for the CPU. Here is the command that you will need to use:
Set-VM $VM -GuestControlledCacheTypes $true
The new method of assigning a GPU to a Hyper-V virtual desktop — also known as GPU passthrough — relies on Discrete Device Assignment.
Next, you will need to determine the GPU’s location. The easiest way to do this is to open Hyper-V Device Manager and then locate the specific GPU that you plan to allocate.
Next, you will need to right-click on the device and choose the Properties command from the shortcut menu. When the resulting Properties sheet opens, go to the Details tab, and select the Location Paths option from the Property drop-down. Now, right-click on the value that begins with PCIROOT, and then choose the Copy command from the shortcut menu (Figure 2).
Once you have copied the device location to the Windows clipboard, open an elevated PowerShell session. You will want to map the location to a variable. The command should look something like this, with your GPU location following the = sign:
$Location = 'PCIROOT(0)#PCI(0300)#PCI(0000)'
The next step in the process is to configure threshold values for memory-mapped I/O (MMIO). This is memory that will allow the device to be accessible. You will need to configure this threshold on a per-virtual desktop basis.
The Windows OS already reserves some MMIO space by default. It sets the low value to 128 MB and the high value to 512 MB. Depending on the GPU that your virtual desktop will use, this may be sufficient. However, higher-end GPUs — such as some of the Nvidia models — require you to assign additional MMIO. Microsoft provides a Machine Profile Script that you can download and run to determine how much MMIO your GPU will require.
Once you know how much MMIO is needed, it’s time to assign the MMIO to the virtual desktop that will be using the GPU. For example, say that you need to set the low range of the MMIO to 512 MB and the high range MMIO to 1 GB (Figure 3). The commands for doing so would look like this:
Set-VM $VM -LowMemoryMappedIoSpace 512MB
Set-VM $VM -HighMemoryMappedIoSpace 1GB
The last steps in the process are to disassociate the device from the host OS and then associate it with the VM. Here are the commands used to do so:
Dismount-VMHostAssignableDevice -force -LocationPath $Location
Add-VMAssignableDevice -LocationPath $Location -VMName VMName
As you can see, GPU passthrough for a Hyper-V VM can be a tedious process. If you need some extra help, check out this script provided by Microsoft, which can help automate the process. The script is geared toward a virtual server environment, but it is easy for IT admins to adapt it for use of virtual desktops.
Next Steps
Assign GPUs to virtual machines with VMware vGPU mode
Dig Deeper on Virtual and remote desktop strategies
-
Map physical GPUs to VMs with this GPU passthrough guide
By: Brien Posey
-
Assign GPUs to virtual machines with VMware vGPU mode
By: Stephen Bigelow
-
VMware vSphere Bitfusion accelerates ML and AI workloads
By: Vladan Seget
-
OpenShift Virtualization 2.5 simplifies VM modernization
By: Paul Ferrill