スポンサーリンク

Hyper-V Windows11 で CUDA と WSL2 を使う方法

walking_cherry_blossom_tree
記事内に広告が含まれています。
スポンサーリンク

はじめに

PC を長く使用していると、たまにインストール直後の素の状態の Windows で色々と試したい事が出てきます。Windows Sandbox も良いのですが、Sandbox を閉じると設定が全て消えてしまいます (そういう機能が特徴です) ので、少し時間をかけて試すには不都合です。

もう一つの手段として、Windows11 Pro の Hyper-V で Windows11 開発環境の評価版を使用する事が出来ます。調べてみると Hyper-V 上の Windows11 で nVidia CUDA や WSL2 を使える事が分かりました。

今回の記事では、Hyper-V にインストールした Windows11 開発環境の評価版で、nVidia GPU 機能、nVidia CUDA、及び WSL2 を使う設定について紹介します。

スポンサーリンク

手順

Hyper-V でホスト側の GPU の機能を使用する機能は GPU-PV (Para Virtualization)、ホスト側と共用する機能は GPU-P (Partitioning) と呼ばれています。

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

https://qiita.com/Hyper-W/items/e189790fd4534d9d51ad

仮想環境内で更に仮想環境を動作させる機能は、Nested Virtualization と呼ばれています。

大まかな手順です。

  1. Hyper-V に Windows11 開発環境の評価版をインストール
  2. Hyper-V Windows11 の設定 (日本語化、他)
  3. 仮想マシンにGPU-PV、GPU-P の設定 (ホスト側の PowerShell)
  4. ホスト側の GPU ドライバ等を仮想マシンへコピー
  5. 仮想マシンに Nested Virtualization の設定 (ホスト側の PowerShell)

順に説明します。

Hyper-V に Windows11 開発環境の評価版をインストール

Hyper-V のクイック作成を選択します。

オペレーティングシステムの選択で「Windows 11 開発環境」を選択、その他のオプションを押すと下に追加事項が表示されますので、名前に「Windows11_devel_20240302」を入力、Network が 「Default Switch」である事を確認してから「仮想マシンの作成」を押します。

サイズが大きいのでダウンロードには時間を要します。

ダウンロードが完了し、仮想マシンが作成されると下の画面のようになります。

起動する前に「設定の編集」で仮想マシンの条件を変更します。

一つ目はメモリの量です。私のホストマシンは 64 GB のメモリですので、16GB を指定して「適用」を押して反映させます。

二つ目はチェックポイントを無効にします。「チェックポイントを有効にする」のチェックを外して「OK」を押します。GPU-PV はチェックポイントに対応していないとの事ですので無効にします。

元の画面に戻りますので「接続」を押して仮想マシンに接続します。

接続直後は仮想マシンは起動していませんので「起動」ボタンを押して起動します。

Hyper-V の拡張セッションが有効な場合には、下のような画面が表示されますので、「接続」を押します。

Hyper-V の拡張セッションが無効な場合には、Hyper-V マネージャーの該当仮想マシンを右クリックすると有効になりました。

基本セッションと拡張セッションは、下の画面のアイコンを押すと切り替えられます。

拡張セッションを使用すると、ホストと仮想マシンの間で Cut & Paste が使えるようになるので便利です。

ログオン画面が表示されますので、「Sign in」を押します。

英語版ですが、Windows11 開発環境の仮想マシンが起動しました。

Hyper-V Windows11 の設定

英語版では少々使いにくいので、日本語化及び各種設定を済ませます。

日本語化

Windows11 開発環境の日本語化については、以下のページで詳しく説明されています。

20240421 追記 :

こちらの方法だと PowerShell で一括で設定できるので便利です。

以下のコマンドを PowerShell のコマンドラインに貼り付けする事で、日本語設定が一括で行われます。

#日本語の言語パックインストール
Install-Language ja-JP -CopyToSettings

#表示言語を日本語に変更する
Set-systemPreferredUILanguage ja-JP

#UIの言語を日本語で上書きします
Set-WinUILanguageOverride -Language ja-JP

#時刻/日付の形式をWindowsの言語と同じにします
Set-WinCultureFromLanguageListOptOut -OptOut $False

#タイムゾーンを東京にします
Set-TimeZone -id "Tokyo Standard Time"

#ロケーションを日本にします
Set-WinHomeLocation -GeoId 0x7A

#システムロケールを日本にします
Set-WinSystemLocale -SystemLocale ja-JP

#ユーザーが使用する言語を日本語にします
Set-WinUserLanguageList -LanguageList ja-JP,en-US -Force

#入力する言語を日本語で上書きします
Set-WinDefaultInputMethodOverride -InputTip "0411:00000411"

#ようこそ画面と新しいユーザーの設定をコピーします
Copy-UserInternationalSettingsToSystem -welcomescreen $true -newuser $true

#サーバーを再起動します
Restart-Computer 

この内容に加えて、私は US 配列キーボードを使用している為に日本語入力の設定を変更しました。

IME の ON / OFF は Ctrl + Space で統一しています。

その他の設定

Visual Studio Community 2022 の削除

