Closed18

OpenAI Gym の変更点の調査

山田(ymd)山田(ymd)

以前に記事も書いたがOpenAI Gymのメンテナーが変更になり、それ以来非常に多くの変更が短期間で繰り返されている。

https://zenn.dev/ymd_h/articles/80a34180b29a58

このスクラップでは、その変遷を過去の issue やリリースノートから調査してまとめようと思う。

山田(ymd)山田(ymd)

Proposal

Open状態のProposal群
(残念ながらメンテナは説明なく issue を close することがしばしばあり、あとから第3者が見て状況を理解できないことも多々ある。)

  • Conda サポート (2393)
  • Type Hints (2452)
  • Truncation (エピソード途中での打ち切り) の明確化 (2510)
  • 描画APIの変更 (2540)
    • 毎 step 描画できない環境も存在するため
  • エピソード終了時の自動 reset (2564) (PR2728) → v0.24.0
    • gym.makeautoreset=True と指定することで、AutoResetWrapper で包まれることに。デフォルトは、autoreset=False
  • Jax/Numpyサポートの新Wrapper (2567)
    • 理由は不明だが、close された
  • 利用可能な環境の名前を取得する仕組み (2603)
    • 大文字小文字の名称ゆらぎ防止、IDE支援、そもそも全リストがほしいなど
    • 理由は不明だが、closeされた
  • ベクトル化した環境における info 構造の変更 (2657) (PR2773) → v0.24.0
    • AsyncVectorWrapperおよびSyncVectorWrapperクラスが、str型のinfo_format (デフォルトは、"classic")をとるようになる。
      • InfoStrategyFactory でディスパッチ。
        • BraxVecEnvInfoStrategy。Braxのフォーマット。"brax" で指定。
        • ClassicVecEnvInfoStrategy。 旧来の形式 (dict型の infolist)
  • 描画用のPyGameをオプション依存に (2691) (PR2712) → v0.24.0
    • 描画しなければ、インストールしていなくてもエラーにならないように、render() 内部でインポートに変更
  • 空の space.Boxの許可。(いまいちニーズが不明) (2692)
    • メンテナがclose。
  • gym.make() の実装を単純化 (2738)
    • (PRをマージしているので部分的に採用されていると思うが) 破壊的な変更を行うほどのメリットが見えないとメンテナが反対して、提案者がクローズ
  • 離散アクションのout of bound 時のエラーの標準化 (2828)
    • 今は、環境ごとに assert だったり、IndexError だったり、KeyError だったりする
  • FrozenLake の改善 (2866)
    • 自由なサイズで迷路を作成できるようにしたい
    • 迷路の乱数シードを固定できるようにしたい
    • reset() 時に新しい迷路を作成したい
    • ドキュメントの更新
山田(ymd)山田(ymd)

Atari の ROM問題

v.0.20.0 未満 (= v0.19.0 以下)

pip install gym[atari] が、 atari_py をインストール。

  • atari_py <= 0.2.5: ROM を内包しているので、追加の作業不要
  • atari_py >= 0.2.6: 自分でROMをダウンロード・解凍して、python -m atari_py.import_roms <path to folder>

v0.20.0 以降

pip install gym[atari] が、ale-py をインストール。

  • ale-py <= 0.6.1: 不明。内包されている libale_c.so に含まれているのかもしれない。(liable のタイポ? lib + ALE で libale ですね。_c は C言語実装の意かな?)
  • ale-py >= 0.7.0: 自分でROMをダウンロード・解凍して、ale-import-roms <path to folder>

v0.21.0 以降

pip install gym[atari, accept-rom-license] で、AtariのROMを一緒に同意・インストールできるように

実装としては、AutoROMautorom[accept-rom-license] でインストールしている。
AutoROM がダウンロードスクリプトを実装しており、AutoROM.accept-rom-lisence なるサブパッケージがインストールスクリプトとして、AutoROMをコマンドを実行する。
(ちょっと複雑な作りだが、ライセンス承諾を明確化したいのだろう。)

Atarimania (ROM配布サイト)

http://www.atarimania.com/rom_collection_archive_atari_2600_roms.html

2022/04/12現在の最新版 V17.0 においては、rar の中にROMのバイナリが配置されており、 rar 解凍先のディレクトリを指定すれば良い。
公開されているスクリプトを見る限り、過去の版では rar の中に zip が更に入っていたと推測される。

山田(ymd)山田(ymd)

Environment

Algorithmic (v0.20.0で削除)
Algorithmic 0.19.0 0.20.0
Copy v0 移管
RepeatCopy v0 移管
ReverseAddition v0 移管
ReverseAddition3 v0 移管
DuplicatedInput v0 移管
Reverse v0 移管

