MkItYs

MkItYs > 音楽・漫画・VR・自律制御 > 

images

強化学習のためのシンプルな環境:Farama Gymnasium, OpenAI Gym, Docker, X Window System, Pyglet, pygame, tkinter

images

- 2022.09.17

強化学習のためのシンプルな環境のひとつに、Farama Gymnasium / OpenAI Gym があります:[※1]

https://github.com/Farama-Foundation/Gymnasium
https://github.com/openai/gym
images

※1
マイクロソフト社からの出資により営利事業に特化していたOpenAIでしたが、強化学習のオープンソース・プロジェクトは、Faramaがを引き継ぐことになりそうです:
https://farama.org/Announcing-The-Farama-Foundation

関連


コンテナを導入する:Docker
OSの2大グループ[準備中]:UNIX-like OS (Linux (Ubuntu) , BSD (macOS)) , Windows NT (Windows)
高機能のウィンドウシステム:X Window System (XQuartz) , Docker, OpenGL, Tcl/Tk, Xvfb, x11vnc
微分可能プログラミングと機械学習フレームワーク[準備中]:Python (Pytorch, TensorFlow/Keras) , Mojo

検証


インタプリタ:Python 3.8
ライブラリ:Farama Gymnasium 0.26
ライブラリ:OpenAI Gym 0.25, 0.26

設置:Farama Gymnasium / OpenAI Gym, Pyglet / pygame


次はコンテナ(Docker)に設置するやり方です。トレーニング画面の表示には、Xウィンドウを使います:[※1][※2]

$ apt install python-opengl
$ pip install pygame # 訓練画面の描画用(v0.21> )
$ pip install pyglet # 訓練画面の描画用(v0.21<=)
$ pip install gymnasium # 次を使う場合:Farama Gymnasium
$ pip install gym # 次を使う場合:OpenAI Gym
※1
OSはUbuntuを前提にしています。事前に、プログラミング言語のPythonを設置しておく必要があります。
※2
Pyglet / pygame はともにOpenGLを使うので、Xウィンドウ側で使えるようにしておく必要があります(とくにpygameは、これが有効になっていないと、エラーメッセージも出さずにダウンしてしまうので)。

設置:matplotlib, tkinter


学習では数値を視覚的に描画できた方がいいので、プロット用のアプリも設置しておきます:[※1]

$ apt install python3-tk
$ pip install matplotlib
※1
python3-tkにふくまれるtkinter は、Python向けのTkインタフェースです。

仕様:Gymnasium 0.26


メンテナンスが滞りがちだったOpenAI Gymですが、そのフォーク「Gymnasium 」が、Farama Foundation より提供され始めました(2022.10.25):

https://gymnasium.farama.org

仕様はGym 0.26を引き継いでいるので、この版に対応していれば、コードの変更はライブラリのインポート部分だけで済みます:

#!/usr/bin/python

import gymnasium as gym

env = gym.make("CartPole-v1", render_mode="human")
observation, info = env.reset(seed=42)
for _ in range(1000):
  action = env.action_space.sample()
  observation, reward, terminated, truncated, info = env.step(action)
  if terminated or truncated:
    observation, info = env.reset()
env.close()

仕様:OpenAI Gym 0.26


バージョン0.26から、仕様が大幅に変わりました。[※1][※2][※3]

https://github.com/openai/gym/releases/tag/0.26.0

大きな変更は、次の3点でしょうか:

Env.reset …… 返り値が1コ → 2コ:(observations) → (observations, info)
Env.step …… 返り値が4コ → 5コ:(observations, reward, termination, info) → (observations, reward, termination, truncation, info)
gym.make() …… インスタンス時に画面表示の指定:例:render_mode='human'

倒立振子のデモなら、コードは次のように変わります:

ver 0.26:
#!/usr/bin/python

import gym

env = gym.make("CartPole-v1", render_mode="human")
observation, info = env.reset(seed=42)
for _ in range(1000):
  action = env.action_space.sample()
  observation, reward, terminated, truncated, info = env.step(action)
  if terminated or truncated:
    observation, info = env.reset()
env.close()
ver 0.25:
#!/usr/bin/python

import gym

env = gym.make("CartPole-v1")
observation = env.reset(seed=42)
for _ in range(1000):
  env.render(mode="human")
  action = env.action_space.sample()
  observation, reward, terminated, info = env.step(action)
  if terminated:
    observation = env.reset()
env.close()

※1
ほんらいならバージョン1.0 で対応すべきものと思えるのですが、(ディスコードでのやり取りをみるかぎり)なんらかの事情があるようですーーいずれにしても、0.26から1.0 までの間は、これより大きな変更はなさそうです。
※2
Env.stepの返り値にtruncationをふくめるというのは、ずっと議論が続いていたもので、従来のコードにも実装済みでした(このバージョンで、返り値にtruncationをふくめることを既定の状態にしています)。
※3
これまでのプログラムをコードの変更なく動かすなら、バージョン0.25に止めておいた方が安全かもしれません:
$ pip install gym==0.25.2