Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@lvisdd
Last active August 20, 2022 14:58
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lvisdd/9b49ab88600fa242f2138fad4eb06caf to your computer and use it in GitHub Desktop.
Save lvisdd/9b49ab88600fa242f2138fad4eb06caf to your computer and use it in GitHub Desktop.
DeepLearningShogi for Google Colab

GCT (Gaming pC / Google Colab / Cloud Training) 将棋

基本方針

  • 将棋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

  • 学習データの前処理(floodgate / AobaZero の棋譜)に使用。
  • 対局時に使用。
  • 高速化を図るため、Cython でビルド。

elmo

  • 初期モデルの学習後、実際の対局で強さを測るために使用。
  • ディープラーニングモデルを対局する際に、Lesserkai→技巧2→やねうら王ライブラリ勢に勝利するまでのハードルが高い。
    • モデルの学習精度、対局時に使用する将棋ライブラリ/ハードウェアリソースの性能等、棋力の問題点を切り分けにくい。
  • 同一ハードウェアで技巧2に勝利できるかが、ディープラーニングモデルの棋力の目安になる。
    • Python では、GIL の制約により nps が向上しないため、絶望的だった。
      • GCT (WCSC 30) +GTX 1080 では、ローカル対局時に勝利できる気配が無かった。
    • C++/dlshogi (Pytorch) +RTX 2070 Max-Q では、nps が不足しているためか、やはりローカル対局時に勝利できる気配が無かった。
    • C++/dlshogi (TensorRT)+TensorCore でようやく勝利できるようになった。
  • 一定以上の棋力のモデルを学習できれば、多少のディープラーニングモデル精度向上よりも、ハードウェア性能による nps 向上の方が、棋力の向上に貢献している可能性がある。
    • ただし、GCT (WCSOC 2020) では、dlshogi (WCSOC 2020) 相手に勝てる気配がないため、モデル精度の壁は確かに存在する。
  • ローカル対局で学習モデルの強さを見るため、活用する。
    • dlshogi : やねうら王エンジンの nps 比が 1 : 300 程度の条件で対局する。
      • NVIDIA A100 : Ryzen Threadripper 3990X とその後継機種の nps 比率を想定する。
      • ハードウェア競争が加熱するのは本意ではないが、仮に激化としても問題ない棋力のモデルを目指す。
    • 対局条件
      • 1手3秒、5秒、10秒、20秒、30秒、3分1秒、5分2秒、10分2秒
      • 思考時間/持ち時間/対局ソフトに関わらず、安定した棋力のモデルを目指す。
    • 実際の対局で生成した平手からの棋譜で、教師あり学習する。
  • 世界将棋AI 電竜戦 と電竜戦TSECにおいて、苦手とする局面があった。多様な局面でも安定した棋力のモデルを目指す。
  • 実際の対局で強さを測るために使用。
  • リーグ戦の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 リポジトリの参考

  • RocAlphaGo [3]
  • minigo [4]
  • alpha-zero-general [5]
  • DeepReinforcementLearning [6]
  • dlshogi-zero [7]

AlphaGo/AlphaZero 手法の参考

クラバートの樹

  • No.180 - アルファ碁の着手決定ロジック(1) [技術] [8]
  • No.181 - アルファ碁の着手決定ロジック(2) [技術] [9]

最強囲碁AI アルファ碁 解体新書 増補改訂版 アルファ碁ゼロ対応 [10]

  • アルファ碁ゼロに使われているディープラーニングを解き明かす 論文から詳細を紹介 [11]

山岡忠夫著/監訳の書籍

  • 将棋AIで学ぶディープラーニング [1]
  • 囲碁ディープラーニングプログラミング [12]
  • 技術書典で頒布されたdlshogi の本 [13]

TadaoYamaokaの日記

大規模学習

