NVIDIA P40とWindows 11非対応のPCでLLMする (備忘録)

もはやWindows 11非対応のPCを、もったいないのでNVIDIA Telsa P40というデータセンタ向けGPUでLLM利用環境へ整備した。劇遅だけれどもP40はGPUメモリ24GBで、eBayなどでは格安調達が可能。

なおNVIDIA Telsa P40は古くなったとはデータセンタ向けGPUであり、一般向けGeForceとは一味も二味も異なる。良い子はデータセンタ向けマザーボードなどのNVIDIA認定構成で環境構築するか、GeForceでLLM環境を構築しましょう。

[使用した構成]
<ul>
<li>ASRock Z170M PRO4マザーボード</li>
<li>Intel Skylake世代のCPU</li>
<li>インストール用USBメモリ</li>
<li>750Wの大出力電源ユニット</li>
<li>NVIDIA Telsa P40 (24GB)</li>
<li>WQHQモニター (DELL P2418D)</li>
<li>家族か友人の最新世代PC</li>
<li>固まった画面を見て折れない心</li>
</ul>

# 最初にマザーボード設定ありき

NVIDIA Telsa P40には、モニター出力端子など存在しない。硬派な計算専用GPUだ。

そして一般ユーザ向けのマザーボードは、PCIeスロットにP40だけを接続すればx16で動いてくれるけれども、モニター出力用のGPUも接続するとX8 x 2のようになってしまうことが多い。そしてサーバ用マザーボードのようにモニターなしでは設定困難である。

少しでも性能を出したいので、今回はオンボードGPUで画面出力した。まずは電源投入直後のDELETEキーでBIOS画面に入り、オンボード専用出力へ変更した。

<ul>
<li>オンボードグラフィックス：PEIE -> オンボードへ</li>
<li>Integrated Graphics：Disabled -> Enabled</li>
</ul>

# お次は冷却機構の工作

もともとGPUを組み込んでLLM環境を構築する者は自作PC派が多いと思うけれども、今回はP40の冷却機構の自作が必要となる。パッシブ冷却方式なので、GPUファンという軟派な装備は付属していないのだ。

eBayなどを除くと40mmファンを2つ装備できるアダプタなどを見かけるけれども、しょせんは40mmファン。7CFMを2つ程度では風量が少な過ぎて冷却効果が心配になって来る。おまけに6,000RMMあたりで回転させると大変にうるさい。

そこで僕の場合は厚紙でアダプタを自作して、12cmのケースファンを装着した。マイクロATXにギリギリ入るサイズに加工するのは苦労したし、見るからにアヤシゲだけれども威力はすごい。

![20230909_120349058_iOS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558027/7dc13b25-0c40-cbe6-8bda-29011e1b769b.jpeg)

最大出力112CFMのファンをマザボのケースファン用端子に装着し、2,000RMPで回転させている。さすがに普通のパソコン並みに静かとは言えないけれども、かつてGeForce 980Tiの全力稼働時のような騒音とは無縁だ。GPU温度上昇にヒヤヒヤすることもなく、精神衛生的には大変に宜しいと言える。

# 持つべきものは友人や家族

ところでP40は、そのままではASRock Z170M PRO4では使えない。Windows環境の場合はデバイス・マネージャで確認すると、Code 12でリソース競合が発生していることが分かる。NVIDIAへ相談したくても、「認定構成ではないので対応いたしかねます」という返事になってしまう。NVIDIAスタッフとしては当然のスタンであり、僕にしても某ソフトウェアの再販をやっていた時には、同じことをお客様に申し上げていた。

この問題はRedditなどを参照すると、対応方法が紹介されている。世界は広く、P40の24GBに釣られて「おうちラボ」を構築するのは世界的な現象だ。Resisable BARやAbove 4G Decoding設定が必要だと分かる。

ASRockの場合はBIOSバージョン4.30E(β版)で「Add setup item "C.A.M. (Clever Access Memory)"」に対応しており、このBIOSを使って設定変更をすることになる。そうするとTelsa P40を無事に認識＆利用できるようになる。(ちなみにCSMをEnabled -> Disabledに変更しないと設定項目が表示されないというトラップ的な設定ノウハウが必要となる)

そこでまずは家族や友人に泣きついて、最新世代のPCを借用して、そのPCにP40を装着＆認識させる必要がある。で、そこで、P40のvBIOSを書き換えるという作業が必要になる

--> 危険な行為であり、全て自己リスクで。下手するとグラボが文鎮化する

Windows環境でデバイス・マネージャから無事にP40が正常認識されている状況で、nvflash64コマンドを利用する。このツールはGPUZ開発者が提供しているもので、同じTechPowerUPサイトから入手できる。

もちろんBIOSの書き換えは注意を用意する行為であり、事前にバックアップなどを取っておくことが望ましい。このあたりはNVIDIAフォーラムの"P100 not showing up in nvidia-smi"スレが詳しいので、どうしてもやりたい人は参考にすることをオススメする。

なお僕はマイニングで利用された中古P40だったので挑戦したけれども、なんかマイニング用にvBIOSが書き換えれていたような気がしないでもない。そういう意味で、己の技術力に絶対の自信があるか、ダメもとで挑戦するくらいの覚悟がなければ、中古グラボには手を出さないのが賢明だろう。
(僕も友人からは、「やめたほうが良いんじゃないか」と再三の忠告を貰った)