今回は Visual Studio Community 2022 は使用しませんので削除しました。

PowerShell 7 を winget でインストール

管理者で Terminal を起動し、winget upgrade を実行しました。

winget upgrade

初回はソース契約条件に同意するかどうかのメッセージが表示されますので「y」を入力します。

未更新のファイルがありましたが後回しにして、PowerShell 7 を winget でインストールします。(単なる好みです)

winget upgrade --all

次に下2行の Microsoft.VCRedist.2015+.x64 と Microsoft.VCRedist.2015+.x86 をアップデートします。

winget upgrade --all

Microsoft Edge のアップグレード

Microsoft Edge はブラウザからアップデートします。三点リーダーから「ヘルプとフィードバック」-> 「Microsoft Edge について」を選択します。

バージョン情報の下の欄で、必要であればアップデートが始まり、終了すれば「Microsoft Edge は最新です。」と表示されれば OK です。

Windows Update の実施

最終的に Windows Update を実行し、普通に使える状態までなりました。

仮想マシンにGPU-PV、GPU-P の設定

ここからが本題です。

Windows11 開発環境の仮想マシンで、ホスト側の GPU を認識させるには、以下の PowerShell コマンドをホスト側の「管理者」として起動した PowerShell で実行します。

Add-VMGpuPartitionAdapter -VMName "Windows11_devel_20240302"
Set-VMGpuPartitionAdapter -VMName "Windows11_devel_20240302" -MinPartitionVRAM 300000000
Set-VMGpuPartitionAdapter -VMName "Windows11_devel_20240302" -MaxPartitionVRAM 800000000
Set-VMGpuPartitionAdapter -VMName "Windows11_devel_20240302" -OptimalPartitionVRAM 500000000
Set-VMGPUPartitionAdapter -VMName "Windows11_devel_20240302" -MinPartitionEncode 300000000
Set-VMGPUPartitionAdapter -VMName "Windows11_devel_20240302" -MaxPartitionEncode 800000000
Set-VMGPUPartitionAdapter -VMName "Windows11_devel_20240302" -OptimalPartitionEncode 500000000
Set-VMGpuPartitionAdapter -VMName "Windows11_devel_20240302" -MinPartitionDecode 300000000
Set-VMGpuPartitionAdapter -VMName "Windows11_devel_20240302" -MaxPartitionDecode 800000000
Set-VMGpuPartitionAdapter -VMName "Windows11_devel_20240302" -OptimalPartitionDecode 500000000
Set-VMGpuPartitionAdapter -VMName "Windows11_devel_20240302" -MinPartitionCompute 300000000
Set-VMGpuPartitionAdapter -VMName "Windows11_devel_20240302" -MaxPartitionCompute 800000000
Set-VMGpuPartitionAdapter -VMName "Windows11_devel_20240302" -OptimalPartitionCompute 500000000
Set-VM -GuestControlledCacheTypes $true -VMName "Windows11_devel_20240302"
Set-VM -LowMemoryMappedIoSpace 1GB -VMName "Windows11_devel_20240302"
Set-VM –HighMemoryMappedIoSpace 32GB –VMName "Windows11_devel_20240302"

コピーして PowerShell に貼り付けするとそのまま反映されます。VMName は作成した仮想マシンの名称に合わせてください。

反映されているかどうかは、以下のコマンドを実行するとわかります。

Get-VMGpuPartitionAdapter -VMName "Windows11_devel_20240302"

反映前 :

なにも表示されません。

反映後 :

InstancePath            :
CurrentPartitionVRAM    :
MinPartitionVRAM        : 300000000
MaxPartitionVRAM        : 800000000
OptimalPartitionVRAM    : 500000000
CurrentPartitionEncode  :
MinPartitionEncode      : 300000000
MaxPartitionEncode      : 800000000
OptimalPartitionEncode  : 500000000
CurrentPartitionDecode  :
MinPartitionDecode      : 300000000
MaxPartitionDecode      : 800000000
OptimalPartitionDecode  : 500000000
CurrentPartitionCompute :
MinPartitionCompute     : 300000000
MaxPartitionCompute     : 800000000
OptimalPartitionCompute : 500000000
PartitionId             :
PartitionVfLuid         :
Name                    : GPU パーティションの設定
Id                      : Microsoft:CD93CFE0-1765-498C-AC40-4D92BF9DC52F\AA70E7C2-5351-4E1F-8586-A869CA0713B4
VMId                    : cd93cfe0-1765-498c-ac40-4d92bf9dc52f
VMName                  : Windows11_devel_20240302
VMSnapshotId            : 00000000-0000-0000-0000-000000000000
VMSnapshotName          :
CimSession              : CimSession: .
ComputerName            : HIRO-PC
IsDeleted               : False
VMCheckpointId          : 00000000-0000-0000-0000-000000000000
VMCheckpointName        :

設定した値が反映されています。

これで GPU-PV と GPU-P の設定が反映されました。

なお、以下のページを参考にしました。

ホスト側の GPU ドライバ等を仮想マシンへコピー

初期状態では GPU ドライバが無い

ホスト側の GPU-PV と GPU-P の設定が終了した段階で、一度仮想マシンを起動してみます。

