ColaboratoryでOpenAI gym

openAI Gymgoogle colaboratoryで遊ぼうとすると,Algorithm以外の環境ではアニメーション表示がどうするかが問題になるが,一応なんとかなることがわかった。

準備

以下をセルに入力して実行する。

!apt-get -qq -y install libcusparse8.0 libnvrtc8.0 libnvtoolsext1 > /dev/null
!ln -snf /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so.8.0 /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so

!apt-get -qq -y install xvfb freeglut3-dev ffmpeg> /dev/null
!pip install pyglet
!pip install pyopengl
!pip install pyvirtualdisplay
!pip install gym[classic_control]

次にvirtual displayの設定。

from pyvirtualdisplay import Display
display = Display(visible=0, size=(1024, 768))
display.start()
import os
os.environ["DISPLAY"] = ":" + str(display.display) + "." + str(display.screen)

これでアニメーション表示が可能になる。

実行

以下はCartPole(倒立振子課題)を動かす例。

import gym
from IPython import display
import matplotlib.pyplot as plt
%matplotlib inline

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

for n_episode in range (3):
    observation = env.reset()
    for t in range(100):
        plt.imshow(env.render(mode='rgb_array'))
        display.clear_output(wait=True)
        display.display(plt.gcf())

        action = env.action_space.sample() # アクションのランダム選択
        observation, reward, done, info = env.step(action)
        if done:
            print("Episode {} finished after {} timesteps".format(n_episode+1,t+1))
            break

これでアニメーションが表示される。表示はとても遅いが,ちょっとした確認には便利。

また,OpenAI Gymでは,上記のenv = gym.make('CartPole-v0')を以下のようにwrappers.Monitor()を追加するとmp4で適宜保存してくれるので,学習の途中経過をあとで動画で確認できる。 保存タイミングは,env.step()を呼び出した回数が1000回以下のときには$0$, $1^3$, $2^3$, $3^3$,…と$n^3$になるごとに,それ以降は1000回ごとに保存される)

from gym import wrappers

env = gym.make('CartPole-v0')
env = wrappers.Monitor(env, './', force=True)

アニメーションは以下を実行するとダウンロードできる。

from google.colab import files
import glob

for file in glob.glob("openaigym.video.*.mp4"):
  files.download(file)

結果

以下は,CartPoleの課題に対してQ学習を行った結果。

これは学習前:

216エピソード学習後:

729エピソード学習後:

Q学習のソースは種々の事情により非公開ですが,例えばBasic Reinforcement Learning Tutorial 4: Q-learning in OpenAI gymを参照すればすぐに作れます。