コンテンツにスキップ

CABT Linux Runtime with Docker

更新日: 2026-06-17

背景

手元の cg/libcg.so は次の形式だった。

ELF 64-bit LSB shared object, x86-64, GNU/Linux

このため、macOS の Python 仮想環境に置くだけでは動かない。 Rosetta は macOS 向け x86_64 バイナリ向けで、Linux ELF の .so には効かない。

方針

Linux + x86_64 の最小コンテナだけを用意し、その中で repo 直下の cg/sample/ をそのまま使う。

追加したファイル:

使い方

  1. Docker Desktop を起動する
  2. リポジトリ直下で次を実行する
bash scripts/run_cabt_docker.sh

このスクリプトは次を行う。

  • Dockerfile.cabt から Linux amd64 イメージを build
  • repo 全体を /app に mount
  • CABT_CG_LIB_PATH=/app を使って sample/run_local_battle.py を実行

引数の渡し方

そのまま sample/run_local_battle.py に渡せる。

bash scripts/run_cabt_docker.sh --max-steps 50 --seed 1

対戦画面の出し方

HTML リプレイを作る場合は次を使う。

bash scripts/render_cabt_html_docker.sh --output sample/result.html

これで sample/result.html が生成される。あとはその HTML をブラウザで開けば対戦画面を確認できる。

リアルタイム viewer

事後リプレイではなく、現在進行中の状態をブラウザで見るには次を使う。

bash scripts/run_cabt_viewer_docker.sh

その後、ブラウザで http://localhost:8000 を開く。

この viewer は sample/realtime_server.py を Docker 内で動かし、以下をリアルタイム表示する。

  • 現在の turn / yourIndex / result
  • Player 0 / Player 1 の Active / Bench / handCount / deckCount / prizeCount
  • 現在の select.context と option 一覧
  • 直近ログ
  • visualize_data() の生データ

自己対戦データを集める

学習用の SelfPlayRecord JSONL を Docker 内で作るには次を使う。

bash scripts/collect_selfplay_docker.sh \
  --games 1 \
  --max-steps 50 \
  --output /app/data/selfplay/bootstrap.jsonl

--output はコンテナ内の /app がリポジトリ直下に mount されているため、上の例ではローカルの data/selfplay/bootstrap.jsonl に保存される。

2026-06-21 の smoke test:

bash scripts/collect_selfplay_docker.sh \
  --games 1 \
  --max-steps 5 \
  --output /app/data/selfplay/docker-smoke.jsonl

結果:

  • data/selfplay/docker-smoke.jsonl
  • 5 records
  • max-steps=5 のため試合は未決着、各 final_result は draw 扱いの 0.0

head-to-head 評価

2つの policy を CABT 上で対戦させ、勝敗・平均step・1手あたりの推論時間を JSON に保存する。

bash scripts/evaluate_docker.sh \
  --games 1 \
  --max-steps 5 \
  --policy0 deterministic \
  --policy1 random \
  --output /app/data/eval/docker-smoke.json

2026-06-21 の smoke test:

  • data/eval/docker-smoke.json
  • 1 game
  • max-steps=5 のため未決着
  • policy0_avg_seconds / policy1_avg_seconds が記録される

期待する動作

  • cg/game.py から cg/libcg.so を読める
  • battle_start() が通る
  • ランダム対戦を 1 試合進められる

うまくいかない場合

  • Docker Desktop が起動しているか確認
  • Apple Silicon Mac では --platform=linux/amd64 のエミュレーションを使うため、初回 build は少し遅い
  • cg/ 配下が欠けていないか確認 (api.py, game.py, libcg.so, __init__.py)