移管先: https://github.com/Rohan138/gym-algorithmic

Classic
Classic 0.19.0 0.20.0 0.21.0 0.22.0 0.23.0 0.23.1 0.24.0 0.24.1
CartPole v0 & v1
MountainCar v0
MountainCarContinuous v0
Pendulum v0 v1
Acrobat v1
Box2d
Box2d 0.19.0 0.20.0 0.21.0 0.22.0 0.23.0 0.23.1 0.24.0 0.24.1
LunarLander v2
LunarLanderContinuous v2
BipedalWalker v3
BipedalWalkerHardcore v3
CarRacing v0
CarRacingDomainRandomize - v1
CarRacingDiscrete - v1
CarRacingDomainRandomizeDiscrete - v1
ToyText
ToyText 0.19.0 0.20.0 0.21.0 0.22.0 0.23.0 0.23.1 0.24.0 0.24.1
BlackJack v0 v1
KellyCoinflip v0 移管 - - - - -
KellyCoinflipGeneralized v0 移管 - - - - -
FrozenLake v1
FrozenLake8x8 v1
CliffWalking v0
NChain v0 移管 - - - - -
Roulette v0 移管 - - - - -
Taxi v3
GuessingGame v0 移管 - - - - -
HotterColder v0 移管 - - - - -

移管先: https://github.com/Rohan138/gym-legacy-toytext

MuJoCo
MuJoCo 0.19.0 0.20.0 0.21.0 0.22.0 0.23.0 0.23.1 0.24.0 0.24.1
Reacher v2 v2 & v4
Pusher v2 v2 & v4
Thrower v2 移管 - - -
Striker v2 移管 - - -
InvertedPendulum v2 v2 & v4
InvertedDoublePendulum v2 v2 & v4
HalfCheetah v2 & v3 v2 & v3 & v4
Hopper v2 & v3 v2 & v3 & v4
Swimmer v2 & v3 v2 & v3 & v4
Walker2d v2 & v3 v2 & v3 & v4
Ant v2 & v3 v2 & v3 & v4
Humanoid v2 & v3 v2 & v3 & v4
HumanoidStandup v2 v2 & v3 & v4

移管先: https://github.com/RushivArora/Gym-Mujoco-Archive

Robotics (v0.22.0で削除)
Robotics 0.19.0 0.20.0 0.21.0 0.22.0
FetchSlide & FetchSlideDense v1 移管
FetchPickAndPlace & FetchPickAndPlaceDense v1 移管
FetchReach & FetchReachDense v1 移管
FetchPush & FetchPushDense v1 移管
HandReach & HandReachDense v0 移管
HandManipulateBlockRotateZ & HandManipulateBlockRotateZDense v0 移管
HandManipulateBlockRotateZTouchSensors & HandManipulateBlockRotateZTouchSensorsDense v0 & v1 移管
HandManipulateBlockRotateParallel & HandManipulateBlockRotateParallelDense v0 移管
HandManipulateBlockRotateParallelTouchSensors & HandManipulateBlockRotateParallelTouchSensorsDense v0 & v1 移管
HandManipulateBlockRotateXYZ & HandManipulateBlockRotateXYZDense v0 移管
HandManipulateBlockRotateXYZTouchSensors & HandManipulateBlockRotateXYZTouchSensorsDense v0 & v1 移管
HandManipulateBlockFull & HandManipulateBlockFullDense & HandManipulateBlock & HandManipulateBlockDense v0 移管
HandManipulateBlockTouchSensors & HandManipulateBlockTouchSensorsDense v0 & v1 移管
HandManipulateEggRotate & HandManipulateEggRotateDense v0 移管
HandManipulateEggRotateTouchSensors & HandManipulateEggRotateTouchSensorsDense v0 & v1 移管
HandManipulateEggFull & HandManipulateEggFullDense & HandManipulateEgg & HandManipulateEggDense v0 移管
HandManipulateEggTouchSensors & HandManipulateEggTouchSensorsDense v0 & v1 移管
HandManipulatePenRotate & HandManipulatePenRotateDense v0 移管
HandManipulatePenRotateTouchSensors & HandManipulatePenRotateTouchSensorsDense v0 & v1 移管
HandManipulatePenFull & HandManipulatePenFullDense & HandManipulatePen & HandManipulatePenDense v0 移管
HandManipulatePenTouchSensors & HandManipulatePenTouchSensorsDense v0 & v1 移管

移管先: https://github.com/Farama-Foundation/gym-robotics

Atari (v0.21.0で削除)
Atari 0.19.0 0.20.0 0.21.0
[1] & [1:1]-ram v0 &
v4 &
Deterministic-v0 &
Deterministic-v4 [2]&
NoFrameSkip-v0 &
NoFrameSkip-v4 [3]
移管

