TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

Windows上でPyTorchを使って強化学習を試す

以前はOpenAI GymはWindowsに対応してなかったが、以下のようにpipからインストールするだけで動くようになっている。
atariも問題なく動く。

pip install gym
pip install gym[atari]

ただし、env.render()で描画するとウィンドウの位置変更などができないという問題があった。これは後で書く別の方法で描画すれば回避できる。

とりあえず既にある強化学習の実装を試そうとして、ChainerRLを試してみたがマルチプロセス関係がWindowsでは動かなかったため、PyTorchでつくりながら学ぶ!深層強化学習で引用されていた以下のGitHubのコードを試してみた。
https://github.com/ikostrikov/pytorch-a2c-ppo-acktr-gail

インストール

GitHubのREADMEにある通り、baselinesとrequirements.txtから依存ライブラリのインストールが必要になる。

git clone https://github.com/ikostrikov/pytorch-a2c-ppo-acktr-gail.git

# Baselines for Atari preprocessing
git clone https://github.com/openai/baselines.git
cd baselines
pip install -e .

# Other requirements
cd ../pytorch-a2c-ppo-acktr-gail
pip install -r requirements.txt

実行

--num-processesを1にすればWindowsでもそのまま実行できる。

例)

python main.py --env-name "BreakoutNoFrameskip-v4" --num-processes 1

マルチプロセスで動かすには、envs.pyの91行目を以下の通り修正する。
修正前:

envs = ShmemVecEnv(envs, context='fork')

修正後:

envs = ShmemVecEnv(envs, context='spawn')

これで、Windowsでもマルチプロセスで動かせる。

ゲーム画面を描画する

学習を実行すると、コンソールにログしか表示されない。
高速に強化学習するには問題ないが、はじめのうちは学習している過程をゲーム画面で眺めたい。

ゲーム画面を表示するには、main.pyに以下のコードを追加する。
ファイルの先頭:

import cv2

120行目(obs, reward, done, infos = envs.step(action)の後)に追記:

            imgs = envs.get_images()
            cv2.imshow('img', imgs[0])
            cv2.waitKey(1)

envsは、OpenAI Gymのenvのマルチプロセス用のラッパーになっている。
get_images()で、マルチプロセスで実行しているすべてのエージェントのゲーム画面が取得できる。
0番目のエージェントの画面のみをOpenCVのimshowで描画する。
waiKey(1)がないと、ウィンドウに描画が更新されないため、1ミリ秒だけキー入力待ちをする処理を入れている。

f:id:TadaoYamaoka:20190815160821p:plain

この方法を使用して前述したenv.render()の問題を回避できる。
env.render()の代わりにenv.render(mode='rgb_array')で画像を取得して描画すればよい。

2019/10/22 追記

mtplotlib.pyplotを使用してもリアルタイムに描画できる。
参考:Running Open AI Gym on Windows 10 – Simon on the Web