Spark-ぼっかけDZ

https://github.com/DZ-sub/checker_ml

GitHub

AWS

Python

Docker

チェッカーゲームと強化学習

オッキー

熨斗隆哉(Takaya Noshi)

推しアイデア

・Docker環境での機械学習モデル開発 ・C4モデルを用いた要件定義 ・Event bridgeによる自動モデル更新機能

作った背景

・将棋のようなボードゲームを作りたかった ・ゼミの教授の研究が強化学習に関するものだった

推し技術

・Sagemaker ・pygame ・Alpha zero

プロジェクト詳細

checker ゲーム + AI(強化学習)

チェッカー(6×6)ゲーム + AlphaZeroを参考にした機械学習プロジェクト

checker とは?

https://ja.wikipedia.org/wiki/%E3%83%81%E3%82%A7%E3%83%83%E3%82%AB%E3%83%BC image ※今回は6×6マスのものを使用

ディレクトリ構成

checker_ml/ ├── src/ │ ├── game/ # Pygameによるチェッカーゲーム │ │ └── checker.py │ ├── ml/ # AlphaZero実装 │ │ ├── checker_state.py │ │ ├── gameplay.py │ │ └── alpha_zero/ │ │ ├── dual_network.py # ニューラルネットワークモデル │ │ ├── pv_mcts.py # モンテカルロ木探索 │ │ ├── selfplay.py # セルフプレイ │ │ ├── train_network.py # ネットワーク学習 │ │ ├── evaluate_network.py # モデル評価 │ │ └── train_cycle.py # 学習サイクル │ └── infrastructure/ # インフラストラクチャ │ ├── aws/ # AWS連携(S3) │ └── fastapi/ # APIサーバー ├── sandbox/ # 実験・検証用 ├── requirements.txt # Python依存パッケージ ├── Dockerfile # Dockerイメージ定義 ├── docker-compose.yml # Docker Compose設定 ├── DOCKER_SETUP.md # Docker環境構築ガイド └── AWS_SETUP.md # AWS環境構築ガイド

主な機能

・チェッカーゲームの実装: Pygameを使用した6×6チェッカーゲーム ・AlphaZero学習パイプライン: ・セルフプレイによるデータ生成 ・ニューラルネットワークの学習 ・モデルの評価と更新 ・FastAPI APIサーバー: AWS SageMakerにデプロイ可能なRESTful API ・GPU対応: NVIDIA GPUを使用した高速学習 ・Docker対応: 環境構築が簡単で再現性の高い実行環境

アーキテクチャ図

image

技術

game(フロント層)

・ゲームエンジン: Pygame

model

・機械学習: TensorFlow 2.17.0 (Dockerベースイメージ), Keras 3.5.0 ・Webフレームワーク: FastAPI 0.118.0 ・コンテナ: Docker, Docker Compose ・クラウド: AWS (VPC, S3, Lambda, SageMaker, APIGateway) ・言語: Python 3.x

参考にしたモデル:AlphaZero

・src/ml/alpha_zero/dual_network.py: ニューラルネットワークモデルの定義 ・src/ml/alpha_zero/pv_mcts.py: PVモンテカルロ木探索の実装 ・src/ml/alpha_zero/selfplay.py: セルフプレイによるデータ生成 ・src/ml/alpha_zero/train_network.py: ニューラルネットワークの学習 ・src/ml/alpha_zero/evaluate_network.py: モデルの評価と更新 ・src/ml/alpha_zero/train_cycle.py: 学習サイクルの管理

木探索による行動選択の評価

## src/gpt_ml/alpha_zero/pv_mcts.py # 子ノードが存在しない時(展開) if not self.child_nodes: # ニューラルネットワークでポリシーとバリューを取得 policies, value = predict(model, self.state)

Policy(行動確率分布)とValue(状態の価値)をニューラルネットワークから取得し、探索を進める。

行動選択のための精度改善・モデル構築

## src/gpt_ml/alpha_zero/pv_mcts.py # モデルの学習 model.fit( x=xs, # 入力テンソル(N, H, W, 4 y=[y_policies, y_values], # 出力ポリシーと価値 batch_size=128, epochs=RN_EPOCHS, callbacks=[lr_scheduler, print_callback], verbose=0, )

xs: (サンプル数, 盤面高さ, 盤面幅, チャンネル数)のテンソル y: Policy, Value

セットアップ

前提条件

・Docker Desktop: GPUを使用する場合は以下も必要 ・Windows: WSL2(Docker Desktopが自動でGPU対応) ・Linux: nvidia-container-toolkitまたは Python 3.x環境とTensorFlow 2.17.0

AWSを使用する場合(推奨)

AWS_SETUP.md を参照してください。

Dockerを使用する場合(推奨)

DOCKER_SETUP.md を参照してください

API仕様

AWS環境のエンドポイント

https://4djo1pd0h8.execute-api.ap-northeast-1.amazonaws.com/

POST /actions

リクエスト:

{ "board": [ [0, 1, 0, 0, 0, 0], [1, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1], [0, -1, 0, 0, -1, 0], [0, 0, 0, 0, 0, 0] ], "turn": 1, "turn_count": 10 }

盤面の表記:

0: 空マス 1: RED(赤)の通常駒 2: REDのキング -1: BLUE(青)の通常駒 -2: BLUEのキング

手番:

1: RED -1: BLUE レスポンス:

{ "version": "1.0.0", "action": { "selected_piece": [4, 1], "move_to": [3, 0], "captured_pieces": [] } }

Docker環境のエンドポイント

GET /

ルートエンドポイント

レスポンス:

{ "Hello": "World" }

GET /ping

ヘルスチェック用エンドポイント

レスポンス:

{ "status": "ok" }

POST /invocations

AIの次の手を取得

リクエスト:

{ "board": [ [0, 1, 0, 0, 0, 0], [1, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1], [0, -1, 0, 0, -1, 0], [0, 0, 0, 0, 0, 0] ], "turn": 1, "turn_count": 10 }

盤面の表記:

0: 空マス 1: RED(赤)の通常駒 2: REDのキング -1: BLUE(青)の通常駒 -2: BLUEのキング

手番:

1: RED -1: BLUE レスポンス:

{ "version": "1.0.0", "action": { "selected_piece": [4, 1], "move_to": [3, 0], "captured_pieces": [] } }

開発スケジュール(11/5 ~ 11/23)

5日 ~ 13日:設計(C4モデル) 13日 ~ 18日:事前準備(sandbox/) 18日 ~ 23日:開発(src)

C4モデル

Context

image

Container

image

Component

image

事前準備

・sandboxの使い方の勉強(使ったことがないメンバーいたので) ・参考資料を読んで、より小さいゲーム(三目並べ)で実装を練習

苦労したこと

・プログラミング初心者のメンバーおり、分からないことが多かった ・SageMakerのデプロイ ・AWSの費用

参考資料・文献

AlphaZero 深層学習・強化学習・探索 人工知能プログラミング実践入門: https://www.amazon.co.jp/AlphaZero-%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E3%83%BB%E5%BC%B7%E5%8C%96%E5%AD%A6%E7%BF%92%E3%83%BB%E6%8E%A2%E7%B4%A2-%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E5%B8%83%E7%95%99%E5%B7%9D-%E8%8B%B1%E4%B8%80/dp/4862464505?source=ps-sl-shoppingads-lpcontext&ref_=fplfs&ref_=fplfs&psc=1&smid=AN1VRQENFRJN5

スッキリわかるAlphaZero: https://horomary.hatenablog.com/entry/2021/06/21/000500

オッキー

@b4c13f229deb1591