TPU Training) 将棋
GCT (Google Colab 基本方針
- 将棋AIで学ぶディープラーニング (山岡忠夫著) の手法を参考にする。 [1]
- 個人で利用するのが現実的な学習リソースとコストで、ディープラーニングモデルを強くするため、Google Colab を積極的に活用する。
将棋以外にも活用するため、 Python を利用する。高速化が見込まれる場合は、 Cython を利用する。- 対局時の高速化のために、dlshogi (Pytorch/TensorRT) を利用する。
- 学習時の高速化のために、dlshogi (Pytorch) を利用する。
Google の AlphaZero の手法をリスペクトするため、Google Colab (GCP) の TPU を利用する。TPU が利用できない場合は、GPU の TensorCore を有効活用するため、AMP (Automatic Mixed Precision) を利用する。TPU のバグを回避するため、ローカルPC または、クラウド の GPU を学習/推論に使用する。- ローカルPC の GPU で実際に対局し、低ノードでの学習モデルの強さを見る。
- クラウド の GPU で大会に出場し、ハードウェアリソース増強で、学習モデルの強さを向上する。
- 費用対効果見合いで、NVIDIA A100 を活用する。
使用ライブラリ
dlshogi (Pytorch)/Apery
C++の実装をPythonに移植する際の参考。AMP対応して高速化する。Pytorch 1.5 + apex は、issue が多く、安定動作するまで厳しかった。
- Pytorch 1.6 の Automatic Mixed Precision対応が dlshogi (Pytorch) に取り込まれているため、活用する。
- dlshogiのautomatic mixed precision対応
- A PyTorch Extension: Tools for easy mixed precision and distributed training in Pytorch
- Automatic Mixed Precision (AMP) でニューラルネットワークのトレーニングを高速化
- 対決!RTX 2080Ti SLI vs Google Colab TPU ~FP16, MixedPrecision編~
- PyTorchでの学習・推論を高速化するコツ集
- 【NVIDIA直伝】あなたのPyTorchプログラムを高速化するかもしれないTips
- PyTorch Tutorials の Model Optimization では、量子化 (Quantization) に期待。
- INT8 対応することで、推論速度は上がるが精度は下がる。棋力の向上には繋がらない可能性がある。
- 定跡を採用する。MakeBook ソリューションをビルドして、make_book コマンドで定跡を作成する。
- WCSOC 2020 以降のdlshogi の自己対局データで教師あり学習をする。
python-shogi
- 学習データの前処理(floodgate / AobaZero の棋譜)に使用。
対局時に使用。高速化を図るため、Cython でビルド。
elmo
- 事前学習用の訓練データ生成に使用。(elmo WCSC28/Apery) [2]
強化学習時のリーグ戦に使用。(elmo WCSC28/やねうら王)- リーグ戦のUSIエンジン側として、やねうら王ライブラリを使用する場合は、勝率が50%程度となるように NodesLimit を調整する。
- Colab では、学習リソース不足が想定されるため、低ノードでの良質な教師データの作成が期待できない。
- 強化学習時のリーグ戦にはやねうら王エンジンではなく、dlshogi (WCSOC 2020) を採用する。
技巧2
- 初期モデルの学習後、実際の対局で強さを測るために使用。
- ディープラーニングモデルを対局する際に、Lesserkai→技巧2→やねうら王ライブラリ勢に勝利するまでのハードルが高い。
- モデルの学習精度、対局時に使用する将棋ライブラリ/ハードウェアリソースの性能等、棋力の問題点を切り分けにくい。
- 同一ハードウェアで技巧2に勝利できるかが、ディープラーニングモデルの棋力の目安になる。
- Python では、GIL の制約により nps が向上しないため、絶望的だった。
- GCT (WCSC 30) +GTX 1080 では、ローカル対局時に勝利できる気配が無かった。
- C++/dlshogi (Pytorch) +RTX 2070 Max-Q では、nps が不足しているためか、やはりローカル対局時に勝利できる気配が無かった。
- C++/dlshogi (TensorRT)+TensorCore でようやく勝利できるようになった。
- Python では、GIL の制約により nps が向上しないため、絶望的だった。
- 一定以上の棋力のモデルを学習できれば、多少のディープラーニングモデル精度向上よりも、ハードウェア性能による nps 向上の方が、棋力の向上に貢献している可能性がある。
- ただし、GCT (WCSOC 2020) では、dlshogi (WCSOC 2020) 相手に勝てる気配がないため、モデル精度の壁は確かに存在する。
AobaZero
- 強化学習で生成する学習データでは不足するため、自己対戦の棋譜を訓練データに使用する。
- Floodgate Elo rating 3040 以上の 11500000 以降の自己対戦の棋譜を取得する。
- 序盤はdlshogi よりもAobaZero 方が強い可能性があるため、序盤の学習を期待したい。
- 入玉宣言法の教師局面の学習を期待したい。
- AobaZero 棋譜の CSA -> hcpe 形式への変換には、ElmoTeacherDecoder を修正して対応した。
- floodgate の CSA形式とフォーマットが違うため、前処理時には注意が必要。
- 探索結果の評価値を棋譜から取得できない場合、dlshogi (Pytorch) での学習時は、val_lambda=0 で学習する。
- 乱数性なし、先手/後手の初手がほぼ固定の模様。互角局面集の扱いに注意が必要。
- 学習モデルの序盤の手順が偏ることが想定されるため、定跡を採用する。
水匠2
- 初期モデルの学習後、実際の対局で強さを測るために使用。
- リーグ戦のUSIエンジン側として、弱点の補強のため、採用を検討したい。
- 弱点の補強のため、同梱の定跡ファイルを利用して、定跡を作成する。
ネットワーク構成
Tensorflow/Keras で以下のネットワークを作成dlshogi (Pytorch) を利用する。
- 方策ネットワーク(policy network)
- 価値ネットワーク(value network)
- マルチタスク学習
- Residual Network
- Swishあり
- 将棋AIの実験ノート:活性化関数Swishを試す
- Swishありモデルで、強化学習 (make_hcpe_by_self_play) する場合は、onnx モデルである必要がある。pytorch で生成したモデルには対応していない。
- Colab が、CUDA 11.0/TensorRT7 以降に対応するまで、Swishありモデルでの強化学習の採用は保留する。
AlphaGo/AlphaZero クローンの GitHub リポジトリの参考
AlphaGo/AlphaZero 手法の参考
クラバートの樹
[10]
最強囲碁AI アルファ碁 解体新書 増補改訂版 アルファ碁ゼロ対応- アルファ碁ゼロに使われているディープラーニングを解き明かす 論文から詳細を紹介 [11]
山岡忠夫著/監訳の書籍
TadaoYamaokaの日記
- コンピュータ将棋におけるディープラーニングの考察 [14]
- 将棋AIの進捗 [15]
- AlphaGo Zeroの論文を読む [16]
- AlphaZero Chess/Shogiの論文を読む [17]
- MCTSnetの論文を読む [18]
- AlphaZeroの論文 [19]
- AlphaStarの論文を読む
- AlphaStarの論文を読む その2(リーグトレーニング)
- AlphaStarの論文を読む その10(リーグ構成)
- MuZeroの論文を読む
- Agent57: Outperforming the Atari Human Benchmarkを読む
大規模学習
floodgate
- 終局まで含む棋譜で追加学習が必要なため、floodgate の棋譜(2008
2011年~2019年)を使用。 - Rating で絞る(Rating 2500 or 3000以上等)よりは、学習局面数を多くする方が感覚的には強くなる。学習局面数を多くすることで、value network の精度が上がるためか。
- 複数年の学習データをまとめてシャッフルするよりは、年単位に順次学習(2008年→2009年→
2011年→2012年→... →2019年)した方が感覚的には強くなる。年単位のRating の向上を追体験するためか。 - epoch 数を多くして、Policy/Value の精度を上げても、棋力は上がらない。悪手を含めて、過学習するためか。
- 棋譜のフィルタ/重複排除/シャッフル/CSA -> hcpe 形式への変換には、ElmoTeacherDecoder を使う。
- 訓練データには、floodgate を使用する。最大手数:512、最大評価値:5000、最小レーティング:なし(コメントアウト)、重複あり、シャッフルあり。
- テストデータには、floodgate を使用する。最大手数:512、最大評価値:5000、最小レーティング:3500、重複なし、シャッフルあり。
elmo
- 技術書典で頒布されたdlshogi の本「ディープラーニングを使った将棋AIの作り方2~大規模学習、高速化編~」を参考にした。 [13]
- elmo_for_learn で生成した訓練データ(約5億局面)で事前学習。
- デフォルトでは、 評価値閾値(3000)で打ち切っているので詰み手順は入っていない。そのため、億単位の局面を学習しても、Lesserkai を詰み切れない。
- 教師データとしては、ランダムなプレイでもいいから、最後まで打って勝敗を判定する必要がある。または、詰み探索を併用する必要がある。
- 生成されたhcpe 形式には局面の繰り返し数と手数が含まれない。 [20]
- AlphaZero Shogi で使用されている繰り返し数と手数は、入力特徴量に加えれない。 [21]
- 評価値閾値(30000)で訓練データ(depth8: 約5億局面、depth10/12: 約1000万局面単位、depth14/16/18: 約100万局面単位)を生成する。
- 1000万局面単位に結合し、シャッフルする。
- Colab の CPU で depth8/10/12 、ローカルPC で depth14/16/18 の訓練データを数ヶ月~半年程度で生成した。
- elmo_for_learn で生成した訓練データのdepth を深くすることで、どこまでAlphaZero に迫れるのか試すのも面白そう。
- c5d.24xlarge(96 vCPU、192 GiB)のスポットインスタンスで、depth12 の訓練データを生成してみたが、お財布的に現実的ではないため、断念した。
- Colab の GPU (T4) では、dlshogi (Pytorch/AMP) で、約1時間40分/1サイクル(1000万局面)/1Epoch の訓練データを学習できる。
強化学習
- 技術書典で頒布されたdlshogi の本「ディープラーニングを使った将棋AIの作り方~強化学習編~」を参考にした。 [13]
- Python の並列処理では、GIL (Global Interpreter Lock) がボトルネックになる。
- Cython の将棋ライブラリを使用しても、24時間/1000プレイアウト程度かかる見込み。
- C++/Go 他の言語による並列化/高速化が必要と思われる。
- 強化学習の代わりのバリエーションとして、Apery との対局を1手3秒、100局程度を追加学習したところ、悪手を指すようになり、むしろ弱くなった。
- 全く別系統の教師データを追加するとノイズが紛れ込むため、一時的に弱くなる可能性がある。大量の教師データを継続的に学習することで、ノイズが平均化され、結果的に改善に寄与している可能性がある。
- 仕組みの理解や実験にはいいが、Python で強化学習するのは現実的ではないため、採用を見送った。
- 自己対局時の高速化のために、dlshogi (Pytorch/TensorRT) を利用する。
- 自己対局モデルの弱点を見つけるため、USIエンジンを含めたリーグ戦を導入する。
- リーグ戦には、dlshogi (WCSOC 2020) のモデルを採用する。
- 自己対局側は、ルート局面にディリクレノイズを加えている。リーグ戦と同じモデルを採用し、同条件を設定した場合でも弱くなる。
- 1サイクル700万局面単位で用意する。不足分は、elmo の訓練データ (300万局面) を追加した。
- dlshogi は、1サイクルあたりの生成局面数を 250万→500万→600万 と徐々に増やしている。
- dlshogi は、自己対局で生成した局面は過去10サイクル分をすべて学習に使っている。
- Colab では複数サイクルを同時に学習するのはリソース制約により厳しい。過去2~3サイクル程度が現実的か。
- Colab の GPU (T4/P100) では、dlshogi (Pytorch) で5~10万局面/日程度の学習データを生成できる。
- dlshogi (TensorRT) は、Colab の CUDA Driver (10.1) とTensorRT7 以降の対応バージョン (10.0/10.2) の相違で利用できない。
- Colab の CUDA Driver のバージョンは、Tensorflow のテスト済みのビルド構成 と同期を取っている模様。
- 複数サイクルの強化学習をするには、最低限 TensorRT が活用できないと、Colab や低スペックのローカルマシンでは厳しい。
- クラウドリソース (NVIDIA T4/V100/A100) の活用を検討する。
初期モデルの学習順序
-
floodgate(2008年→2009年→ ... →2019年)の訓練データと floodgate のテストデータ。
- 将棋のルールと幅広い局面を終局まで学習する。
- floodgate の任意の年のデータを学習することで、Lesserkai とのローカル対局で初勝利した。
-
elmo(depth8→depth10→depth12)の訓練データと floodgate のテストデータ。
- ディープラーニングモデルの自己対局で生成できる局面数が少ないため、疑似強化学習する。
- dlshogi (TensorRT) で高速化することで、技巧2 とのローカル対局で初勝利した。
- AWS の p3.8xlarge (V100×4) のインスタンスで、WCSOC 2020 に出場し、やねうら王ライブラリ使用ソフトに初勝利した。
- 負ける時は、nps 性能が大幅に低下している時に悪手を指していることが多い。
-
自己対局(Swishなし)
+リーグ戦/elmo(depth14/16/18)の訓練データと floodgate のテストデータ。- ディープラーニングモデルの自己対局で生成できる局面数が少ないため、elmo の訓練データを混ぜる。
- 強化学習することで、dlshogi (WCSOC 2020) とのローカル対局で初勝利した。
-
AobaZero の訓練データとfloodgate のテストデータ。
- 序盤と入玉宣言法の教師局面の学習を期待する。
- 序盤は強化したが、入玉宣言法での勝利実績はない。
- Miacis は宣言勝ちを学習している模様。
- dlshogiの学習則 との違いによるものか。
- 320 (dlshogi) / 512 (AobaZero) の最大手数の制限の違いによるものか。
- 序盤は強化したが、入玉宣言法での勝利実績はない。
- 教師あり学習することで、水匠2 (WCSOC 2020) とのローカル対局で初勝利した。
- 良質な教師データ(億単位)があれば、十分に棋力が向上する可能性がある。
- ただし、RTX2070 ノート→p3.2xlarge (V100×1)→p3.8xlarge (V100×4) と GPUマシンスペックを向上すると、CPU/メモリの向上により、ローカル対戦相手の棋力も向上する。
- 適切なマシンスペック(CPU/メモリ/GPU)で、自己の強化学習とリーグ戦 (水匠2) を検討したい。
- 高級スリッパ (Ryzen Threadripper 3990X) に勝つための適切なマシンスペックとは。
- Ryzen Threadripper 3970X+TITAN V/RTX 2080 Ti の強化学習で勝てないのであれば、少なくともGPU には、V100/A100 が必要か。
- 「鶏が先か、卵が先か」みたいなジレンマ。そのうち考えるのをやめた。
- 序盤と入玉宣言法の教師局面の学習を期待する。
-
AobaZero + dlshogi の訓練データと floodgate のテストデータ。
- 互角局面集を活用した中盤~終盤の教師局面の学習を期待する。
- 事前学習モデルと教師データの質が異なると、精度や棋力が一気に下がる。
- 1サイクルあたり、AobaZero (1100万局面) + dlshogi (600万局面) をマージして、学習する。
Google Colab の参考資料
- 【秒速で無料GPUを使う】TensorFow(Keras)/PyTorch/Chainer環境構築 on Colaboratory [22]
- 【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory [23]
- Colab にはGPUガチャ(K80/T4/P4/P100)がある
- Colab Pro に期待(現在のところ、Colab Pro は米国とカナダでのみのご利用となります。)
- GPU の TensorCore を有効活用する場合は、T4を採用する。
- Colab の利用制限がKaggleへの開放/コロナ禍でのクラウド需要とGCP障害以降、厳しくなってきている。
- 6-8時間/日、15時間程度のインターバルが再利用時に必要。
- G Suite のアカウントでもColab を利用できる。
- 不具合等は、GitHub の Issues を確認する。
- Google Colabの使い勝手を向上させる10の秘訣
- Google Colabのパワーユーザー向けのヒント
- Google Colabをプロ仕様に設定する
TPU 対応の参考資料
- 公式の notebook がある。 [24]
- Cloud TPU チュートリアルがある。 [25]
- Tensorflow/Keras の TPU 対応モデルがGitHubで公開されているが、Tensorflow 1.x では experiment。 [26]
- Tensorflow 2.x からクラウド TPU での Keras の利用をサポートするロードマップになっている。 [27]
- TPU で学習したモデルの推論には不具合があるため、今回はローカルPCのGPUで推論をする。 [28]
- Google Colab から Google Drive をマウントして、学習データ/学習済みモデルのローカル/クラウド間のやり取りができる。 [29]
- Google Colab に SSH接続する場合は、ngrok 経由で Connecting to instance over sshができる。 [30]
- 日本語情報が少ない。Shikoan's ML Blog が参考になる。 [31]
- Google ColabでAlphaZero Shogiのモデルを教師あり学習する
- TensorFlow/Keras のTPUの取り扱い方が変わった。CUDA/cuDNNの最新バージョンの取り込みも遅いため、今後はPytorchを採用した方がいい?
- PyTorch TPU対応
- PyTorch→PyTorch Lightning TPU対応
- TPU v1/v2/v3の比較のまとめ
- Cloud TPU と他のアクセラレータとの違いとMLPerf ベンチマークの結果へのリンク
- Cloud TPU 機械学習のパフォーマンスとベンチマーク
- PyTorch 1.6 で Cloud TPU を公式サポートした。
- TPU v4
NVIDIA A100 対応の参考資料
- dlshogiをAWSのNVIDIA A100インスタンスで動かす
- 新機能: 機械学習と HPC 向けの GPU 搭載 EC2 P4 インスタンス
- AWS Deep Learning AMI とは
- Release Notes for DLAMI
- 日本語翻訳版の DLAMI のリリースノート は、バージョンが古い場合があるため、AWS のドキュメントは英語版を参照した方がいい。
- AWS Deep Learning AMI (Conda DLAMI) は、ディープラーニングフレームワークのバージョンが古いため、最新版を使用する場合は、Deep Learning Base AMI で環境構築をする。
- Using the Deep Learning AMI と Conda
- Deep Learning Base AMI を使用する
- Oracle Cloud Infrastructure が NVIDIA AI ソフトウェア上での実行に最適化された NVIDIA A100 GPU インスタンスの提供を開始
- GPU–Virtual Machines and Bare Metal
- VM.GPU4.1/4.2/4.4 (Available November 2020)
- BM.GPU4.8 (Available September 30, 2020)
- Oracle Cloud のアカウントを作成し、有料アカウントへのアップグレードやサービス制限の引き上げを申請してみたが、残念ながら既存の GPU インスタンスを起動するところまでもたどり着けなかった。
- GPU–Virtual Machines and Bare Metal
- 【Part1】NVIDIA DGX™ A100の実力は? ベンチマーク&検証結果
TBD
C++/Goによる並列化/高速化/強化学習- 強化学習+リーグ戦
- ...etc
備考
- Google Colab がTPU対応した! TPU パワーで手軽に強くなるんじゃね?っと思ったら、そんなうまい話はなかった。
- Tensorflow/Keras のバージョンで TPU の挙動がよく変わる。
- GPU で動くコードが TPU で動かないことが多い。デバッグが辛い。
- とはいえ、Google Colab 上で、TPU が無料で遊べるのは魅力的。使えるところには積極的に使いたい。
- PFN [32] や 産総研 [33] の大規模GPUクラスタに、個人が対抗する手段として、TPU を活用したい。
- ディープラーニング将棋においては、学習リソースよりも、強化学習での訓練データ生成/対局時の推論リソースの調達が課題。
- GCP で、Cloud TPU Pod (v2/v3) を利用することもできるが、NVIDIA GPU で学習 (AMP)/推論 (TensorRT) を活用し、高速化することができる。
- 現状のデータセット/モデルの規模では、NVIDIA A100 のGPU を採用する方が訓練データ生成/学習/推論/対局時の全てに活用できるため、費用対効果が高いと思われる。
参考文献
- [1] https://book.mynavi.jp/ec/products/detail/id=88752
- [2] https://github.com/mk-takizawa/elmo_for_learn
- [3] https://github.com/Rochester-NRT/RocAlphaGo/
- [4] https://github.com/tensorflow/minigo/
- [5] https://github.com/suragnair/alpha-zero-general/
- [6] https://github.com/AppliedDataSciencePartners/DeepReinforcementLearning/
- [7] https://github.com/TadaoYamaoka/dlshogi-zero
- [8] https://hypertree.blog.so-net.ne.jp/2016-06-17
- [9] https://hypertree.blog.so-net.ne.jp/2016-06-24
- [10] https://www.amazon.co.jp/最強囲碁AI-アルファ碁-アルファ碁ゼロ対応-深層学習、モンテカルロ木探索、強化学習から見たその仕組み-TECHNOLOGY/dp/4798157775
- [11] https://codezine.jp/article/detail/10952
- [12] https://book.mynavi.jp/ec/products/detail/id=102957
- [13] https://techbookfest.org/event/tbf06/circle/46400002
- [14] http://tadaoyamaoka.hatenablog.com/entry/2017/04/06/003219
- [15] http://tadaoyamaoka.hatenablog.com/search?q=将棋AIの進捗
- [16] http://tadaoyamaoka.hatenablog.com/entry/2017/10/20/001735
- [17] http://tadaoyamaoka.hatenablog.com/entry/2017/12/06/210442
- [18] http://tadaoyamaoka.hatenablog.com/entry/2018/03/01/225127
- [19] http://tadaoyamaoka.hatenablog.com/entry/2018/12/08/191619
- [20] http://tadaoyamaoka.hatenablog.com/entry/2019/02/17/184914
- [21] http://tadaoyamaoka.hatenablog.com/entry/2019/03/13/001515
- [22] https://qiita.com/tomo_makes/items/f70fe48c428d3a61e131
- [23] https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935
- [24] https://colab.research.google.com/notebooks/tpu.ipynb
- [25] https://cloud.google.com/tpu/docs/tutorials
- [26] https://github.com/tensorflow/tpu/tree/master/models/experimental
- [27] https://www.tensorflow.org/community/roadmap
- [28] https://www.tensorflow.org/api_docs/python/tf/contrib/tpu/TPUEstimator#prediction
- [29] https://colab.research.google.com/notebooks/io.ipynb#scrollTo=c2W5A2px3doP
- [30] https://medium.com/machine-learning-world/useful-snippets-for-google-colaboratory-free-gpu-included-d976d6b3e6de
- [31] https://blog.shikoan.com/tag/tpu/
- [32] https://www.preferred-networks.jp/ja/news/pr20171114
- [33] https://www.aist.go.jp/aist_j/press_release/pr2018/pr20180626/pr20180626.html