とりあえずvBIOSを書き換えることにより、無事にASRock Z170M PRO4でもP40を正常認識できるようになる。ただし基本的にTCC(Telsa Compute Cluster)モードで動作しているので、WindowsのWSL2環境では利用できない。

これは僕が調べたところでは、正規ユーザでサポート対象者であれば、NVIDIAからWSL2でも利用できるドライバを提供して貰えることになっている。残念ながら出所不明の中古品購入者は対象外だ。

# Ubuntu利用

さて準備が整ったところでUbuntuインストールとなる。
なおオススメはUbuntu 22.04となる。僕はASRock Z370＆Ubuntu 20.04＆Full HDモニターでP40を利用できているけれども、なぜか同じ環境をZ170M PRO4で実現できていない。なぜだかX Windowで表示された画像が乱れてしまう。おそらくドライバか何かが不足しているとか設定関連だと思うけれども、そこまで検証する気が起きない。

ともかくUbuntu 22.04ならば全く問題はないので、まだAIスパコンは20.04が多いとは思うけれども、自宅環境だから22.04をオススメしたい。(壁があれば乗り越えたくなるのが技術者だけれども、今回はLLM環境を稼働させることが目的だ。インフラを楽しんでいる余裕はないのである(言い訳))

で、僕は金子研究室を参考にさせて頂いているけれども、アチコチに転がっているUbuntu 22.04インストール手引きに従って作業すれば... クラゲしか表示されない画面で手詰まりな状況に突入する。

なぜなら普通はnouveauドライバからNVIDIAドライバへ切り替える訳だけれども、P40はモニター出力端子など存在しない。だからX WindowはNVIDIAドライバを利用しようとして、「訳分からない画面表示で操作不能」という状況になる。

これを回避するには、NVIDIAドライバをインストールする前に、まずはX Windowが起動することを停止する設定をする。

```
sudo systemctl set-default multi-user.target
```

そして再起動をかけて、コマンド画面でログインする。ログインしたら、まずはxorg.confファイルを作成する。

```
sudo nvidia-xconfig
```

それからオンボードGPU側の情報を確認しておく。

```
lspci | grep VGA
```

僕の場合はP40が1:0,0で、Intel 630が0:2,0だった。
そういえばvBIOSの書き換えをしないP40の場合、ここでは表示されることがない。見た目も中身もTCC modeだから、VGAで認識されないということらしい。なかなかデータセンタ向けGPUというのは面白い。

そして必要な情報を得たのちに、xorg.confを書き換える。僕は歳がバレてしまうけれども、未だにviを利用している。

```
sudo vi /etc/X11/xorg.conf
```

ここでDevice欄を書き換える。ドライバはNVIDIA --> intelへ変更した。そして肝心のBusIDを1:0:0 -> 0:2:0へ書き換えた。これにより出力先がP40からIntel 630へ切り替えられることになる。

で、X Windowsで利用するGPUの変更が終わったら、再びX Windowで起動するように設定変更を実施する。

```
systemctl set-default graphics.target
```

あとはshutdown -r nowなどで再起動をかければ、めでたくクラゲ壁紙だけでなく、ツールバーなども表示されるようになる。

# ようやくCUDAインストール

さてめでたくX Windowsの出力変更も完了し、nvidia-smiコマンドも正常表示されるようになったものの、まだ油断することはできない。

ネットには悲しい呻きが満ち溢れているように、CUDAのインストールというのは一筋縄ではいかない。僕の場合も金子研究室のお世話になったものの、dpkg依存関係が壊れたとやらのメッセージが表示され、手順通りにはいかなかった。

別マシンでは "CUDA" "11.7" "download" で検索して表示されるNVIDIAページの指示に従って上手くインストールできたが、今回はその方法も通用しなかった。

sudo dpkg --configure nvidia-driver-535などを実行しても、効果はない。最終的はインストール不成功時に表示されたメッセージに従い、修正インストールしたら上手くいった。

```
sudo apt --fix-broken install
```

この後でPyTorchをインストールして試したら、GPUが "true" と表示されたので、基本的な導入作業は完了したと考えて良いだろう。本来の目的は各種LLMを試してみることだったけれども、随分と時間を溶かしてしまった。

# 最後に

以上の通りで、旧式でWindows 11にさえ対応していないASRock Z170M PRO4/Intel Skylakeという構成で、旧世代とはいえデータセンタ向けTelsa P40を利用することが出来るようになった。遅いけれども、LLMにおいてVRAM容量は正義である。今のところは何の不自由もなく稼働してくれている。
(手頃な価格で提供されているので、マルチGPU構成も可能なのが大変に嬉しい)

しかし... Telsa P40も悪くはないけれども、やっぱりIBMのSummitスパコンなどに採用されているNVIDIA V100を使いたいという誘惑は大きい。さすがにV100は倍精度演算を初めとして、時代を代表したGPUである。今でも現役で活躍しており、ちょっと今の僕には手がない。

でも... V100には32GBモデルも存在するし、何よりELYZA 7B版などもV100で開発された。A100 (80GB)やH100(80GB)は異次元過ぎて欲しいという願望さえ湧かないが、いずれV100は...

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