Hyper-V で GPUを使ってみる。失敗の巻

参考にしたサイトは

Windows11上でGPU有効な仮想Windows11を動かす

https://qiita.com/botter99/items/c0022ed1906a74decc37

Hyper-VでGPU(3Dアクセラレーション)を利用する方法 Windows 10以降編 (GPU-P)

https://qiita.com/Hyper-W/items/3a2c7ff1d983deb80070

グラフィクスドライバーの導入が鬼門なので、スナップショットをとってから直ぐにグラフィクスドライバーの導入をした方が良い。

その後 GPU-P on で、スナップショットが取れなくなる。

まずはスナップショットを。

host OS>
Get-VMHostPartitionableGpu

答えて曰く

Get-VMHostPartitionableGpu : 用語 'Get-VMHostPartitionableGpu' は、コマンドレット、関数、スクリプト ファイル、または操
作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパス
が正しいことを確認してから、再試行してください。
発生場所 行:1 文字:1
+ Get-VMHostPartitionableGpu
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Get-VMHostPartitionableGpu:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

コマンドが無いらしい。

host OS>
Add-VMGpuPartitionAdapter -VMName "仮想マシン名" -InstancePath "Nameの内容"

そもそも Name が分からない。

host OS>
Set-VMGpuPartitionAdapter -VMName "仮想マシン名" -Passthru

答えて曰く

コマンド パイプライン位置 1 のコマンドレット Add-VMGpuPartitionAdapter
次のパラメーターに値を指定してください:
VMName[0]:
PS C:\Windows\system32> Add-VMGpuPartitionAdapter -VMName "AdbCS6onPCBTOi7-12" -Passthru


MinPartitionVRAM        :
MaxPartitionVRAM        :
OptimalPartitionVRAM    :
MinPartitionEncode      :
MaxPartitionEncode      :
OptimalPartitionEncode  :
MinPartitionDecode      :
MaxPartitionDecode      :
OptimalPartitionDecode  :
MinPartitionCompute     :
MaxPartitionCompute     :
OptimalPartitionCompute :
Name                    : GPU パーティションの設定
Id                      : Microsoft:2CDACEDB-0231-4680-A802-xxxxxxx\xxxxxxx-xxx-xxxx-A3E0-AC508E46207D
VMId                    : 2cdacedb-xxxx-xxxx-xxxx-xxxxxxxxxx
VMName                  : xxxxxxxxxxxx-12
VMSnapshotId            : 00000000-0000-0000-0000-000000000000
VMSnapshotName          :
CimSession              : CimSession: .
ComputerName            : Txx-xxxxx-PC
IsDeleted               : False
VMCheckpointId          : 00000000-0000-0000-0000-000000000000
VMCheckpointName        :

反応あり

host OS>
Set-VM -GuestControlledCacheTypes $true -VMName "仮想マシン名"

正常終了

host OS>
Set-VM -LowMemoryMappedIoSpace 1GB -VMName "仮想マシン名"

正常終了 (VMを閉じたら)

host OS>

Set-VM -HighMemoryMappedIoSpace 32GB -VMName  "仮想マシン名"

正常終了

我慢しきれず、一度起動してみると、チェックポイントの作成には失敗した。(GPU-Pが割り当てられているからと言われた。)

ただし、ゲストのデバイスマネージャーで Display adapter のところで、 NVIDIA GeForce GTX 1650 が見えている。

ゲストOSにグラフィクスドライバーの導入

ドライバがないので利用できず。普通の考えなら、メーカからドライバインストールすればいいのだが、「仮想マシン上でドライバをメーカーサイトからダウンロードしてインストールしても上手くいかない」との事。

やってみたが、「このNVIDA グラフィックスドライバーには、このバージョンの Windows との互換性がありません。このグラフィクスドライバーと互換性のあるグラフィクスハードウェアが見つかりませんでした」となった。

Host OS から抜き出して Gues OSにコピーする

Guest OS のディスクマウント

Host のディスク管理

操作-VHDの接続

Guest OS の仮想ディスクをマウント

メモ帳で

以下のまじない文書を作る。コピペ元よりちょっと変更

<Configuration>
<VGpu>Enable</VGpu>
<MappedFolders>
   <MappedFolder>
       <HostFolder>V:\Windows\System32\DriverStore</HostFolder>
       <ReadOnly>false</ReadOnly>
   </MappedFolder>
</MappedFolders>
</Configuration>

作業ディレクトリに保存。

c:\tempu\drivercopy.wsb

よくあるのが新規テキスト.txtからリネームするやつだけど、メモ帳の場合保存画面において先に「ファイルの種類」を「すべてのファイル」に変えると、.txt からリネームしなくとも直接拡張子が指定できる。

サンドボックス起動 に失敗

Sandbox はGPUが使えることを利用してのやり方。

管理者のPowerShell でこの .wsb を起動させSandbox の desktop に出てきている guest のフォルダにすべてコピーすれば完成。

のはずが、仮想ハードディスクを壊してしまい起動不能に。

Host の nvapi64.dll を検索

Everything

で二か所見つかった。

1.

C:\Windows\System32

2.

C:\Windows\System32\DriverStore\FileRepository\nv_dispig.inf_amd64_f52c4b8723f8dd33

これを Guest OSで再現する。

1の項目はファイル一個。2の項目はディレクトリごとコピー