窓とかペンギンとか

インフラエンジニアの色々備忘録 少しでも情報を発信できたらなと思いブログを作ってみました。 このブログの内容は個人の見解であり、所属する組織の公式見解ではありません. 趣味のこと等も書きます(たぶん)

Hyper-VでDDA (Discrete Device Assignment) を使ってGPUパススルーをする(一応できるが難あり)

f:id:lezoid:20190823125438p:plain
Microsoft Windows Server 2016からDDA (Discreate Device Assignment)がサポートされた。
KVMやVMwareではPCIパススルーは難なくPCIパススルーはできるが、Hyper-Vでは、一癖あったので情報をまとめておきたいと思う。

  1. 必要なハードウェア要件
  2. PCIデバイス(GPU)のアサイン
  3. VMに対してのドライバーインストール
  4. 参考サイト

1. 必要なハードウェア/OS要件

Windows Server 2016 Version 1607 (OS Build : 14393.1884)
Windows Server 2016でもバージョン1709、ビルド16299以降は動作しないようなので注意が必要。
Intel VT-xとIntel EPT、もしくはAMD-VとAMD NPTをサポートする64ビットCPU
割り込み再マッピングとDMA再マッピングをサポートするIntel VT-Dか、AMD IOMMUをサポートするチップセット
Access Control Services(ACS)をサポートするPCI Expressルートデバイス

2019はどう頑張っても動きませんでした。MS公式サイト的にもサポートリストに2019は入っている。
Deploy graphics devices using Discrete Device Assignment | Microsoft Docs
AzureのGPUプランはDDAを使っていると思うので、MSも検証していると思うのだが…
バグなのか意図的にMSが潰しているのかは不明…早く2019でも使えるようにして欲しいところ(2019/08/23)

自分が本検証で利用した環境は以下の通り

筐体 DELL PowerEdge R740XD
CPU Intel(R) Xeon(R) Silver 4116 CPU @ 2.10Ghz 2プロセッサ
MEM 256GB
GPU AMD RADEON Vega64
OS Microsoft Windows Server 2016 バージョン1607 Build 14393.1884

2. PCIデバイス(GPU)のアサイン

VMを作成して、(今回はdda-testという名前で作成)下記コマンドをPowerShellで実行していく。

##
##GPUのアサイン
##GPUにはAudioデバイスもついているので同じように作業すればオーディオデバイスもアタッチできる
##

#DeviceIDとLocationPathの定義
#device idはGet-PnpDevice -PresentOnly | where {$_.InstanceID -like 'PCI*'} | select InstanceID,FriendlyName | sort FriendlyNameで調べる
$deviceID = 'PCI\VEN_1002&DEV_687F&SUBSYS_6B761002&REV_C1\6&389ACF03&0&00000000'
$locationPath = (Get-PnpDeviceProperty -KeyName DEVPKEY_Device_LocationPaths -InstanceID $deviceID).Data[0]

#物理ホストからPnpDevice(GPU)をデタッチする
Disable-PnpDevice -InstanceId $deviceID
Dismount-VMHostAssignableDevice -force -LocationPath $locationPath

#DDAを利用するためのVM設定を行う
#VM の "自動停止アクション" を TurnOff にする/CPU で書き込み結合を有効にする /32ビット MMIO space の構成 /32ビット MMIO space を超える構成 
Set-VM -Name dda-test -AutomaticStopAction TurnOff
Set-VM -GuestControlledCacheTypes $true -VMName dda-test
Set-VM -LowMemoryMappedIoSpace 3Gb -VMName dda-test
Set-VM -HighMemoryMappedIoSpace 33280Mb -VMName dda-test

#VMに対してデバイスをアサインする
Add-VMAssignableDevice -VMName dda-test -LocationPath $locationPath -Verbose

#VMにアサインしたデバイスの確認
Get-VMAssignableDevice -VMName dda-test

3.VMに対してのドライバーインストール

通常のインストーラーでのインストール方法はデバイスが見つからないと出てインストーラーを進める事ができない。
手動でinfファイルからドライバーをインストールする必要がある。
方法としてはAMD公式サイトからドライバーダウンロードして、実行すると解答先を選べるので任意のディレクトリを指定する。
C;\AMD\Winxx64Bit-RADEON-Software*\Packages\Drivers\Displayにデバイスドライバーのファイル群があるので、デバイスマネージャーより手動インストールを行う。

f:id:lezoid:20190823140539p:plain

これでHyper-VのVMから物理GPUが扱えるようになりました。
早くWindows Server 2019で使えるようにしてください…
あとRemoteFX vGPUの代替機能もぜひ実装をお願いします…

現状パススルーしたいなら、個人的にはKVM一択かなぁ。と思った検証でした。