移管先: https://github.com/mgbellemare/Arcade-Learning-Environment

Unit Test
Unit Test 0.19.0 0.20.0 0.21.0 0.22.0 0.23.0 0.23.1 0.24.0 0.24.1
CubeCrash v0
CubeCrashSparse v0
CubeCrashScreenBecomesBlack v0
MemorizeDigits v0
脚注
  1. Adventure, AirRaid, Alien, Amidar, Assault, Asterix, Asteroids, Atlantis, BankHeist, BattleZone, BeamRider, Berzerk, Bowling, Boxing, Breakout, Carnival, Centipede, ChopperCommand, CrazyClimber, Defender, DemonAttack, DoubleDunk, ElevatorAction, Enduro, FishingDerby, Freeway, Frostbite, Gopher, Gravitar, Hero,
    IceHockey, Jamesbond, JourneyEscape, Kangaroo, Krull, KungFuMaster, MontezumaRevenge, MsPacman, NameThisGame, Phoenix, Pitfall, Pong, Pooyan, PrivateEye, Qbert, Riverraid, RoadRunner, Robotank, Seaquest, Skiing, Solaris,
    SpaceInvaders, StarGunner, Tennis, TimePilot, Tutankham, UpNDown, Venture, VideoPinball, WizardOfWor, YarsRevenge, Zaxxon ↩︎ ↩︎

  2. ElevatorAction-ram のみ10%ぐらいの非決定論的な挙動がある ↩︎

  3. DeepMindの論文に準拠して、SpaceInvaders のみ 3フレーム、他は4フレームのフレームスキップを採用 ↩︎

山田(ymd)山田(ymd)

Step API: Truncation (打ち切り) の明確化

https://github.com/openai/gym/issues/2510
https://github.com/openai/gym/pull/2752

gym.Env.step() では環境が終了した場合とエピソードが長すぎるから打ち切られた場合の両方が、done=True として表現されるが、DQNなどでは取り扱いが変わるはずである。

そこで terminated / truncated と2つの真偽値(bool)に分割されることとなった。

旧: obs, rew, done, info = env.step(act)
新: obs, rew, terminated, truncated, info = env.step(act)

現在(2022/06/12)まだPRのレビュー中のため変更の可能性はあるが、gym.make(..., new_step_api=True) で有効化される。
v1.0 に到達するまでは、デフォルト値 new_step_api=False で互換性を維持する。
(new_step_api という引数名は今はいいですが、しばらく時が経つと混乱を生むと思うんですけどねぇ。例えば、explicit_truncation / use_truncation とかどうだろう。)

山田(ymd)山田(ymd)

発端: 2021/07/28

https://github.com/openai/gym/issues/2259

OpenAI Gym は、2016年に公開[1]されて以降、強化学習の環境(environment)のデファクトスタンダードでしたが、数年レベルで issue や PR が放置されている状況でした。

2021年7月28日に、メリーランド大学のコンピュータサイエンス専攻の博士課程学生 (CS PhD student at UMD) 兼Swarm Labsの設立者 (founder of Swarm Labs) の J K Terry (jkterry1) さんが、OpenAI からメンテナーに任命されたとの issue を建て、今後の開発についての計画を発表。

Version 1.0 に向けたロードマップとして破壊的な変更もいくつも提案し、互換性を懸念する反対意見も寄せられましたが、Version 1.0 未満は破壊的な変更も容認されていると押し切っていました。
https://github.com/openai/gym/issues/2524

脚注
  1. G.Brockman et al. "OpenAI Gym", arXiv:1606.01540 (2016) https://arxiv.org/abs/1606.01540 ↩︎

山田(ymd)山田(ymd)

https://github.com/openai/gym/pull/2752#issuecomment-1114033233

Stable Baselines 3 のメンテナーやRay RLlib のメンテナーから度重なる非互換性への不満が述べられていますね。(あまり響いていないようですが。)

個人的には、小さな非互換を短期間で繰り返すよりも、大きな非互換を間隔を十分に開けて適用してくれた方が良いのですが。。。

山田(ymd)山田(ymd)

新機能がマージ・リリースされる前にドキュメントサイトの記載内容が更新されるトラブル。
master ブランチに直でマージされ順次ドキュメントが更新されるなど、開発の運用の問題が指摘される。

stable ブランチを作ることでどうだろうかという提案あり。

https://github.com/openai/gym/issues/2825

山田(ymd)山田(ymd)

v0.19.0: 2021/08/13

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

  • メンテナー変更後の最初のリリース。
  • Bug Fixやコードベースの整理が中心。
  • FrozenLakeFrozenLake8x8 が v1 に
    • ここから度重なる環境のバージョンアップが始まる。(利用者のプログラムは DeprecatedEnv エラーで死ぬことに。)
