Hyper-VでDDA (Discrete Device Assignment) を使ってGPUパススルーをする(一応できるが難あり)
Microsoft Windows Server 2016からDDA (Discreate Device Assignment)がサポートされた。
KVMやVMwareではPCIパススルーは難なくPCIパススルーはできるが、Hyper-Vでは、一癖あったので情報をまとめておきたいと思う。
- 必要なハードウェア要件
- PCIデバイス(GPU)のアサイン
- VMに対してのドライバーインストール
- 参考サイト
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にデバイスドライバーのファイル群があるので、デバイスマネージャーより手動インストールを行う。
これでHyper-VのVMから物理GPUが扱えるようになりました。
早くWindows Server 2019で使えるようにしてください…
あとRemoteFX vGPUの代替機能もぜひ実装をお願いします…
現状パススルーしたいなら、個人的にはKVM一択かなぁ。と思った検証でした。
5.参考サイト/参考記事
Deploy graphics devices using Discrete Device Assignment | Microsoft Docs
Win Server 2016 v1709 - Element not found when starting VMs with passthrough GPUs
Hyper-V仮想マシンでDDAを利用したGPUパススルー | なしっぺのITブログ
Windows Server 2019でHyper-V上のUbuntu18.04にCUDA環境を構築(断念) - Qiita
Windows Server 2016 テクノロジ入門 完全版
- 作者: 山内和朗
- 出版社/メーカー: 日経BP
- 発売日: 2016/12/23
- メディア: 単行本
- この商品を含むブログを見る
MSI Radeon RX Vega 64 Air Boost 8G OC グラフィックスボード VD6646
- 出版社/メーカー: MSI COMPUTER
- 発売日: 2018/05/25
- メディア: Personal Computers
- この商品を含むブログを見る