TensorRTの導入

要約

 TensorRT(TRTorch)を導入したことでNPS約1.3倍、R+70ほど。

実装等

 前回、同じデータについてMiacisとdlshogiの評価関数を比較した結果、そこまで精度に差がないのではないかという結果が得られた。この結果が正しいとすると、棋力の差は探索速度や効率に原因あるのではないかという仮説が立つ。

 GCTの加納さんから情報提供をいただき、少なくとも探索効率以前にNPSで差があることは明らかになった。

 ニューラルネットワークの推論速度についてはTensorRTが速いらしいのでそれを導入することにした。

 MiacisはPyTorch(およびそのC++APIであるLibTorch)を使っている。いくらか調べた結果、そこからTensorRTを用いたグラフのコンパイルをするためのライブラリとしてTRTorchというものが良さそうだったため、これを利用することにした。

 このライブラリではTorchScriptという形式を入力とすることでTensorRTを用いたグラフを構築することができる。というわけでまず、今までのモデルをTorchScriptへと変換する必要がある。C++内でこれを行う手法はよくわからなかったため、多少汚いものになったがPythonスクリプトを実装した。

 C++で定義しているニューラルネットワークと同じ構造のニューラルネットワークPython内で定義し、パラメータを一つ一つ手動で読み込んでくるといったものになっている。

 TorchScriptモデルが出力できれば、あとはTRTorchのチュートリアルが示すとおりに読み込み、コンパイルを行えば良い。以前強化学習によって得たパラメータをTensorRTでコンパイルし、全く同じ検証損失が得られることを確認できた。

NPSの測定

 初期局面と中盤の局面(sfen l2+P4l/7s1/p2ppkngp/9/2p6/PG7/K2PP+r+b1P/1S5P1/L7L w RBGS2N5Pgsn2p 82)の2つで計測を行った。それぞれ10秒の思考を10回行った平均値となる。

モデル NPS(初期局面) NPS(中盤局面)
LibTorch版(ランダムパラメータ) 21260 17862
TRTorch版(ランダムパラメータ) 26937 24745
LibTorch版(学習済みパラメータ) 6626 5922
TRTorch版(学習済みパラメータ) 24580 22299

 LibTorchの学習済みパラメータだけ異様にNPSが低く、妙である。ランダムパラメータで比較した場合TRTorchの導入でNPSは1.27倍だが、学習済みパラメータで比較すると3.71倍となる。

 完全に同じ学習済みパラメータではないが、1年ほど前に同じ関数で計測したNPSをツイートしており、そのときはもっと高かった。

そのときの詳細な結果が残っていたのでそれを見たところ、初期局面:18553, 中盤局面:15120であった。この結果で計算し直すとTRTorch版はLibTorch版の1.32倍であり、ランダムパラメータのときとだいたい同じくらいになる。

 学習済みパラメータを用いたLibTorch版での対局が弱いことはないので、NPSの表示だけがおかしいと見なすのがもっとも収まりがよく思える。この点に関しては要調査。

対局

 強化学習を経て得られたパラメータを用いて対局を行った。対戦相手は探索部:去年の5月時点Yaneuraou、評価関数パラメータ:Kristallweizenとなっている。Miacis側は1手0.25秒、Kristallweizen側はNodesLimit=400000。定跡はオフ。

モデル 勝数 引分数 負数 勝率 レート差
LibTorch版 558 1 441 55.9% 40.8
TRTorch版 655 0 345 65.5% 111.4

 R+70.6という結果になった。NPS約1.3倍にしてはレートの上がり方が大きいように思う。とはいえ伸びたので良し。

余談

 環境を新しくしたことで、最初は間違えて対戦相手のYaneuraouの探索部を最新のバージョンにしてしまっていた。そのときの対局結果が以下の通り。

モデル 勝数 引分数 負数 勝率 レート差
TRTorch版 451 0 549 45.1% -34.2

 先の結果と比べると-145.6であり、やねうら王の探索部は約1年でこれくらい上がっているようだ。