コンテンツへスキップ

仮想マシンで仮想グラフィックカードを使用する(Hyper-V Windows OS を仮想グラフィックカード環境で使用する)

Hyper-V を使う理由は、マシンのリソースがVM に反映される点でしょう。
当然、グラフィックカードのリソースも反映させたいわけです。
Hyper-V でWindows 端末を作成して、グラフィックカードも仮想で反映させたときのメモです。

ちょっとコツというか、癖があったけど、GPU パーティションという方式のやつで追加投資もなくできました。(グラフィックカードがNvidia とか、とにかく対応していることが前提です。)
Ncdivia のグラフィックスカードがは必須みたいなんですけど、VM のデバイスマネージャーを見ていると「インテルグラフィックステクノロジー」が出てくるときがあるので、内蔵のグラフィックスカードも使えるかも。
(検証していないので、ご参考まで。)

Hyper-V Windows OS を仮想グラフィックカード環境で使用する

仮想マシン上で3DCAD だって動くし、FF14 のベンチマークスコアも快適レベルです。
(ちなみに、HyperーV のVM 上でゲームのコントローラーを使用したい場合は、拡張セッションの設定でローカルリソースをリダイレクトすればできると思います(他のデバイスはこれでリダイレクトできた)

GPU パーティション を使用する場合、拡張セッションは使用できないという情報もありましたが、
私の環境(Dell Precision7770)では、拡張セッションでの接続もできてます。
多分、最近のWindows(10pro 22H2) はできる子なのではと思います。

拡張セッションが使える場合、接続がRDP みたいなので、ローカルリソースの転送もできるし、グループポリシーの設定でリモートFX USBデバイス(ゲームのコントローラーとか)も使用できて快適な検証環境です。

チェックポイントも併用できないとありますが、チェックポイントの作成はできました。
ただし、他のチェックポイントに変更するのはエラーが出てできないので、

で、対応してます。
ちょっと面倒だけど、チェックポイントが全く使えないわけではないので、検証環境としてもOK です。

Hyper-V でVM を作成して、グラフィックスボードを有効化するまでの流れ

Hyper-V で新規のVM を作る手順です。Hyper-V を使ったことない方向けです。
Hyper-V に慣れ親しんだ方はとGPU の有効化まで飛ばしてOKです。

VM(Virtual Machine)の作成

Hyper-V の有効化

Hyper-V はWindows Pro 以上で使えますが、普段は起動アイコンがありません。
Hyper-V を使用するには、Hyper-V の機能を有効化する手順が必要です。

Hyper-V を有効化します。
一応、その他のVM ハイパーバイザーも一緒に使用できる様になっていますが、個人的には怪奇現象がおきまくったので、Hyper-V は単独で使用する事にしています。

コントロールパネル >プログラムと機能 >「Windows の機能の有効化または無効化」

Hyper-V にチェックを入れる。
他のVM も同じ端末で使用している場合は、Windows ハイパーバイザープラットフォーム(※1)にもチェックを入れる。
(※1:ハイパーバイザープラットフォームを有効化すると、Hyper-Vと、そのほかVMソフトの両方が使えるようになるのですが、個人的にはあんまりかなーって感じです。もちろん、私の環境だけかもしれないので。)

※必須

どちらでも。

PC を再起動すると、Hyper-V の機能が有効になります。

Hyper-V マネージャー

Windows を再起動後、Windows 管理ツールからHyper-V マネージャーを起動。

なんとなく癖がある設定画面ですが、慣れると普通です。

Hyper-V マネージャーにHyper-V を管理する単位のサーバーがあって、その下に子の仮想マシン(VM)を設定する感じです。特になにか意識することはないと思います。
「仮想マシン(I)」の欄にサーバー内に定義された仮想マシン がリストされます。
「チェックポイント(C)」の欄にはいわゆる「スナップショット」のツリーが表示されます。

右側パネル「操作」のメニューについて

全部はあれなので、めぼしいとこだけ。

  • 新規
    新規で仮想マシンを作成。
  • 仮想マシンのインポート
    既存の仮想マシンフォルダから、仮想マシンをサーバーに再登録する。
  • Hyper-V の設定
    Hyper-V サーバー全体の設定。
    サーバー全体の設定と、VM 個別の設定で分かれています。
  • 仮想スイッチマネージャー
    ネットワークカードの構築をします。デフォルトのネットワークカード(NAT)でもネット環境とかは特に困らないですが、IP のセグメントが異なるので、ホスト以外の端末からもVM を参照したいときは既存のネットワークにブリッジしたスイッチを設定します。(と、思ってしてます。)
  • サービスの停止
    Hyper-V の停止
  • サーバーの削除
    サーバーを削除します。

新規・仮想マシンの作成

VM の名前を決めます。そのままVM の構成ファイルを保存する、フォルダ名にもなります。
VM の構成ファイルの保存場所を任意に設定したい場合は、「仮想マシンを別の場所に格納する」にチェックを入れて、場所を指定します。

第2世代にします。

ホストの端末と相談して、VM で使用するメモリの上限を決めます。
VM の起動時に割り当て分を確保されます。

ネットワークカードを指定します。
とりあえず、「Default Switch」でOK です。

ハードディスクの設定です。新規作成するときのサイズを決めます。

OS のオプションを指定します。基本的には、後で、、、でいいと思います。

確認して、完了をクリックします。

完了をクリックするとVM(Virtual Machine) が作成されます。

作成したVM にOS をインストールする

まだOS がインストールされていないので、このまま起動しても使えません。
初めにOS をインストールしますが、インストールメディアの準備が必要です。

OS を評価版、正規版などで用意します。ISO の方がVM の場合は扱いやすいです。
(※下記は正規版。)

Windows 11 をダウンロードする

仮想マシン欄でVM を選択した状態にして、画面右下の「設定」をクリックし、VM の詳細設定を呼びだします。

インストールメディアの設定

SCSI コントローラー で「DVD ドライブ」を追加してインストールメディア(ISO 形式)を設定します。

SCSI コントローラーで、DVD ドライブを追加。

「イメージファイル」にOS インストールメディアのISO ファイルを指定する。

VM 起動時、最初にDVD が読み込まれるようにファームウェアの項目を調整します。
ブート順 で「DVD ドライブ」が一番上に来るようにする。

CPU コア数設定

お好みで。

ネットワークアダプターを設定

特に理由がなければ、Default Switch でよいと思います。その場合、個々の操作は割愛でOK です。

余談ですが、以前のバージョンではWifi 環境で仮想スイッチをバインドするにはコツがありましたが、最近のバージョンでは普通に作成できました。ちゃんと開発、改善されている感があります。

他のネットワーク内の端末からVM にアクセスしたい場合は、生のNIC をブリッジしたアダブタを作成して、指定する必要があると思います。(ホストがサーバーOS の場合、NIC をブリッジすると、なんか専有状態?みたいになるので注意。プロパティが変化します。)

ローカルなネットワークに参加(ホスト以外の端末からも参照できる状態にする)する場合。

サーバーの操作画面がら、仮想スイッチマネージャーを起動。

ネットワークアダプターでブリッジを新規で作成。

VM で作成したネットワークアダプターを選択する。

TPM も有効化

Windows 11 をインストールする場合は、まずホスト側でTPM 2.0 でかつ有効化されている状態にしておき、さらにVM 設定でTPM を有効にチェックを入れておきます。

ホストのTPM も有効になっている状態が前提です。

最後に「設定」をクリック して閉じます。

VM の起動と Windows 11 のインストール

Hyper-V マネージャーの画面右側ペイン下にある、
作成したPC 名の欄の「接続」をクリックして画面を表示します。

Hyper-V はVM の起動と接続が別になります。
接続はPC にリモートをかけているイメージで「セッション」になります。
OS の種類によって、「拡張セッション」が使用できます。
拡張セッションでは、リモートデスクトップ接続みたいにローカルリソースを割り当てしたり、
ホスト↔クライアント間でコピペができたりします。

起動(電源ボタンマーク)をクリックして電源投入(するイメージです)。

黒い画面で「Press hit any key ~」が出てきて、DVD を読み込みそうな画面になったらエンターキーを押して読み込み。

画面の指示に従って進めます。

正規版だと、ここでプロダクトキーを聞かれます。

初期設定

マイクロソフトアカウントで設定したくない場合は、この段階でネットワーク接続を外しておきます。
いったん電源を落としてから、ネットワークアダプターの設定を「接続されていません」に変更して何もない状態にして再起動します。

別にMS アカウントでも便利なんでいいんですけど、ユーザーフォルダ名にアカウント名が使われるので日本語になったり、途中で切れてたりするのが、、、ちょっとね。

スキップします。

ネットワーク接続がある場合は、いったん最新のバージョンを確認して再起動します。

もう一度再起動した後にMS アカウントへの勧誘が始まります。(HOME エディションは詰みです。)

オフラインだと下記の画面に進みます。23H2 以降(多分)はネットワーク接続必須的な画面になっていますが、以下の手順でオフラインのまま進めることができるようになります。

  1. Shift +F10 キーを押してコマンドプロンプトを呼び出し。
  2. cd oobe
  3. BypassNRO.cmd
  4. 上記を実行後、再度セットアップ画面に戻るので、もう一度同様に進める。

制限された状態で続行します。(「機能が制限される」という意味合いではないです。)

パスワード入力は確認を含めて2回。

秘密の質問でボケてもいいですし、マジレスでも素敵です。
3回繰り返します。

全部のチェックを外しておくか、オンにしておきます。お好みです。

あとは待つだけです。
起動してきたら、いったんシャットダウンしてネットワーク接続をもとに戻し、再起動してください。

接続が「拡張セッション」の場合は、下記の画面が出て、接続のオプションを設定できます。
(リモートデスクトップ接続みたいな感じです。)

設定画面内の「セッション設定の編集」から変更できます。(いったん接続をきってから。)

GPU の有効化

ざっくりな手順としては、

これだけです。めっちゃ簡単です^^。

GPU パーティションの作成

コマンドを流せばできます。グラフィックカードが対応していれば、、、です。Nvidia ならできるバズと思ってやりましょう。GForce でもできました。

パーティション名の確認

Get-VMPartitionableGpu | Format-Table Name

Windows 10の場合はエラーが出てダメ見たいですが、Windows 11だと「InstancePath」を使って分割するGPU を指定できるみたいです。

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

コマンドの確認

記事と同じコマンドを実行してもエラーになる場合は、コマンドが違うかもです。
下記を実行すると、現在のコマンドを確認できるかもですので、参考にしてください。

Get-Command -module Hyper-V | find '"Gpu"'

かえってきたコマンドで代替するものがわかる。。。かも^^

PS C:\Windows\system32> Get-Command -module Hyper-V | find '"Gpu"'
Cmdlet          Add-VMGpuPartitionAdapter                          2.0.0.0    Hyper-V
Cmdlet          Get-VMGpuPartitionAdapter                          2.0.0.0    Hyper-V
Cmdlet          Get-VMPartitionableGpu                             2.0.0.0    Hyper-V
Cmdlet          Remove-VMGpuPartitionAdapter                       2.0.0.0    Hyper-V
Cmdlet          Set-VMGpuPartitionAdapter                          2.0.0.0    Hyper-V
Cmdlet          Set-VMPartitionableGpu                             2.0.0.0    Hyper-V
PS C:\Windows\system32>

GPU パーティションを作成

この段階でHyper-V マネージャーを起動しておきます。
(※「test01」はVM の名前です。起動していないと、VMName が認識されないかもなので、とりあえず起動しておきましょう。VM の電源は切っておいてください。)

VM の方は、シャットダウンの状態にしておきます。

Add-VMGpuPartitionAdapter -VMName "vm_Name"

パーティションの細かい設定。
いずれかで実行します。

そのままスペックを渡してしまう場合の例。基本はこっちで問題ないと思います。

Set-VMGpuPartitionAdapter -VMName "vm_Name" -Passthru

パラメータを指定したい場合の例。スペックの半分を狙ってみたのですが、
パラメータの理解が適当なのであんまり変わりませんでした。

Set-VMGpuPartitionAdapter -VMName "vm_Name" `
-MinPartitionVRAM 80000000 `
-MaxPartitionVRAM 300000000 `
-OptimalPartitionVRAM 300000000 `
-MinPartitionEncode 80000000 `
-MaxPartitionEncode 300000000 `
-OptimalPartitionEncode 100000000 `
-MinPartitionDecode 80000000 `
-MaxPartitionDecode 300000000 `
-OptimalPartitionDecode 300000000 `
-MinPartitionCompute 80000000 `
-MaxPartitionCompute 300000000 `
-OptimalPartitionCompute 300000000

さらに下記のコマンド3つを実行したら完了です。

Set-VM -GuestControlledCacheTypes $true -VMName "vm_Name"
Set-VM -LowMemoryMappedIoSpace 1GB -VMName "vm_Name"
Set-VM –HighMemoryMappedIoSpace 5GB –VMName "vm_Name"

この時点でVM を起動して「デバイスマネージャー」で確認すると、
グラフィックカードが認識されています。
(※コマンドで指定したVM に限ります。)

最終的には以下のようなファンクションにして使ってます。
設定用と、削除用です。使い終わったら削除しましょう。多分した方がいい。

function Set-Gpu-Partition {
	$vm_Name =(Read-Host VM-Name)
	Add-VMGpuPartitionAdapter -VMName "$vm_Name"
	Set-VMGpuPartitionAdapter -VMName "$vm_Name" -Passthru
	Set-VM -GuestControlledCacheTypes $true -VMName "$vm_Name"
	Set-VM -LowMemoryMappedIoSpace 1GB -VMName "$vm_Name"
	Set-VM -HighMemoryMappedIoSpace 16GB -VMName "$vm_Name"
}

function Del-Gpu-Partition {
	$vm_Name =(Read-Host VM-Name)
	Remove-VMGpuPartitionAdapter -VMName "$vm_Name"
}

グラボにドライバーをあてる。

現在、ホストが使用しているドライバーの位置を確認します。

Get-CimInstance -ClassName Win32_VideoController -Property * `
| Format-Table InstalledDisplayDrivers
PS C:\Windows\system32> Get-CimInstance -ClassName Win32_VideoController -Property * | Format-Table InstalledDisplayDrivers
InstalledDisplayDrivers
-----------------------
<>,C:\Windows\System32\DriverStore\FileRepository\iigd_dch.inf_amd64_5477b803afa89799\igd10ium...
C:\Windows\System32\DriverStore\FileRepository\nvdm.inf_amd64_a3b5ef7aa349ba23\nvldumdx.dll,C:...

なんかたくさん出ているようで、実はダブり。カンマのところで改行するとわかります。

C:\Windows\System32\DriverStore\FileRepository\iigd_dch.inf_amd64_5477b803afa89799\igd10iumd64.dll,
C:\Windows\System32\DriverStore\FileRepository\iigd_dch.inf_amd64_5477b803afa89799\igd10iumd64.d...
C:\Windows\System32\DriverStore\FileRepository\nvdm.inf_amd64_a3b5ef7aa349ba23\nvldumdx.dll,
C:\Windows\System32\DriverStore\FileRepository\nvdm.inf_amd64_a3b5ef7aa349ba23\nvldumdx.dll,
C:\Windows\Sys..

notepad++ で「カンマ」を「カンマ+改行」に置換してみる。

たぶんNvidia のドライバはこっちのフォルダ。
(Nvidia は、msconf でも表示されてました。)

ここで調べたフォルダをVM 上の下記のフォルダに配置。
フォルダが無いい場合は、(たぶん、無いはず)作成します。

C:\Windows\System32\HostDriverStore\FileRepository\

コマンドプロンプトでサクッと作成。
場所が場所なので、管理者権限で実行してます。

ホストから、ドライバーファイル一式を移植。する感じ。
たぶん、ホストのドライバーを使用してデバイスに反映させるための設定方法なんだと思う。

Windows11 Home エディションは拡張セッションが使用できないので、
ローカルのリソースをコピペや接続オプション経由でコピーできません。

なので、ホストに共有フォルダを設定してネットワーク経由でフォルダをコピーしました。
Windows11 Pro エディションなら拡張セッションでリモートデスクトップ接続みたいにローカルのリソースを設定したり、コピペでホストからゲストへコピーしたりできます。

(コピー先でアクセス権の問題があるので、いったん他の場所にコピーしてローカルに落としてからターゲットのフォルダへコピーした。)

再起動後に確認。ホストのドライバーWindows10 用ですが、Windows11 でもイケてますね。両方対応のドライバーだったのかも。

手順は以上です。
VM でもグラフィックカードついてると快適ですね。

余談ですが、このWindows11 Home のライセンスはWindows7 から使っているものです。
今回、ホストを変更したタイミングでライセンス認証ができなくなってしまいました。
愛着があったんですが、そろそろ諦め時期か。

以下、手持ちのグラボ(端末)毎にベンチマークしてみました。

Ouqadro K2200(Precision Tower 5810)

Get-CimInstance -ClassName Win32_VideoController -Property * | Format-Table InstalledDisplayDrivers
Add-VMGpuPartitionAdapter -VMName "test03"
Set-VMGpuPartitionAdapter -VMName "test03" -Passthru
Set-VM -GuestControlledCacheTypes $true -VMName "test03"
Set-VM -LowMemoryMappedIoSpace 1GB -VMName "test03"
Set-VM -HighMemoryMappedIoSpace 32GB -VMName "test03"
PS C:\Windows\system32> Add-VMGpuPartitionAdapter -VMName "test03"
PS C:\Windows\system32> Set-VMGpuPartitionAdapter -VMName "test03" -Passthru
MinPartitionVRAM        :
MaxPartitionVRAM        :
OptimalPartitionVRAM    :
MinPartitionEncode      :
MaxPartitionEncode      :
OptimalPartitionEncode  :
MinPartitionDecode      :
MaxPartitionDecode      :
OptimalPartitionDecode  :
MinPartitionCompute     :
MaxPartitionCompute     :
OptimalPartitionCompute :
Name                    : GPU パーティションの設定
Id                      : Microsoft:C9326309-F687-4176-A3D7-D540C5ABB5D1\7DC27
                          FA7-B47B-4A5B-AF00-1A9D2BD1F50E
VMId                    : c9326309-f687-4176-a3d7-d540c5abb5d1
VMName                  : test03
VMSnapshotId            : 00000000-0000-0000-0000-000000000000
VMSnapshotName          :
CimSession              : CimSession: .
ComputerName            : DESKTOP-V66DLU2
IsDeleted               : False
VMCheckpointId          : 00000000-0000-0000-0000-000000000000
VMCheckpointName        :
PS C:\Windows\system32> Set-VM -GuestControlledCacheTypes $true -VMName "test03"
PS C:\Windows\system32> Set-VM -LowMemoryMappedIoSpace 1GB -VMName "test03"
PS C:\Windows\system32> Set-VM -HighMemoryMappedIoSpace 32GB -VMName "test03"

確かにデバイスマネージャー上では動作しているっぽい。
でも、なんかグラボが効いている実感がない。

拡張セッションモードも無効化する必要があるのかも。ってことで基本セッションにしてみる。

この時は、チェックポイント機能も無効化しました。

その甲斐あってか、ちゃんと認識できた感じ。

FF14のベンチマークを実行すると、VM からは見えないけどホストの方のタスクマネージャーでGPU が仕事していることがわかる。

普通きた。

とりあえず、K2200 でもGPU パーティションイケるってことで。

NVIDIA RTX A3000 12GB Laptop GPU(Precision 7770)

最初、Windows 11 をインストールしたHyper-V では1000 程度しか出なかった。
Windows 10 でも変わらない。
設定をPassthru にしても変わらない。

結局マザーボードの調子が悪かった模様。

修理工場に出して、いろいろ交換して、OS も再インストールしたところいい感じになりました。
そんなこともあるのね。

ちょっとパラメータをスペックの半分を狙って指定してみた。

Add-VMGpuPartitionAdapter -VMName "test52"
Set-VMGpuPartitionAdapter -VMName "test52" `
-MaxPartitionVRAM 500000000 `
-OptimalPartitionVRAM 500000000 `
-MaxPartitionEncode 9223372036854750000 `
-OptimalPartitionEncode 9223372036854750000 `
-MaxPartitionDecode 500000000 `
-OptimalPartitionDecode 500000000 `
-MaxPartitionCompute 500000000 `
-OptimalPartitionCompute 500000000
Set-VM -GuestControlledCacheTypes $true -VMName "test52"
Set-VM -LowMemoryMappedIoSpace 1GB -VMName "test52"
Set-VM -HighMemoryMappedIoSpace 32GB -VMName "test52"
Remove-VMGpuPartitionAdapter -VMName "test52"

ベンチマーク動作中。
半分っぽい。

、、、半分超えた。

非常に快適キタ!
VM ではFF やらんけど。

チェックポイントを有効にしてみる。

チェックポイント有効でも、問題なく動作している。

GPU パーティションが設定されていると、チェックポイントを作成したり、戻ったりする操作でエラーが出ますが、それだけみたいですね。
GPU パーティションをいったん消せばエラーは解消します。

たまにインテルグラフィックスが認識されている可能性

たまに2つ切れる。
一つは、インテルグラフィックス?

その場合は、ちゃんとインテルのGPU として認識される。

ドライバを設定していないから、不完全な状態。

以上です。

(Visited 9 times, 1 visits today)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です