ColaboratoryでOpenAI Gymを使う

2019-11-02 (土) 17:38:26 (18d) | Topic path: Top / 強化学習 / ColaboratoryでOpenAI Gymを使う

はじめに

ColaboratoryはGoogleが提供している無料で使えるJupyter Notebook環境です。 TensorFlow用のプロセッサーTPUが使えるので、深層学習もできます。

ここでは、Colaboratory上でOpenAIが提供する強化学習ライブラリーのGymを用いて深層強化学習を実行する方法を説明します。 OpenAIが用意している強化学習アルゴリズムのライブラリーのBaselinesは使いにくいので、ここではBaselinesを使いやすくしたライブラリーであるStable Baselinesを使います。

次の環境で確認しました。

  • TensorFlow-GPU 1.15
  • OpenAI Gym 0.15.3
  • Stable Baselines 2.2.1

環境構築

!apt-get -y -q install cuda-libraries-dev-10-0 > /dev/null
!apt-get -y -q install xvfb freeglut3-dev ffmpeg > /dev/null
!npm install -g localtunnel

!pip install pyglet
!pip install pyopengl
!pip install pyvirtualdisplay
!pip install tensorflow-gpu==1.15
!pip install gym
!pip install stable-baselines

関数

100エピソードの平均ステップ数を評価する関数(CartPole用)

def evaluate(env_name, model, num_steps=1000):
  episode_rewards = [0.0]
  local_env = gym.make(env_name)
  obs = local_env.reset()
  for i in range(num_steps):
      # _states are only useful when using LSTM policies
      action, _states = model.predict(obs)
      obs, reward, done, info = local_env.step(action)

      # Stats
      episode_rewards[-1] += reward
      if done:
          obs = local_env.reset()
          episode_rewards.append(0.0)
  # Compute mean reward for the last 100 episodes
  mean_100ep_reward = round(np.mean(episode_rewards[-100:]), 1)
  print("Mean reward:", mean_100ep_reward, "Num episodes:", len(episode_rewards))

  return mean_100ep_reward

1エピソード実行する様子を画面に出力する関数

def show(env_name, model, num_steps=1000):
  local_env = gym.make(env_name)
  obs = local_env.reset()
  for step in range(num_steps):
    plt.imshow(local_env.render(mode='rgb_array'))
    display.clear_output(wait=True)
    display.display(plt.gcf())

    # _states are only useful when using LSTM policies
    action, _states = model.predict(obs)
    obs, reward, done, info = local_env.step(action)

    if done:
      local_env.close()
      break
  print('Num steps:', step)

  return step

1エピソード実行する様子を動画に記録する関数

def record(env_name, model, num_steps=1000):
  from gym import wrappers

  local_env = gym.make(env_name)
  wrap_env = wrappers.Monitor(local_env, './', force=True)
  obs = wrap_env.reset()
  for step in range(num_steps):
    # _states are only useful when using LSTM policies
    action, _states = model.predict(obs)
    obs, reward, done, info = wrap_env.step(action)
    if done:
      wrap_env.close()
      break
  print('Num steps:', step)

  return step

動画ファイルをダウンロードする関数

def download():
  from google.colab import files
  import glob

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

ここからメイン

%tensorflow_version 1.x
import os
import gym
import numpy as np
from stable_baselines.common.policies import MlpPolicy, CnnPolicy
from stable_baselines.common.vec_env import DummyVecEnv
from stable_baselines import PPO2

# TensorBoard用ログ
log_dir = './logs/'
os.makedirs(log_dir, exist_ok=True)

# ディスプレイ
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1024, 768))
display.start()
import os
os.environ["DISPLAY"] = ":" + str(display.display) + "." + str(display.screen)

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


# 環境
#env_name = 'MsPacman-v0'
env_name = 'CartPole-v0'
ori_env = gym.make(env_name)
# vectorized environments allow to easily multiprocess training
# we demonstrate its usefulness in the next examples
env = DummyVecEnv([lambda: ori_env])  # The algorithms require a vectorized environment to run


# PPO2エージェント
model = PPO2(MlpPolicy, env,  verbose=1, tensorboard_log=log_dir)  # 入力がセンサー値のとき
#model = PPO2(CnnPolicy, env,  verbose=1, tensorboard_log=log_dir)  # 入力が画像のとき
# 保存されたエージェントを読み込む(2回目以後)
#model = PPO2.load('model')
#model.set_env(env)
# 学習前のエージェントを評価する(CartPole用)
mean_reward_before_train = evaluate(env_name, model, num_steps=10000)
# 学習前のランダムに動くエージェントの動きを確認する(デバッグ用)
show(env_name, model, num_steps=1000)
cartpole.png
# 学習前のランダムに動くエージェントを動画に記録する
num_steps = record(env_name, model, num_steps=10000)

# 動画を記録するのに時間がかかるので少し待つ
!sleep 10
# 動画ファイルをダウンロードする
download()

ダウンロードに失敗する場合は、まだファイルができていない可能性があります。 このセルをもう一度実行すると、ダウンロードできることがあります。

# エージェントに学習させる
model.learn(total_timesteps=100000)

TensorFlowが実行される度に、次のようなログが出力されます。

--------------------------------------
| approxkl           | 4.4409087e-05 |
| clipfrac           | 0.0           |
| ep_rewmean         | nan           |
| eplenmean          | nan           |
| explained_variance | 0.245         |
| fps                | 806           |
| nupdates           | 782           |
| policy_entropy     | 0.52703226    |
| policy_loss        | 0.00044246577 |
| serial_timesteps   | 100096        |
| time_elapsed       | 128           |
| total_timesteps    | 100096        |
| value_loss         | 3.9141965     |
--------------------------------------

必要ない場合は、エージェントを生成するときのverboseを0にします。

# 学習後のエージェントを評価する(CartPole用)
mean_reward = evaluate(env_name, model, num_steps=10000)
# 学習後のエージェントの動きを確認する(デバッグ用)
show(env_name, model, num_steps=1000)
cartpole.png
# 学習後のランダムに動くエージェントを動画に記録する
num_steps = record(env_name, model, num_steps=10000)

# 動画を記録するのに時間がかかるので少し待つ
!sleep 10
# 動画ファイルをダウンロードする
download()
# 学習したエージェントをファイルに保存する
model.save('model')

# エージェントを削除する(デバッグ用)
#del model

TensorBoard

# TensorBoardとLocalTunnelを起動する
get_ipython().system_raw('tensorboard --logdir {} --host 0.0.0.0 --port 6006 &'.format(log_dir))
get_ipython().system_raw('lt --port 6006 > url.txt 2>&1 &')

# TensorBoardが起動するの時間がかかるので少し待つ
!sleep 10
# 次で出力されるURLにアクセス(ランタイムを再起動すると無効になる)
!cat url.txt

学習のログをTensorBoardで確認できます。

tensorboard.png

参考にした資料

OpenAI Gym on Colaboratory

Stable-Baelines

TensorBoard on Colaboratoey

添付ファイル: filetensorboard.png 1件 [詳細] filecartpole.png 1件 [詳細]
トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS