強化学習のためのシンプルな環境のひとつに、Farama Gymnasium / OpenAI Gym があります:[※1]
- ・
- https://github.com/Farama-Foundation/Gymnasium
- ・
- https://github.com/openai/gym
- ※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