この状態でデバイスマネージャーを見ると、仮想マシン内で NVIDIA GeForce RTX 3060 は認識されていますが、ドライバが無い状態です。

プロパティを見てもドライバが読み込まれておらず、停止している状態です。

GPU ドライバをホスト側からコピー

この対策として、ホスト側からドライバをコピーする事で認識させる事が出来ます。(残念ながら、nVidia のサイトからドライバのインストールは出来ませんでした)

ホスト側 C:\Windows\System32\DriverStore\FileRepository\ の以下のディレクトリを仮想マシンのデスクトップに Copy & Paste します。

nv_dispi.inf_amd64_830091b3ebd4b98a

後半の英数字は、インストールしている nVidia GPU ドライバのバージョンによって変わります。先頭が nv_dispi.inf_amd64_ で始まるディレクトリを探して下さい。

コピーしたディレクトリを、仮想マシンの C:\Windows\System32\HostDriverStore\FileRepository\ へコピーします。一旦デスクトップを経由しないと上手く行きませんでした。

その後、仮想マシンを再起動すると、GPU が認識されるようになります。

プロパティでも動作していると表示されています。

仮想マシンの Windows11 で CUDA を動作させる

以下の二つのファイルを、上の手順と同様に、ホスト側から仮想マシン側へコピーします。

C:\Windows\System32\nvapi64.dll
C:\Windows\System32\nvidia-smi.exe

一旦デスクトップを経由して、同じディレクトリへ配置します。

nvidia-smi.exe はオマケです。nvapi64.dll をコピーすると、仮想マシンの Windows11 開発環境で CUDA が使用できるようになります。

Driver Ver.551.61、CUDA 12.4 まで対応しています。ただ、GPU-P で制限しているはずなのですが、Memory-Usage の分母は 12288MiB のままです。とりあえず使えているようです。

Windows11 版の VOICEVOX や Stable Diffusion WebUI Forge を軽く動作させてみましたが、ホスト側の GPU 負荷やメモリ使用量を見ると、ちゃんと GPU を使用していました。

仮想マシンに Nested Virtualization の設定

仮想マシンで Nested Virtualization を設定するには、仮想マシンを停止して、「管理者」の PowerShell で以下のコマンドを実行します。

Set-VMProcessor -VMName "Windows11_devel_20240302" -ExposeVirtualizationExtensions $true

VMName は適宜変更して下さい。

これで仮想マシンの Windows11 開発環境を起動すると、WSL2 や Hyper-V が使えるようになります。

Hyper-V Windows11 の WSL2 で CUDA は使えない

Nested Virtualization の影響なのか、nVidia GPU ドライバをインストールしていない影響なのか、原因は分かりませんが、Hyper-V 仮想マシンの Windows11 開発環境の WSL2 では CUDA を使う事は出来ませんでした。

  • ホスト側の C:\Windows\System32 以下の nv* の仮想環境へのコピー
  • ホスト側の C:\Windows\System32\lxss\lib 以下の lib* の仮想環境へのコピー

この2点によって、WSL2 の /usr/lib/wsl/lib 以下に WSL2 用のライブラリは準備されるのですが、WSL2 の nvidia-smi コマンドを実行すると次のエラーが表示されます。

Failed to initialize NVML: GPU access blocked by the operating system
Failed to properly shut down NVML: GPU access blocked by the operating system

ググると WSL2 Docker 絡みで同じようなエラーが出ているようですが、今回の解決方法は見つかりませんでした。

もう少し対処方法を探してみます。

まとめ

Hyper-V で試用版の Windows11 開発環境を動作させて、

  • GPU-PV と GPU-P で仮想マシンで GPU を使う設定
  • 仮想マシンの Windows11 で CUDA を使う設定
  • 仮想マシンで WSL2 & Hyper-V を使う設定

以上の事について説明しました。90日間とはいえ、試用できる素の Windows11、それも幾度も消して試す事ができる環境を作る事ができました。

ある程度設定の済んだ仮想 HDD (vhdx) を保管しておけば、多少無茶な事を行っても、元の状態から始められるので便利です。

仮想マシンの Windows11 の WSL2 で CUDA が使用できない事は残念でしたが (実はこの部分が本命でした…)、Windows Sandbox とは異なる、設定を残したまま使える環境が入手できたのは、この先に色々と試すのに便利だと思います。

今回のアイキャッチ画像

桜並木の間を歩く人を SDXL & Forge で生成しました。

春の生まれですが、花粉症という言葉が世の中に生まれる前、アレルギー性結膜炎と呼ばれていた時代からの花粉症です。今年は発症が早く、鼻より目がきつめです。目薬と点鼻薬で季節が変わるまでは対処します。

仮想マシンや生成 AI を使いだすと、高速な SSD が大量に欲しくなります。今も M.2 NVMe SSD 2TB を使用していて、生成した画像は直ぐに NAS に移しているのですが、モデルのサイズが大きいので SSD の空き容量はどんどん減少しています。ヒートシンク付きの M.2 NVMe SSD 2TB をもう一つ購入しようか思案中です。

コメント

タイトルとURLをコピーしました