見出し画像

[オタク機器日記] WSL2でNVIDIA Telsa P40を利用する

NVIDIAの佐々木さんが2022年にCUDA on WSL2をQiita記事投稿している。

これ、実にうらやましい話だったりする。なぜなら僕の$200ドル(1ドル150円換算で3万円)中古NVIDIA Telsa P40は、WSL2では普通に使うことが出来ない。NVIDIAの認定構成を採用した上で新品を購入すれば、WSL2で使えるドライバを提供して貰えるらしい。

しかし... 3万円ならばともかく、300万円は無理だ。

そのため今日も、アレコレと工夫してデータセンター向けGPUであるNVIDIA Telsa P40を、なんとWSL2上で利用している。どうやって一見すると無理ゲーに見えることを実現しているか、今回はその苦労を紹介させていただくことにする。

まずWindowsでP40を利用可能に

これは自分でQiita記事を作成したけれども、そもそもデータセンタ向けGPUのP40を個人利用のパソコンで利用するのは無理がある。冷却一つとっても、自分でGPUに空気を流し込む冷却ファンを自作する必要がある。

冒頭画像の12cm大型ファンは、見た目はひどいが性能はすごい。今まで50度を超えたことがなく、実は今もTelsa P40搭載マシンで本記事を書いていたりする。静かなのにLLM利用が可能... 多くの人にとっては夢のような環境かと思う。

しかし毎晩毎晩アレコレと厚紙で試作を重ねる僕に対して、家族の目が痛かったことは言うまでもない。

実はここではサラリと流したけれども、たとえGPUのvBIOSをnvflash64コマンドでgraphicsへモード変更しても、WSL2では認識してくれない。

ただし蛇の道はヘビで、やってやれないことはない。それが本日の主テーマである。

秘奥義レジストリ書き換え

さてWSL2で利用するには、vBIOSだけをGraphicsへ変更してもダメなのだ。nvidia-smiコマンドなどを試すと分かるけれども、Telsa Compute Cluster (TCC) モードで稼働している。WSL2はこの設定を認識して、「GPUなし」で動作する。

冒頭で説明したけれども、普通は2通りの方法しかない。

  • サポート契約して対応ドライバを提供して貰う

  • GeForce(こちらはWDDMモード動作)を利用する

しかし... レジストリを修正すれば、実はTelsa P40であっても、WDDMモードで動作しているように見せかけることが可能だ。そこで僕の場合は、次のように運用している。

  • レジストリを修正

  • Windows再起動

  • WSL2起動&利用

  • レジストリ再修正

なんでこんなに手間のかかることをやっているかというと、レジストリを書き換えた後は再起動しないと認識してくれないし、WSL2を起動&利用可能になっても、その時点でレジストリが書き換わってしまっている。

だからそのままにしておくと、WSL2を使い終わった後で電源オフ/オンしたり再起動すると、正常にディスプレイ表示されないというトラブルと遭遇する羽目になる。だから面倒でもレジストリ再修正が必要となる訳だ。

ただし若干面倒だけれども、スリープ/休止状態を活用するとか、静音性ゆえに常時稼働させておけば、レジストリ修正も大した手間ではなくなる。だからWSL2でTelsa P40の中古品を利用するというのも、それなりに「アリ」なのではないかと思っている。
(少なくとも僕はWSL2とP40の組み合わせに感謝している)

ちなみに具体的な書き換え手順は、次の通りだ。レジストリエディタ (regedit) の起動方法を知らないレベルであれば、止めておいた方が良いかと思う。もちろん本作業に関して、当局は一切の責任を負わない。事故リスク… 自己リスクだ。

  • レジストリの変更箇所へ移動
    Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class{4d36e968-e325-11ce-bfc1-08002be10318}

  • 0001とか0002といったサブフォルダ内のDriveDescキーを確認し、オンボードとNVIDIAのGPUを使用しているものを特定する。(僕の場合は0000がIntel HUD 630で、0001がTelsa P40だった)

  • P40側のApaterTypeキーを2(当初の値)→1へ変更

  • FeatureScoreキーをcf→d1へ変更 (ちなみにこれは16進数表記)

  • DWORD(32bit)形式でGridLicensedFeaturesキーを作成し、7を入力

  • F5キーでリフレッシュ

  • AdapterTypeキーを削除

  • DWORD(32bit)形式でEnableMsHybridキーを作成し、1を入力

  • オンボードGPU側に移動し、DWORD(32bit)形式でEnableMsHybridキーを作成し、2を入力

  • F5キーでリフレッシュ

  • PCを再起動してからWSL2を起動し、nvidia-smiコマンドで動作確認

  • あとはいつも通り、WSL2&Ubuntu22.04環境などでLLMを利用

そしてWSL2の利用が終わったら、次の作業(レジストリのデータを元に戻す)を実施する。

  • レジストリの変更箇所へ移動
    Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class{4d36e968-e325-11ce-bfc1-08002be10318}

  • オンボードGPU側で、DWORD(32bit)形式でEnableMsHybridキー削除

  • P40側へ移動し、同様にEnableMsHybridキー削除

  • 続いてDWORD(32bit)形式でEnableAdapterTypeキーを作成し、2(当初の値)を入力

  • さらにGridLicensedFeaturesキーを削除

  • FeatureScoreキーをd1→cfへ戻す

こうしておけば、この後の電源オフ/オンや再起動で、黒画面にお目にかかるようなことは無くなる。

そしてもしも万一レジストリを再修正することを忘れ、その結果として黒画面に遭遇しても慌てないことだ。しばらく待っても状況に変化がなければ、一旦は強制電源オフを実施する。そしてTelsa P40やV100といったデーターセンター向けGPUなどを全て取り外し、再び電源オンして様子を見るのが良い。

実際にやってみると分かるけれども、やはりWindowsはWindowsでこちら側のレジストリ書き換えを認識して、EnableMsHybridキーの番号を変更してくれる。おそらく性能の良いGPUを優先してくれようとする機械心?と思うが、これがモニター出力端子のない計算専用GPUに悲劇をもたらす。

と、いう訳で、ちょっと面倒だし、何となく本当にWDDMモードで動作しているのかノーマルUbuntu環境よりも遅い&メモリ消費が激しいような気がするけれども、そのくらいはご愛敬だと思っている。やっぱりWSL2環境だとtarコマンドでバックアップ環境を採取/復元するのに手間がかからず、この便利さは捨てがたい。

(僕の場合はSSDを外付け… 盲腸のように筐体外に出しているので、いつでもUbuntu 22.04環境からUbuntu 20.04環境へのスイッチは簡単だけれども)

恰好悪いけど、見た目より便利さ優先で

それでは今回は、この辺で。ではまた。

P.S.
ちょっと面倒もイヤになったので、ログイン後にレジストリを自動書き換えするに設定してみた。快調、快調。

==========
 オノセー (小野谷静)

この記事が気に入ったらサポートをしてみませんか?