山田(ymd)山田(ymd)

v0.20.0: 2021/09/14

https://github.com/openai/gym/releases/tag/v0.20.0

脚注
  1. こちらもGym同様に、OpenAIが放棄したパッケージ ↩︎

山田(ymd)山田(ymd)

ソースを見ると、ToyText は残っているし、BlackJackv0 のままに見える。 (Algorithmic は消えている。)
リリースノートとソースコードが一致していない・・・?

山田(ymd)山田(ymd)

v0.22.0: 2022/02/18

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

  • 公式サイトの変更: https://www.gymlibrary.ml/
  • reset() が新しく引数をとる
    • options: 環境依存。カリキュラム学習が言及されている
    • seed: 乱数シード。代わりに従来の .seed() メソッドが非推奨に。
    • infos return_info: Trueの際には、obs だけではなく info も返す。
      • Release Noteが間違っており、変数名は return_info
      • 後方互換のためにデフォルトは False。 v1.0 で、デフォルトが True になる予定
  • register() 時に環境名にバージョンが不要に
  • ベクトル環境が、infoで terminal_observation をサポート (?)
  • robotics環境が外部へ移管
山田(ymd)山田(ymd)

ここから、後述の v0.24.0 で修正されるまで、gym.make("MODULE:ENV") 形式の環境生成が、ミスにより取り除かれてしまっている。

山田(ymd)山田(ymd)

v0.23.0: 2022/03/05

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

  • 描画のメタデータ metadata 変数の標準化 (PR)(を狙ったリネーム。これが issue 2675 の原因に。v0.23.1で読み替える機能追加。)
    • "render.modes""render_modes"
    • "video.frames_per_second""render_fps"
  • Monitor ラッパーの削除 (早い・・・)
  • 使っていない(ほんとう?)環境の Striker とThrower を外部へ移管
山田(ymd)山田(ymd)

v0.24.0: 2022/05/26

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

  • MuJoCo v4 環境の追加。 (OSS化した) MuJoCo 2.2.0 を利用
    • v4 では新しく、衝突のパラメータ(? contact parameter)を指定できるようになった (ただ、パフォーマンスへの影響が大きいらしい)
  • ベクトル化環境における info パラメータの構造の変更
    • 将来的なハードウェア高速化 (GPUなどの並列化?) をできる形式にした
    • dict になった list のままにしたいなら、VectorListWrapper を代わりに使うようにと。
  • gym.make() が、step()reset() の保持をチェックすることに
    • チェックさせたくなければ、disable_env_check=True を指定
  • v0.22.0 で間違えて消してしまった、gym.make("MODULE:ENV") スタイルの復活
  • Env.reset() の前に Env.render() を実行できないように、Env.render() が順序を担保するようになる。
    • あえて実行したいときは、OrderEnforcerラッパーに disable_render_order_enforcing=True を渡す
  • Lunar Lander に風 (wind_power) と乱気流 (turbulence ) を追加 (デフォルトでは無効)
  • play() 関数に、ascii以外の複数キーを渡せるように改善
  • Googleスタイルの pydoc コメントを追加
  • 離散のCar Racing 環境の追加。gym.make("CarRacing-v1", continuous=False)
  • pygame は box2d の render() 時にのみ必要になるオプションに
  • VectorEnv で元の seed が無視されるバグの修正
  • done=True の時に自動的ににリセットする AutoResetWrapper の追加
  • ALE-py を v0.75 に
  • CarRacing で、非表示ポリゴンをレンダリングしないことで性能改善
  • CarRacing の turn 表示の修正 (?)
  • box2d の不要な try-except の除去とエラーメッセージの改善
  • gym.registry の簡略化
  • Python 3.6 のサポートの再追加 (Python 3.7+ モジュールのバックポート)
山田(ymd)山田(ymd)

v0.24.1 2022/06/07

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

バグ修正リリース

  • v0.24.0 で導入された step()/reset()チェック機構の変更
    • make 内部でstep() / reset() を呼び出さなくなり、初回呼び出し時にチェックすることに (こんなにすぐ仕様変更するのは、設計時の考慮不足が懸念される)
  • MuJoCo v4 環境のパラメータの修正
  • 環境登録時の重複した警告の除去
  • MuJoCo xmlファイルから math操作の除去 (?)
  • 古い space.Boxunpickle のサポート
  • MuJoCo 環境における observation / action の docstring テーブル (?) の修正
  • Wrapper からの _np_random プロパティへのアクセスを無効化。
    • 今後は np_random が環境に引き渡されることに
  • setup.py に "testing" 依存の追加
  • rescaling_action wrapper の docstring の修正
このスクラップは2023/01/21にクローズされました