シンギュラリティ実験ノート

購入した1000ドルPCで何がどこまでできるのか実験した記録です。

Ubuntu環境でGPUドライバをインストールしMNIST

UM790 Proで最新のUbuntu環境に、最新のAMDGPUドライバをインストールすることでMNISTが動作することを確認したので報告したい。

Ubuntu+amdgpu+docker環境での動作確認

Ubuntu22.04LTS

amdgpuがサポートされるOSはLinuxのみである。私は使い慣れているUbuntuを選択した。バージョンは22.04LTSである。内蔵SSDWindows用に使いたいので外付けHDDをUSB3.0で接続してインストールした。現状OSが起動するまでに約2分かかる。外付けSSDを使用した方が起動は早いのであろうが、とりあえずこれで我慢する。

Ubuntuのインストール方法も書こうと思ったが、GPUでDeepLearningしたい人はおそらく自分でインストールくらいできると思うので、ここでは書かないことにした。

amdgpu+docker

amdgpuは関係するGPUドライバのインストールプログラム、dockerはOSの仮想環境を管理するソフトである。

環境構築方法は、基本的に以下のサイトに書かれた通りである。

ROCm-docker/quick-start.md at master · ROCm/ROCm-docker · GitHub

ただし幾つか注意点があったのでその点だけここに記したい。

1.ドライバは仮想環境上ではなく、素のOSにインストールすること

上記サイトの手順もそうなっているので間違えるのは私だけかもしれないが、ドライバはOSの下層で動くものらしく、素のUbuntu(dockerの用語ではdockerホスト)にインストールしなければならない。docker環境でインストールしてもエラーとなる。WindowsのWSL2でROCmが動かないというのも、Windows対応のドライバが提供されていないことが理由と考えると腑に落ちる。

2.最新バージョンのamdgpuでインストールすること

上記サイトではバージョン5.3を使用しているが、最新バージョン(現時点では6.0)を使用してほしい。5.3で行うとamdgpu-dkmsのインストールあたりでエラーとなる。私は6.0でインストールし直した。6.0のインストールコマンドは以下のAMDのページにある。

Installation via AMDGPU installer — ROCm installation (Linux)

3.環境変数 HSA_OVERRIDE_GFX_VERSION の設定

環境変数HSA_OVERRIDE_GFX_VERSIONを設定しPython起動時に渡す必要がある。そのためには以下の様に記述する。

HSA_OVERRIDE_GFX_VERSION=11.0.0 python3 main.py

上記はMNISTのメインプログラムmain.pyをPythonで起動するコマンドの例である。Radeon 780M の場合、GPUの名前は gfx1103 となっているが gfx1103 は未対応なため gfx1100 として実行するということのようだ。

4.最新バージョンのROCm対応PyTorchをインストールする

下記ページで最新版をインストールするコマンドを確認してインストールする。

Start Locally | PyTorch

現時点で最新版は5.6で、インストールコマンドは以下の通りである。

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm5.6

docker環境でのMNIST実行結果

確認に使用したサンプルプログラムは「強い将棋ソフトの創り方」の第4章に出てくる手書き数値認識を学習するプログラムである。

強い将棋ソフトの創りかた: Pythonで実装するディープラーニング将棋AI Compass Booksシリーズ

#GPU使用

root@d311ffeb24bf:/var/lib/jenkins# time HSA_OVERRIDE_GFX_VERSION=11.0.0 python3 ./python_src/MNIST_ROCm.py
Epoch: 1/10, Loss: 0.6641491190592448
Epoch: 2/10, Loss: 0.26600072224934895
Epoch: 3/10, Loss: 0.20968803405761718
Epoch: 4/10, Loss: 0.17601552327473957
Epoch: 5/10, Loss: 0.15112206776936848
Epoch: 6/10, Loss: 0.13203323364257813
Epoch: 7/10, Loss: 0.11685216267903646
Epoch: 8/10, Loss: 0.1041392199198405
Epoch: 9/10, Loss: 0.09288497924804688
Epoch: 10/10, Loss: 0.08400172551472981
Loss: 0.10116208076477051, Accuracy: 96.93% (9693/10000)

real	0m26.204s
user	0m26.041s
sys	0m1.684s

#CPU使用

root@d311ffeb24bf:/var/lib/jenkins# time HSA_OVERRIDE_GFX_VERSION=11.0.0 python3 ./python_src/MNIST_ROCm.py --no-cuda
Epoch: 1/10, Loss: 0.6691548156738282
Epoch: 2/10, Loss: 0.26984336853027346
Epoch: 3/10, Loss: 0.2121896743774414
Epoch: 4/10, Loss: 0.17744157155354817
Epoch: 5/10, Loss: 0.15332136789957682
Epoch: 6/10, Loss: 0.13381392161051434
Epoch: 7/10, Loss: 0.1180782953898112
Epoch: 8/10, Loss: 0.10525231679280599
Epoch: 9/10, Loss: 0.09426196416219075
Epoch: 10/10, Loss: 0.0852108891805013
Loss: 0.1035841178894043, Accuracy: 96.83% (9683/10000)

real	0m23.325s
user	2m50.633s
sys	0m1.328s

CPUの方が早いという結果になっている(笑)。別のサンプルプログラムではGPUの方が倍早い結果も出ているので、サンプルによるのかと思う。

ここまで書いておいて申し訳ないのだが、dockerでの環境構築を私はお勧めしない。現在、私は素のUbuntu環境にamdgpuとROCm対応PyTorchをインストールして使用している。素のUbuntu環境を汚したくないなどの事情があるならともかく、外付けHDDかSSDUbuntu環境を作成してテスト環境と割り切って使うか、運用環境とテスト環境を分けたいなら、デュアルブート環境を作成する方が使い勝手がいいし簡単であると思う。私は500GBのHDDに230GBのUbuntu環境を2つ作成し、残りの40GBをFAT32のドライブとして利用している。こうすることで40GBのドライブが複数のUbuntu環境とWindows環境からも共有できて非常に便利である。

Ubuntuデュアルブート環境構築についてはこちらのサイトを参考にさせて頂いた。

dailylife.pman-bros.com