floodgate

  • 終局まで含む棋譜で追加学習が必要なため、floodgate の棋譜(20082011年~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、重複なし、シャッフルあり。

floodgate/電竜戦

  • 疑似リーグ戦として、floodgate/電竜戦本選に放流した自己モデルの対局棋譜を教師あり学習する。
  • Ryzen Threadripper 3990X、A100 を利用した高ノードの棋譜を教師あり学習する。

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万局面) を追加した。
  • Colab の GPU (T4/P100) では、dlshogi (Pytorch) で5~10万局面/日程度の学習データを生成できる。
  • dlshogi (TensorRT) は、Colab の CUDA Driver (10.1) とTensorRT7 以降の対応バージョン (10.0/10.2) の相違で利用できない。
  • 複数サイクルの強化学習をするには、最低限 TensorRT が活用できないと、Colab や低スペックのローカルマシンでは厳しい。
  • クラウドリソース (NVIDIA T4/V100/A100) の活用を検討する。
  • Colab(T4)、Colab Pro (P100/V100) 、AWS スポットインスタンス(p3.2xlarge)で強化学習する。

初期モデルの学習順序

  • floodgate(2008年→2009年→ ... →2019年)の訓練データと floodgate のテストデータ

    • 将棋のルールと幅広い局面を終局まで学習する。
    • floodgate の任意の年のデータを学習することで、Lesserkai とのローカル対局で初勝利した。
  • elmo(depth8→depth10→depth12)の訓練データと floodgate のテストデータ。

  • 自己対局(Swishなし)+リーグ戦/elmo(depth14/16/18)の訓練データと floodgate のテストデータ

    • ディープラーニングモデルの自己対局で生成できる局面数が少ないため、elmo の訓練データを混ぜる。
    • 強化学習することで、dlshogi (WCSOC 2020) とのローカル対局で初勝利した。
  • AobaZero の訓練データとfloodgate のテストデータ。

    • 序盤と入玉宣言法の教師局面の学習を期待する。
    • 教師あり学習することで、水匠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 が必要か。
        • 「鶏が先か、卵が先か」みたいなジレンマ。そのうち考えるのをやめた。
      • 「レベルを上げて物理で殴ればいい」の格言のとおり、モデルの精度を向上して、NVIDIA A100 を利用すればいいことがわかった。
  • AobaZero + dlshogi の訓練データと floodgate のテストデータ ※電竜戦本選時点

    • 初期局面集を活用した中盤~終盤の教師局面の学習を期待する。
    • 事前学習モデルと教師データの質が異なると、精度や棋力が一気に下がる。
    • 1サイクルあたり、AobaZero (1100万局面) + dlshogi (600万局面) をマージして、学習する。
  • AobaZero + dlshogi の訓練データと floodgate のテストデータ ※電竜戦本選以降

    • AobaZero 棋譜は、以下の加工を施したものに差し替えをする。
    • 1サイクル(=1 epoch)ずつ、データ配分を調整する。
    • 約100サイクル分を1セットとして学習する。
      • 1セット目:AobaZero 1, .. , 100 (1100万局面) + dlshogi 1, .. , 100 (600万局面)
      • 2セット目:AobaZero 2, .. , 100 (1100万局面) + dlshogi 1-2, 2-3, .. , 99-100 (1200万局面)
      • 3セット目:AobaZero 3, .. , 100 (1100万局面) + dlshogi 1-3, 2-4, .. , 98-100 (1800万局面)
      • 4セット目:AobaZero 4, .. , 100 (1100万局面) + dlshogi 1-4, 2-5, .. , 97-100 (2400万局面)
      • 5セット目:AobaZero 5, .. , 100 (1100万局面) + dlshogi 1-5, 2-6, .. , 96-100 (3000万局面)
        • 苦手な局面を対策するため、以下の教師データを追加する。
          • 電竜戦/floodgate の自己モデルでの対局棋譜
          • 将棋所の自己モデルでの対局棋譜
      • 6セット目:AobaZero 6, .. , 100 (1100万局面) + dlshogi 1-6, 2-7, .. , 95-100 (3600万局面)
        • 苦手な局面を対策するため、以下の教師データを追加する。
          • 電竜戦/floodgate の自己モデルでの対局棋譜
          • 将棋所の自己モデルでの対局棋譜。
          • 水匠の相入玉局面
        • わかりやすい苦手局面が無くなった段階で、強化学習する。順次、以下の教師データを追加する。
          • 自己モデルでの強化学習データ

Google Colab の参考資料

TPU 対応の参考資料

NVIDIA 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 を採用する方が訓練データ生成/学習/推論/対局時の全てに活用できるため、費用対効果が高いと思われる。

参考文献

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment