LoginSignup
16
12

Hyper-VでGPU(GPU-PV)を利用する方法 (Windows 10以降編)

Last updated at Posted at 2023-03-24

Windows Server 2025にて正式サポート

https://techcommunity.microsoft.com/t5/windows-server-news-and-best/the-future-of-windows-server-hyper-v-is-bright/ba-p/4074940

Windows Server 2025にて、GPU-Pは正式にサポートされるようになるようです。

こちらで紹介している有効化手順は正式サポート以前のものになります。

正式な手順は異なる可能性があります。

正式な手順は公式のドキュメントを確認してください。

ただし、こちらの手順では、公式的にはサポートされないハードウェア構成でも使用可能かもしれません。

はじめに

この記事は、Hyper-VでGPU(3Dアクセラレーション)を利用する方法 Windows 10以降編 (GPU-P)のリメイク版です。元の記事は引用されたりしていますが、手順の簡略化など変更が多くなったため、作成し直しています。

この記事のUbuntu版は、ここです。

Hyper-Vで、GPUを利用する方法として現在公式では、DDAとRemoteFXが案内されていますが、RemoteFXは脆弱性により、更新で無効化されました。

DDAは、Windows 10では利用できず、Windows Server 2019はサポート対象であるにも関わらず、動かないようです。

つまり、現在公式資料にある方法ではHyper-VGPUを利用出来ない状態です。

しかし、公式資料には現状、利用方法は存在しませんがRemoteFXに変わる技術として、GPUの準仮想化技術であるGPU-PV(Para Virtualization)、そして、その準仮想化GPUのリソースの分割設定を行うGPU-P(Partitioning)が利用可能です。

既に、Windows Sandboxの仮想GPUAzureで利用されているようです。

又、Windows 10 (21H1)以降のWSL2では同様の技術を用いて、NvidiaGPUを用いるCUDAプログラミングが、WSL2上やそれをバックエンドとして利用するDockerで可能になりました。

最近では、Azure Stack HCIでも、サポートされているGPUは限られますが、利用可能なようです(この記事の手順を利用すれば非対応GPUでも利用可能な可能性があります)。

既に利用されているということは、Windowsに実装されているということです。

実際に、PowershellHyper-Vに関するコマンドを調べると、下記のようなコマンドで、

Get-Command -module Hyper-V

下記のような結果が得られます。

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
                (前略)
Cmdlet          Add-VMGpuPartitionAdapter                          2.0.0.0    Hyper-V
                (中略)
Cmdlet          Get-VMGpuPartitionAdapter                          2.0.0.0    Hyper-V
                (中略)
Cmdlet          Remove-VMGpuPartitionAdapter                       2.0.0.0    Hyper-V
                (中略)
Cmdlet          Set-VMGpuPartitionAdapter                          2.0.0.0    Hyper-V
                (後略)

上記のように既に実装されています。

Get-Helpコマンドで調べると構文は出てきますが、説明はまだ公式サポートされていないので、出てきません(Powershell 7以降で実行すると更に詳しい構文が出てきます)。

この記事では、仮想GPUの割り当てから、GPUドライバーの適用を手動で行う手順を紹介していますが、この手順を簡略化すプロジェクトEasy-GPU-PVも存在します。

このプロジェクトでは、折角の仮想GPUを利用して内部的には高フレームレートが出ているのにも関わらず、Hyper-Vの仮想マシン接続では、カクカクになるという問題(RDPベースの拡張セッションモードでは多少マシではあるが...)に対処するためにParsecというリモートデスクトップを用いたセットアップまで自動で行っています。

Parsecが不要な場合は、この手順が参考になるかと思います。

目次

動作確認環境

  • 親マシン
OS: Windows 10
Version: 2004
GPU: Nvidia Geforce GTX 1070(固定)
  • 子マシン
OS: Windows 10
Version: 2004
VM Generation : Gen 2

リメイク版で、修正された手順にて利用している親環境は、下記の通りです。

割り当てる物理GPUのデバイスファイルパス名の確認やドライバーを親マシンから持ってくる部分でのみ利用しております。

  • 親マシン
OS: Windows 11
Version: 22H2
GPU: Nvidia Geforce RTX 3080

仮想マシンで、仮想GPUを利用できるようにする

注意
この機能は、公式にサポートされていない方法です。なにか問題が起きても自己責任です。

チェックポイントの無効化

まず、チェックポイントを適用・削除する必要があります。

これは、GPU-PVではチェックポイントがサポートされておらず、有効化するためにはチェックポイントを無効化する必要があるためです。

そのため、自動チェックポイントを使っている場合は無効に、チェックポイントが既に存在する場合は、チェックポイントの削除または適用を、チェックポイントを利用しないことが必要です。

仮想GPUの割り当て方法

この項目での設定は、シングルGPU環境の場合、このbatファイルにより一括実行可能です。

このbatファイルはダブルクリックで、実行するとUACで管理者権限に昇格し、仮想マシン名を聞いてくるので、設定したい仮想マシンの名前をシングルクォート(')で囲み指定すると、一括で実行されます。

GPU Partition Adapterの割り当て

まずは、先程のGPU Partitioning関連のコマンドを利用して仮想マシンにGPU Partition Adapterを仮想マシンに割り当て、リソースの設定などを行います。

Powershell管理者権限で実行して、下記コマンドを実行します。

まずは、仮想マシンにGPU Partition Adapterを割り当てます。

下記コマンドでは、親マシンのタスクマネージャー等で、GPU 0として認識されているGPUが仮想GPUとして割り当てられます。

マルチGPU環境で指定したいGPUがある場合は、下記のコマンドは実行せずに以降で紹介するコマンドを実行して下さい。

Add-VMGpuPartitionAdapter -VMName "仮想マシン名"
マルチGPU環境での割り当てについて

マルチGPU環境でGPU 0として、認識されるGPU以外を割り当てたい場合、-InstancePathオプションで、親マシンのWindowsで認識されるデバイスファイルパス名を指定することでGPUを明示的に指定することが可能になります。

このオプションはWindows 10のあるいはそのバージョンによっては利用できない可能性があります。

もし、利用できなかった場合は、利用したいGPUが、タスクマネージャー上で、GPU 0として認識するように、他のGPUを無効化する等して下さい。

マルチGPU環境で、割り当てたいデバイスファイルパス名を確認する方法は下記の通りです。

Get-VMHostPartitionableGpu | Format-Table Name

下記のような結果が、返ってきます(マルチGPU環境の場合、複数返ってきます)。

Name
----
デバイスファイルパス名

ここで、帰ってきた値を用いて、先程のコマンドを実行します。

Add-VMGpuPartitionAdapter -VMName "仮想マシン名" -InstancePath "デバイスファイルパス名"

仮想GPUのリソース設定

仮想GPUのリソースを設定します。

物理GPUの全てのリソースを割り当てる場合は、以下のようなコマンドを実行します。

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

もし、リソースを調整したい場合は、下記のようにすると明示的にパラメーターを指定できます。

Set-VMGpuPartitionAdapter -VMName "仮想マシン名" -MinPartitionVRAM 80000000 -MaxPartitionVRAM 100000000 -OptimalPartitionVRAM 100000000 -MinPartitionEncode 80000000 -MaxPartitionEncode 100000000 -OptimalPartitionEncode 100000000 -MinPartitionDecode 80000000 -MaxPartitionDecode 100000000 -OptimalPartitionDecode 100000000 -MinPartitionCompute 80000000 -MaxPartitionCompute 100000000 -OptimalPartitionCompute 100000000

その他リソースを仮想マシンに設定します。

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

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

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

仮想マシンに準仮想GPUのドライバーを追加する方法

上記の設定で既に、仮想マシンから仮想GPUは見えていますが、この時点でまだ動作はしていません。

仮想マシンに、ドライバーを追加する必要があります。

この時、物理マシンにGPUドライバーをインストールする場合と同じように、仮想マシンにドライバーをインストールしようとしてもできません。

このGPUは、通常のGPUとは異なる準仮想化GPUです。

ドライバーをインストールしても、タスクマネージャーに表示されなかったり、GPUの一部のステータスを確認することができません。

そのため、ドライバーをインストールするためには、親マシンからドライバーをコピーする必要があります(そのため、NvidiaのRTX VSRなどの設定を行うことができず、利用できません)。

この仮想マシンにドライバーを追加する手順は、親マシンのGPUドライバーを更新する度に行う必要があります。

親マシン上にあるGPUドライバーの保存場所の確認

Powershellで、下記コマンドを実行します。

Get-CimInstance -ClassName Win32_VideoController -Property * | Format-Table InstalledDisplayDrivers

以下のような結果が、返ってきます。

InstalledDisplayDrivers
-----------------------
C:\Windows\System32\DriverStore\FileRepository\nv_dispi.inf_amd64_50916785244854f2\nvldumdx.dll,C:\Windows\System32\DriverStore\FileRepository\

この環境での利用しているGPUドライバーを保存しているフォルダは、C:\Windows\System32\DriverStore\FileRepository\nv_dispi.inf_amd64_50916785244854f2\であることがわかります。

仮想マシンへのドライバーコピー

このドライバーのフォルダを仮想マシンのC:\Windows\System32\HostDriverStore\FileRepository\に配置して下さい。

この手順を初めて行う場合、仮想マシンにHostDriverStoreは存在しないと思われます。

そのため、C:\Windows\System32内にHostDriverStoreフォルダを作成し、その中にFileRepositoryを作成し、更にその中に先程確認したドライバーのフォルダ(今回の場合、nv_dispi.inf_amd64_50916785244854f2)をコピーします。

コピーの方法は、Pro以上のエディション限定の拡張セッションやRDPによるコピペ(権限の問題で一旦デスクトップ等にコピーする必要があると思われます)、SSH Serverを有効にしてのscpコマンドやsftpコマンドによるコピー、仮想マシンの仮想ハードディスクを親マシンにマウントしてコピー等々様々な方法がありますが、好きな方法でコピーして下さい。

(NvidiaGPU限定) 仮想マシンでCUDA APIを利用可能にする

上記までの手順で、仮想GPUは利用可能になりましたが、AIプログラミング等で用いられるCUDA APIは利用できません(nvidia-smiコマンドも実行できません)。

これを利用可能にするためには、親マシンから、仮想マシンに追加でファイルをコピーする必要があります。

親マシンのC:\Windows\System32\nvapi64.dllを子マシンへ同じパスとなるようにコピーします。

コピーの方法は先程と同様に、お好きな方法をご利用下さい。

仮想GPUの確認

これで、次に仮想マシンを起動すると、GPUを認識し、利用できるようになりました。

GPU-P_Enable.jpg

Windows Terminal3Dアクセラレーションが有効でないと透過されないので3Dアクセラレーションが利用できている事がわかると思います。

GPU-P_Disable.jpg

上は認識していない時です。

ゲーム(ベンチマーク)でも、認識しました。

GPU-P_PSO2ベンチ.jpg

GPU-P_FFベンチ.jpg

PSO2ベンチとFFベンチを回しました。

CPUの割当は4コア、メモリは固定8GB、可変vhdx(SSD上)です(ドラクエベンチは起動しませんでした)。

親で計測した時よりもかなり落ちていますが、リソースが制限されている事、親マシンと子マシンでリソースを共有している事を考えるとこんなものかという感じですね。

それでも、やや快適なので仮想マシン接続の問題を解消できれば、それなりに使えるようになるものと考えられます。

CUDA APIの動作確認

仮想マシンにVisual Studio 2019と、CUDAをインストールしてdeviceQueryをビルドしました。

CUDAのインストールも出来ましたし、deviceQueryのビルドも成功して実行すると以下のように認識していたのでCUDA APIも使えると思われます。

GPU-P_CUDA.png

GPU-P_CUDA2.png

GPU Partition Adapterの削除

管理者権限のPowershellで、以下のコマンドを実行します。

Remove-VMGpuPartitionAdapter -VMName "仮想マシン名"

削除すると、チェックポイントも再び使用可能になります。

GPUドライバーの削除等は、別途手動で行って下さい。

Windows 10以外の子マシンでの動作確認(Windows系のみ)

Windows 8.1(Gen 2 VM): 以下のように認識はしますが,動作はしません。(GPU Partition Adapterを追加すると、以下のようにUSBのようなリムーバブルデバイスとして表示されます。アンマウントするとGPUを認識しなくなり,3Dアクセラレーションが利用できなくなります。)

GPU-P_Windows8.1.jpg

Hyper-V Server 2019(Gen 2 VM): 同様に認識はしますが、動作はしません。

Windows Server 2019 デスクトップエクスペリエンス(Gen 2 VM):Hyper-V Server 2019と同じ。

Windows 7(Gen 1 VM):認識も動作はしません.(第一世代仮想マシンは認識すらしない?)

Windows 10 (21H1)の親マシンでの検証

Windows Server 2022 デスクトップエクスペリエンス(Gen 2 VM): Windows 10と同様に正常に動作。

GPU-P-WS0222.png

Windows 11 21H2 正式版(Gen 2 VM): Windows 10と同様に正常に動作.

GPU-P-W11.png

Windows 11 (21H2)の親マシンでの検証

Hyper-Vの構成バージョンは10.0です(それまでに動いたもののみで検証)。

Windows 10 21H1(Gen 2 VM): 今までと同様に動作。

Windows 11 21H2(Gen 2 VM): 今までと同様に動作。

Windows Server 2022 デスクトップエクスペリエンス(Gen 2 VM): 今までと同様に動作。

(暫定)検証結果

  • Windows 10のどこかのバージョン以上のバージョンの仮想マシンであれば、動作
  • Windows Server LTSCの場合は、Windows Server 2022以降の仮想マシンでなければ動作しない(サポート終了のSACは不明)
  • サポートされている親マシンのOSと仮想マシンのOSの組み合わせであれば、バージョンが異なっていても動作

その他参考

16
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
12