자원 분할 할당 (MIG)
MIG(Multi-Instance GPU)를 지원하는 그래픽 카드는 자체적으로 GPU를 VM 에 분할 할당할 수 있는 기능을 제공한다. 기기에 따라 다르지만, NVidia의 GB200/B200/B100, H100, H200 같은 기종의 경우, 최대 7대까지 (자원을 분할하여) 그래픽카드를 일정 분배에 따라 나누어, 각각의 인스턴스에 분할하여 할당할 수 있는 기능을 드라이버 차원에서 제공한다.
다만, 일반 그래픽 카드의 경우는, 해당 기능을 제공하는 그래픽 카드는 존재하지 않으며, 가상 환경에 그래픽 카드를 할당 하려면, DDA (Discrete Device Assignment)와 같은 방법으로 디바이스 자체를 할당 시키는 방법을 통해 활용하는 방법을 선택해야 한다. 이때에도, MIG처럼 디바이스를 분할 하거나, 공유하지 못하고, 디바이스 전체를 공유해야 한다.
DDA 기능 활성화 방법
DDA 제한 해제
DDA를 설정하기 위해서는 해당 하드웨어 리소스를 가상 머신에 할당하기 위해 필요한 권한과 구성을 활성화 하기 위한 DDA 제한을 해제하는 과정을 진행해야 한다. DDA 제한 해제 설정의 주요 이유는 다음과 같다.
장치 접근 허용
기본적으로 Hyper-V는 특정 장치에 대한 직접 접근을 제한한다. DDA 제한 해제를 통해 Hyper-V가 GUP와 같은 장치를 VM에서 직접 할당할 수 있도록 함
리소스 분리
가상 머신이 호스트와는 독립적으로 하드웨어 리소스를 사용할 수 있도록 해주어 성능을 최적화 한다.
호환성
일부 GPU는 DDA를 통해 가상 머신에 할당되기 위해 추가적인 설정이나 드라이버 구성 요소가 필요할 수 있다. 이 설정을 통해 이러한 요구사항을 충족시킬 수 있다.
보안 및 격리
DDA 제한 해제를 통해 각 VM이 하드웨어 리소스를 독립적으로 사용할 수 있게 하여, 보안과 격리성을 강화한다. VM 간의 리소스 경합을 줄이는 데에도 도움이 된다.
제한 해제 방법
PowerShell – cmdlet을 사용하여 TurnOff를 Automatic Stop Action 에 대하여 설정한다.
Set-VM –Name VMName –AutomaticStopAction TurnOff
ex) Set-VM –Name TEST-MACHINE –AutomaticStopAction TurnOff
그래픽 장치를 위한 VM 준비
CPU에서 쓰기 결합을 활성화
Set-VM –GuestControlledCacheTypes $true –VMName VMName
32비트 메모리 맵핑 IO(MMI) 공간 구성
Set-VM –LowMemoryMappedIoSpace 3Gb –VMName VMName
32비트 이상의 MMIO 공간 구성
Set-VM –HighMemoryMappedIoSpace 33280Mb –VMName VMName
MMIO 메모리 Mapping
위에서 설정한 LowMamoryMappedIoSpace와 HighMemoryMappedIoSpace는 메모리 맵 I/O 공간을 정의하는 매개 변수 이다. 이 주소는 PCIe 디바이스와 관련된 메모리 주소 공간을 설정하는데 필요하다.
LowMomoryMappedIOSpace
이 값은 가상 머신이 사용하는 낮은 주소의 메모리 맵 I/O공간을 지정한다. 일반적으로 이 공간은 1GB 미만으로 설정되며, GPU와 같은 장치에 대한 기본 I/O 맵핑을 위해 사용된다.
HighMemoryMappedIOSpace
dl 값은 가상 머신이 사용하는 높은 주소의 메모리 맵 I/O공간을 지장한다. 일반적으로 1GB 이상의 주소를 포함하며, 더 많은 I/O 리소스를 요구하는 장치에 사용된다.
적절한 사이즈
적절한 사이즈를 설정하려면, 다음과 같은 사항을 확인하여 설정을 진행해야 한다.
장치 문서 참조 : 사용하려는 GPU나 PCIe 디바이스 문서를 참조하여 해당 장치가 요구하는 메모리 맵 I/O 주소 범위를 확인
쉬운 사이즈 설정 (ChatGPT)
NVidia의 Geforce 1050 ti의 경우 아래와 같은 값을 권장 값으로 제시한다.
LowMemoryMappedIOSpace: 0x00000000 (1GB)
HighMemoryMappedIOSpace: 0x800000000 (1GB)
호스트 기기에서 대상 장치를 분리
장치의 위치 경로 확인
장치의 위치 경로는 다음과 같은 형태로 구성된다.
PCIROOT(20)#PCI(0300)#PCI(0000)#PCI(0800)#PCI(0000)
장치 경로는 다음과 같은 방법으로 확인할 수 있다.
- 장치 관리자를 열고 장치를 찾음
- 장치를 오른쪽 마우스 버튼을 통해 속성 창으로 이동
- 세부 정보 탭에서 속성 드롭 다운 메뉴를 확장하고 위치 경로를 선택
- PCIROOT로 시작하는 장치의 위치 경로를 확인
장치의 비활성화
장치 관리자를 통해 해당 장치를 비활성화 함
장치 분리
해당 장치가 완화 드라이버를 제공했는지 여부에 따라서 적절하게 강제 명령 옵션을 선택하여 장치를 분리한다.
Dismount –VMHostAssignableDevice (-Force) –LocationPath $locationPath
만약 해당 설정이 아래와 같은 에러를 발생하며 실패할 경우, 다음과 같은 BIOS 설정을 진행한다.
에러) 현재 구성에서는 PCI Express 버스의 OS 제어가 허용되지 않습니다. …
해결 방법)
BIOS에 접근하여, Above 4G Decoding 옵션과 VT-d 또는 AMD-Vi 와 같은 가상화 옵션을 활성화 한다.
게스트 VM에 해당 장치 할당
VM에 할당하여 해당 디바이스에 접근할 수 있도록 설정함
Add-VMAssignableDevice –LocationPath $locationPath –VMName VMName
VM 에서 작업
이렇게 할당이 완료되면, 해당 디바이스는 VM에서 전용으로 점유하여 작업을 수행할 수 있는 상태가 된다. 드라이버를 별도로 설치하고, 해당 디바이스를 활용하여 작업을 수행할 수 있다.
장치를 제거하고 호스트로 반환
장치를 원래 상태로 되돌리려면 VM을 중지하고 다음 명령을 실행해야 한다.
Remote-VMAssignableDevice –LocationPath $locationPath –VMName VMName
Mount-VMHostAssignableDevice –LocationPath $locationPath
이후, 장치 관리자를 통해 해당 장치를 활성화 하면 호스트 운영 체제가 다시 장치를 사용할 수 있는 상태가 된다.
자동화된 스크립트 예시
# Configure the VM for a Discrete Device Assignment
$vm = “ddatest1”
# Set automatic stop action to TurnOff
Set-VM -Name $vm -AutomaticStopAction TurnOff
# Enable Write-Combining on the CPU
Set-VM -GuestControlledCacheTypes $true -VMName $vm
# Configure 32 bit MMIO space
Set-VM -LowMemoryMappedIoSpace 3Gb -VMName $vm
# Configure Greater than 32 bit MMIO space
Set-VM -HighMemoryMappedIoSpace 33280Mb -VMName $vm
# Find the Location Path and disable the Device
# Enumerate all PNP Devices on the system
$pnpdevs = Get-PnpDevice –presentOnly
# Select only those devices that are Display devices manufactured by NVIDIA
$gpudevs = $pnpdevs | Where-Object {$_.Class -like “Display” -and $_.Manufacturer -like “NVIDIA”}
# Select the location path of the first device that’s available to be dismounted by the host.
$locationPath = ($gpudevs | Get-PnpDeviceProperty DEVPKEY_Device_LocationPaths).data[0]
# Disable the PNP Device
Disable-PnpDevice -InstanceId $gpudevs[0].InstanceId
# Dismount the Device from the Host
Dismount-VMHostAssignableDevice -Force -LocationPath $locationPath
# Assign the device to the guest VM.
Add-VMAssignableDevice -LocationPath $locationPath -VMName $vm