Server/Windows Server

Hyper-V GPU-P로 VDI GPU 할당하기

Coppermine-SP 2026. 6. 12. 10:42

개요

필자가 Virtual machine-based Remote Desktop Service를 구축하면서 가장 고민했던 문제는 각 Virtual Desktop에 GPU 자원을 할당하는 것이다.

필자가 구축하려는 환경은 사용자 수가 적고(3~4명) 각 사용자가 고성능을 요구하는 시나리오이기 때문에 워크스테이션 메인보드에 고성능 데스크톱 CPU를 조합한 구성이다. 2CPU 구성과 같이 PCI 레인이 충분하지 않기 때문에 각 VM당 물리 GPU 1개씩을 DDA로 할당하는 것도 불가능하다.

그래서 그래픽 가속 성능을 크게 요구하는 2명의 사용자는 NVIDIA Quadro GPU를 DDA로 직접 할당하고, 그래픽 가속 성능이 크게 중요하지 않은 나머지 2명의 사용자는 AMD Integrated GPU를 GPU-P로 파티셔닝해 할당하기로 하였다.


GPU-P에 대하여

GPU-P(GPU-PV)는 Windows Server 2025 Hyper-V에서 물리 GPU를 다중의 VM에 파티셔닝하는 기술이다. 각 VM은 물리 GPU 컴퓨팅 자원의 일부를 독립적으로 사용할 수 있다.

  • 게스트 OS는 Windows 11 또는 Windows Server 2025이어야 한다.
  • CPU가 IOMMU를 지원해야 한다.
  • 플랫폼이 Single-Root I/O Virtualization(SR-IOV)를 지원해야 한다.
  • 호스트 OS에 GPU가 마운트되어야 하고, 드라이버가 완전히 설치되어야 한다.
  • GPU가 파티셔닝을 지원해야 한다.
  • 호스트와 게스트 OS가 동일한 GPU 드라이버를 사용해야 한다.

게스트 파티션에서는 유저 모드 드라이버(UMD)는 기존의 드라이버를 그대로 사용하지만, 커널 모드 드라이버(KMD)는 Virtual Render Device가 역할을 대신한다. 이것은 게스트 파티션의 유저 모드 GPU 드라이버에서 들어온 커널 콜을 VMBus를 통해 호스트의 커널 모드 GPU 드라이버로 전달한다.

호스트에서 각 게스트 파티션의 요청을 KMD에 전달하는 시분할 슬롯을 조정함으로써 성능 파티셔닝을 가능하게 한다. 이 때문에 호스트와 게스트 OS가 동일한 GPU 드라이버를 사용해야 한다.

Windows Server 2008 R2에서 제공되었던 RemoteFX는 가상 vGPU 계층을 완전히 구현한 가상 GPU이고, GPU-P는 기존 드라이버 스택을 이용하는 Paravirtualization이다.


GPU-P 구성하기

Microsoft 공식 문서에서는 GPU-P를 지원하는 GPU 목록을 상당히 제한적으로 두고 있지만, 실제로는 소비자용 그래픽카드도 GPU-P를 기술적으로 지원하는 것으로 보인다.

호스트에서 아래 Powershell 명령어로 파티셔닝 가능한 GPU 목록을 조회한다.

[HV-2]: PS C:\Users\copperminesp\Documents> Get-VMHostPartitionableGpu


Name                          : \\?\PCI#VEN_1002&DEV_13C0&SUBSYS_88771043&REV_C2#4&1ebe6a9c&0&0041#{064092b3-625e-43bf-
                                9eb5-dc845897dd59}\GPUPARAV
