Posted at

GCPでOpenAIGym環境を作り、OpenAIBaselinesを実行してみる

More than 1 year has passed since last update.

この記事は BrainPad AdventCalendar 2017 3日目の記事です。

本記事では、Google Cloud Platform(GCP)上に、jupyter notebook でアクセスできるOpenAIGym環境を作ります。


環境構築


GCPでjupyter notebook用のportを開け、インスタンスを作成

ネットワーキングサービスから、ファイアウォールルールを追加し、jupyter notebook 用のportを開けます。

インスタンスは ubuntu LTS 16.04 で作成しました。


仮想マシン上で環境構築

公式サイト https://gym.openai.com/docs/ と、

記事 https://qiita.com/mittyantest/items/2ea07b0f8d5976f29da9 を参考に、

最低限必要なものをインストールします。

sudo apt-get update

sudo apt-get upgrade -y
sudo apt-get install -y python3-pip \
python3-opengl \
xvfb \
cmake \
zlib1g-dev \
swig \
imagemagick \
mpich

pip3 install jupyter \
matplotlib \
mpi4py \
opencv-python


OpenAI Gym 最小構成のインストール

OpneAI Gym をまずは最小構成でインストールし、jupyter notebook から実行できるか確認します。

git clone https://github.com/openai/gym

cd gym
pip3 install -e . # minimal install

OpenAI Gym のゲーム画面を jupyter notebook から見れるようにするため、以下のようにして、Xvfbで仮想ディスプレイを設定し、jupyter notebookを起動します。

cd ~

nohup xvfb-run -s "-screen 0 1400x900x24" jupyter notebook --no-browser --ip=* &

サンプルコードが動くことを確認します。jupyter notebook 上で CartPole のアニメーションが表示されれば成功です。

import gym

from matplotlib import animation
from matplotlib import pyplot as plt
%matplotlib nbagg

env = gym.make('CartPole-v0')

# Run a demo of the environment
observation = env.reset()
cum_reward = 0
frames = []
for t in range(5000):
# Render into buffer.
frames.append(env.render(mode = 'rgb_array'))
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
if done:
break
env.render(close=True)

fig = plt.gcf()
patch = plt.imshow(frames[0])
plt.axis('off')

def animate(i):
patch.set_data(frames[i])

anim = animation.FuncAnimation(fig, animate, frames = len(frames), interval=50)
anim

anim.save("CartPole-v0.gif", writer = 'imagemagick')

CartPole-v0.gif


OpenAI Gym フルインストール

CartPole で成功したら、atari のゲームなどすべての環境をインストールします。

cd gym

pip3 install gym[all] .

cd ~

nohup xvfb-run -s "-screen 0 1400x900x24" jupyter notebook --no-browser --ip=* &

atariのゲームを動かしてみます。

インベーダーゲームのアニメーションが表示されれば成功です。

import gym

from matplotlib import animation
from matplotlib import pyplot as plt
%matplotlib nbagg

env = gym.make('SpaceInvaders-v0')

# Run a demo of the environment
observation = env.reset()
cum_reward = 0
frames = []
for t in range(5000):
# Render into buffer.
frames.append(env.render(mode = 'rgb_array'))
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
if done:
break
env.render(close=True)

fig = plt.gcf()
patch = plt.imshow(frames[0])
plt.axis('off')

def animate(i):
patch.set_data(frames[i])

anim = animation.FuncAnimation(fig, animate, frames = len(frames), interval=50)
anim

anim.save("SpaceInvaders-v0.gif", writer = 'imagemagick')

SpaceInvaders-v0.gif


OpenAI Baselines の実行

OpenAI は強化学習のための環境だけでなく、アルゴリズムの tensorflow での実装を github で公開しています。今回はPPO1を実行してみます。

cd ~

git clone https://github.com/openai/baselines
cd baselines
pip3 install -e .

cd ~/baselines

mpirun -np 8 python3 -m baselines.ppo1.run_atari --seed=1234 --env=SpaceInv
adersNoFrameskip-v4

実行されましたが、数値情報が出力されるだけのため、モデルを保存して結果をレンダリングするためには、コードに手を入れる必要があります。

PPOのようなマルチスレッドの実装が github で公開されているのは大変参考になりますが、A2CとPPOでも実装が結構違うように見え、コード読み進めていたものの、 間に合わなかったので今回はここまで。

次は、OpenAIBaselinesのアルゴリズム実装について読み込んでいきたいです。