将棋AI「dlshogi」のpython版をAMDの内蔵GPUで動かしたこと、onnxruntime版もCPUで動作したことは先日報告した通りだ。その後の検証でいくつか訂正すべき点が見つかったのでそれらについて書く。
速度の違い
当初の記事で、GPUでのNPS値(1秒あたりの探索ノード数)よりCPUでのNPS値の方が高い、と書いていたが私の勘違いであった(ペコリ)。GPUのNPSは1000~2000の値が出ているのに対し、CPUのNPSは700前後である。2倍程度ではあるがGPUの方が早い。画面のスクショを取っておいたがシェアオフィスに忘れてきたので今日はアップできない。後日アップしたい。
2024-02-13 追記
Python版dlshogi GPU動作時、Python版dlshogi CPU動作時、C++版dlshogi CPU動作時のNPS値のスクショをアップする。全てShogiGUIでの対局開始時の値である。
onnxruntimeのROCmのサポート
onnxruntimeはAMDのGPUをサポートしていないと認識していたが、これは32bitアプリ(X86)がサポートされていないだけで、64bitアプリ(X64)はサポートされていた。これも私の勘違いであった(再びペコリ)。
名誉挽回のため、この週末でonnxruntimeを動作させようと奮闘した。python版だのonnxruntime版だのとややこしい話なので、dlshogiに興味の無い方はこの後はスルーしていただいて結構である。
onnxruntimeをビルドする
onnxruntimeでAMDのGPUを動かすには、onnxruntime自体をソースからビルドする必要がある。これは厳しい戦いになりそうだ。結論を先に言うと1日頑張ってみたが動かせなかった。とりあえず今日行ったことをここに書かせてもらう。そうしないと私自身忘れてしまいそうなので。。(三度ペコリ)
クローン
onnxruntimeをgithubからクローンする。
$ git clone https://github.com/microsoft/onnxruntime.git
ビルド
ビルドする。
$ cd onnxruntime $ ./build.sh --config Release --use_rocm --rocm_home /opt/rocm
[ERROR] - Failed to resolve executable path for 'cmake'.
cmakeコマンドがないと怒られる。cmakeをインストールする。
$ sudo apt update $ sudo apt install cmake $ cmake --version cmake version 3.22.1
再びビルドする。cmakeのバージョンが古いと断られる。
$ ./build.sh --config Release --use_rocm --rocm_home /opt/rocm
CMake Error at CMakeLists.txt:5 (cmake_minimum_required): CMake 3.26 or higher is required. You are running version 3.22.1
cmakeを再インストールする。
こちらのサイトからcmakeの最新cmake-3.28.0-linux-x86_64.tar.gzをダウンロードし、cmake-3.28.0-linux-x86_64に展開してから下記のようにインストールする。
$ sudo mv cmake-3.28.0-linux-x86_64 /opt $ sudo ln -s /opt/cmake-3.28.0-linux-x86_64/bin/* /usr/bin
.bashrcに以下を追加する。
export PATH=/opt/cmake-3.28.0-linux-x86_64/bin:$PATH export CMAKE_PREFIX_PATH=/opt/cmake-3.28.0-linux-x86_64:$CMAKE_PREFIX_PATH
コマンド入力画面を立ち上げ直してバージョンを確認する。
$ cmake --version cmake version 3.28.0
再びビルドを実行する。途中まで動くがエラーで止まる。/opt/rocm/.info/version-dev というファイルがないというエラーが出ているので、ファイルをコピーして作成する。
$ cd /opt/rocm/.info $ sudo cp version version-dev
再びビルドを実行する。 'cmath' file not found というエラーが出て止まる。ググって見るとlibstdc++-11-dev でそのエラーが出たが、libstdc++-12-dev のインストールで解決したという報告があった。libstdc++-12-dev をインストールする。
$ sudo apt install libstdc++-12-dev
何度目になるだろう。再びビルドを実行する。
error: Illegal instruction detected: Operand has incorrect register class. renamable $vgpr0_vgpr1_vgpr2_vgpr3 = BUFFER_LOAD_DWORDX4_OFFEN renamable $vgpr0, killed renamable $sgpr8_sgpr9_sgpr10_sgpr11, renamable $vgpr1, 0, 0, 0, implicit $exec :: (dereferenceable load (s128), align 1, addrspace 7) error: Illegal instruction detected: Operand has incorrect register class. BUFFER_STORE_DWORDX2_OFFEN_exact renamable $vgpr0_vgpr1, renamable $vgpr2, killed renamable $sgpr8_sgpr9_sgpr10_sgpr11, renamable $vgpr3, 0, 0, 0, implicit $exec :: (dereferenceable store (s64), align 1, addrspace 7) error: Illegal instruction detected: Operand has incorrect register class. renamable $vgpr0 = BUFFER_LOAD_UBYTE_OFFEN renamable $vgpr0, killed renamable $sgpr8_sgpr9_sgpr10_sgpr11, renamable $vgpr1, 0, 0, 0, implicit $exec :: (dereferenceable load (s8), addrspace 7) error: Illegal instruction detected: Operand has incorrect register class. BUFFER_STORE_BYTE_OFFEN_exact renamable $vgpr0, renamable $vgpr1, killed renamable $sgpr8_sgpr9_sgpr10_sgpr11, renamable $vgpr2, 0, 0, 0, implicit $exec :: (dereferenceable store (s8), addrspace 7) error: Illegal instruction detected: Operand has incorrect register class. BUFFER_STORE_DWORDX4_OFFEN_exact renamable $vgpr0_vgpr1_vgpr2_vgpr3, renamable $vgpr4, killed renamable $sgpr8_sgpr9_sgpr10_sgpr11, renamable $vgpr5, 0, 0, 0, implicit $exec :: (dereferenceable store (s128), align 1, addrspace 7) 5 errors generated when compiling for gfx1030.
訳のわからないエラーが出て止まる。ここで力尽きた。。
まとめ
DAZNでスーパーボウルのチーフス対49ers戦を観戦しながら頑張ってみたのだが、onnxruntimeのビルドはチーフスのように手強い相手だった。onnxruntimeは最新バージョンのROCm6.0もサポートしているはずなのだが。。仕方ない。これも経験である。