ValidPartitionCounts          : {32}
PartitionCount                : 32
TotalVRAM                     : 1000000000
AvailableVRAM                 : 1000000000
SupportsIncomingLiveMigration : False
MinPartitionVRAM              : 0
MaxPartitionVRAM              : 1000000000
OptimalPartitionVRAM          : 1000000000
TotalEncode                   : 18446744073709551615
AvailableEncode               : 18446744073709551615
MinPartitionEncode            : 0
MaxPartitionEncode            : 18446744073709551615
OptimalPartitionEncode        : 18446744073709551615
TotalDecode                   : 1000000000
AvailableDecode               : 1000000000
MinPartitionDecode            : 0
MaxPartitionDecode            : 1000000000
OptimalPartitionDecode        : 1000000000
TotalCompute                  : 1000000000
AvailableCompute              : 1000000000
MinPartitionCompute           : 0
MaxPartitionCompute           : 1000000000
OptimalPartitionCompute       : 1000000000
CimSession                    : CimSession: .
ComputerName                  : HV-2
IsDeleted                     : False
이 예시에서 GPU가 보고한 TotalEncode, TotalDecode, TotalCompute가 유의미한 값이 아닌 것은 해당 GPU가 정식적으로 파티셔닝을 지원하지 않기 때문에 드라이버에서 정량적 파티션 Capacity를 의미있게 노출하지 않는 것으로 봐야한다.

즉, 이 GPU는 VM에게 고정된 할당량을 부여할 수 없다는 것이다.

이 AMD Integrated GPU는 32개로 파티셔닝할 수 있다. 파티션 수는 임의로 지정할 수 없고 지원 가능한 파티션 수를 그대로 사용해야 한다.

호스트에서 아래 명령으로 GPU를 파티셔닝한다.

[HV-2]: PS C:\Users\copperminesp\Documents> Set-VMHostPartitionableGpu -Name "\\?\PCI#VEN_1002&DEV_13C0&SUBSYS_88771043&REV_C2#4&1ebe6a9c&0&0041#{064092b3-625e-43bf-9eb5-dc845897dd59}\GPUPARAV" -PartitionCount 32

호스트에서 아래 명령으로 VM에 MMIO 공간을 할당하고 GPU를 할당한다.

$vm = "<VM Name>"

Set-VM -Name $vm -AutomaticStopAction TurnOff
Set-VM -GuestControlledCacheTypes $true -VMName $vm
Set-VM -LowMemoryMappedIoSpace 3Gb -VMName $vm
Set-VM -HighMemoryMappedIoSpace 33280Mb -VMName $vm
Add-VMGpuPartitionAdapter -VMName $vm

이제 대상 게스트의 전원을 켜면 Device Manager에 Display Adapter가 인식될 것이다.

하지만 장치가 Code 43 오류로 인해 시작할 수 없다. AMD에서 아드레날린 소프트웨어를 설치하려고 해도 호환되는 장치가 없다고 나올 것이다.

호스트에서 파티셔닝한 GPU의 UMD를 게스트로 복사하여 해결해야 한다. 호스트에서 대상 GPU의 UMD를 찾아서 수동으로 게스트에 복사할 수도 있지만, 자동으로 이것을 해결해 주는 좋은 스크립트가 있으니 사용하도록 하자.

https://github.com/jamesstringer90/Easy-GPU-PV

 

GitHub - jamesstringer90/Easy-GPU-PV: A Project dedicated to making GPU Partitioning on Windows easier!

A Project dedicated to making GPU Partitioning on Windows easier! - jamesstringer90/Easy-GPU-PV

github.com

위 레포지토리를 호스트에 클론하고 아래 명령으로 게스트에 UMD를 복사한다.

./Update-VMGpuPartitionDriver -VMName "CLOUDPC-CLOUDINT-4" -GPUName "AMD Radeon(TM) Graphics"

주의할 것은 명령 인수 GPUName은 Get-VMHostPartitionableGpu cmdlet에서 구한 Name이 아닌 Device Manager에서 표시되는 이름이다.

 

이제 두 VM에서 하나의 GPU를 파티셔닝해서 동시에 사용할 수 있다. Set-VMGpuPartitionAdapter cmdlet으로 정확하게 각 VM이 제한된 할당량을 가지도록 구성할 수 있다.

https://learn.microsoft.com/en-us/powershell/module/hyper-v/set-vmgpupartitionadapter?view=windowsserver2025-ps