前々回、前回とAlphaZero風オセロの強化学習環境を作っていましたが、今回はFlaskでWeb化したゲーム部分を追加してECS/Fargateで動かしてみました。*1
今回のコード
下記、タグv0.0.3
になります。
FlaskによるWebUI
ブラウザでアクセスしてオセロゲームしている様子のイメージは下記です。
実行方法
docker build & runするとFlaskのWebサーバがポート5000で立ち上がります。
docker build -f Dockerfile_app -t heta-reversi-app:latest . docker run -d -p 5000:5000 heta-reversi-app
ブラウザでhttp://localhost:5000/にアクセスするとゲームが始まります。オセロ盤の赤丸が石の置ける場所ですのでクリックしてください。
デフォルトの対戦相手のアルゴリズムはランダムです。画面下部のリンクをクリックすると対戦相手のアルゴリズムを変更してゲームを最初から開始できます。*2
実装概要
関連するソース一式は下記です。
. ├── Dockerfile_app ├── Reversi.py ├── app.py ├── data │ └── model.dat ├── static │ └── css │ └── reversi.css └── templates └── index.html
Docker環境はchainer/chainer:v5.1.0-python3
+ Flask
の構成です。
FROM chainer/chainer:v5.1.0-python3 COPY . /app WORKDIR /app RUN pip3 install --upgrade pip RUN pip3 install Flask==1.0.2 ENTRYPOINT ["python3"] CMD ["app.py"]
エントリポイントはapp.pyです。
Base64エンコードしたオセロ盤と次の石の位置を含むjson
をGetパラメータで引き渡す方法にしました。*3
@app.route('/') def random(): return next('/', choice_random, 'random')
def next(url, choice, algorithm): board = Reversi.get_init_board() query = request.args.get('query') if query: params = json.loads(base64.urlsafe_b64decode(query).decode()) player = Reversi.get_player(np.array(params['board'])) board = Reversi.put(player, params['num']) while True: player = Reversi.get_player(board, False) if Reversi.is_putable(player): choice_data = choice(player) board = Reversi.put(player, choice_data['position_num']) player = Reversi.get_player(board) if Reversi.is_putable(player): break else: break board, is_black, putable_position_nums = Reversi.get_player(board) black_num, white_num = Reversi.get_stone_num(board) return render_template('index.html', url=url, algorithm=algorithm, is_end_board=Reversi.is_end_board(board), black_num=black_num, white_num=white_num, board=board, is_black=is_black, putable_position_nums=putable_position_nums)
htmlテンプレートはJinja2でtemplates/index.htmlです。
ECS/Fargateで動かす
全体構成は下記です。
ECRにイメージを登録するCodeBuildとイメージが動くECS/Fargateがあります。*4
構築の手順
手順はdocs/setup_app.mdにまとめました。
VPCは前々回、前回で作成したAWS Batch環境のVPCを使うようにしました。
ECRに登録するイメージを作成する際に含めるAPV-MCTSのモデルファイルはS3にある一番タイムスタンプが最近のファイルにしました。
- cd data - aws s3 sync s3://${MODEL_BUCKET}/data/ ./ - MODEL_FILE=$(ls -lt model_*.dat | head -n 1 | awk '{print $9}') - echo $MODEL_FILE - mv $MODEL_FILE model.dat - rm model_*.dat
ECS/Fargateのオセロにアクセスする
コンソールの下記からPublic IPが確認できます。
ECS>クラスター>タスク>詳細>Network>Public IP
Public IPがわかればブラウザからhttp://Public IP:5000/でアクセスすることができます。*5