OpenAI Gym の変更点の調査
以前に記事も書いたがOpenAI Gymのメンテナーが変更になり、それ以来非常に多くの変更が短期間で繰り返されている。
このスクラップでは、その変遷を過去の issue やリリースノートから調査してまとめようと思う。
Proposal
Open状態のProposal群
(残念ながらメンテナは説明なく issue を close することがしばしばあり、あとから第3者が見て状況を理解できないことも多々ある。)
- Conda サポート (2393)
- Type Hints (2452)
- Truncation (エピソード途中での打ち切り) の明確化 (2510)
-
描画APIの変更 (2540)
- 毎 step 描画できない環境も存在するため
-
エピソード終了時の自動 reset (2564) (PR2728) → v0.24.0
-
gym.makeにautoreset=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型のinfoのlist)
-
-
-
-
描画用の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()時に新しい迷路を作成したい - ドキュメントの更新
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を一緒に同意・インストールできるように
実装としては、AutoROM を autorom[accept-rom-license] でインストールしている。
AutoROM がダウンロードスクリプトを実装しており、AutoROM.accept-rom-lisence なるサブパッケージがインストールスクリプトとして、AutoROMをコマンドを実行する。
(ちょっと複雑な作りだが、ライセンス承諾を明確化したいのだろう。)
Atarimania (ROM配布サイト)
2022/04/12現在の最新版 V17.0 においては、rar の中にROMのバイナリが配置されており、 rar 解凍先のディレクトリを指定すれば良い。
公開されているスクリプトを見る限り、過去の版では rar の中に zip が更に入っていたと推測される。
Environment
Algorithmic (v0.20.0で削除)
| Algorithmic | 0.19.0 | 0.20.0 |
|---|---|---|
Copy |
v0 |
移管 |
RepeatCopy |
v0 |
移管 |
ReverseAddition |
v0 |
移管 |
ReverseAddition3 |
v0 |
移管 |
DuplicatedInput |
v0 |
移管 |
Reverse |
v0 |
移管 |
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 |
移管 | - | - | - | - | - |
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
|
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
|
移管 |
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 |
-
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↩︎ ↩︎ -
ElevatorAction-ramのみ10%ぐらいの非決定論的な挙動がある ↩︎ -
DeepMindの論文に準拠して、
SpaceInvadersのみ 3フレーム、他は4フレームのフレームスキップを採用 ↩︎
Step API: Truncation (打ち切り) の明確化
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 とかどうだろう。)
発端: 2021/07/28
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 未満は破壊的な変更も容認されていると押し切っていました。
v0.19.0: 2021/08/13
- メンテナー変更後の最初のリリース。
- Bug Fixやコードベースの整理が中心。
-
FrozenLakeとFrozenLake8x8が v1 に- ここから度重なる環境のバージョンアップが始まる。(利用者のプログラムは
DeprecatedEnvエラーで死ぬことに。)
- ここから度重なる環境のバージョンアップが始まる。(利用者のプログラムは
v0.20.0: 2021/09/14
-
atari_py[1] を The Arcade Learning Environment (ale-py) に置き換え
- ゲームのROM自体は同梱されないので、別途インストールが必要に
-
RecordVideoラッパーが追加され、Monitorが非推奨に (個別記事) - 使われていない(ほんとう?)環境をサードパーティ(誰これ?)に移管
- algorithmic: https://github.com/Rohan138/gym-algorithmic
-
Copy,RepeatCopy,DuplicatedInput,Reverse,ReverseAddition,ReverseAddition3
-
- toytext: https://github.com/Rohan138/gym-legacy-toytext
-
KellyCoinflip,KellyCoinflipGeneralized,NChain,Roulette,GuessingGame,HotterColder
-
- algorithmic: https://github.com/Rohan138/gym-algorithmic
-
BlackJackが v1 に。- リリースノートには書いてあるが、ソースを見ると実際の変更は、 v0.21.0
-
こちらもGym同様に、OpenAIが放棄したパッケージ ↩︎
v0.21.0: 2021/10/02
-
pip install gym[atari, accept-rom-license]で、AtariのROMを一緒に同意・インストールできるように -
Pendulumが v1 に。 -
BlackJackが v1 に。
v0.22.0: 2022/02/18
- 公式サイトの変更: https://www.gymlibrary.ml/
-
reset()が新しく引数をとる-
options: 環境依存。カリキュラム学習が言及されている -
seed: 乱数シード。代わりに従来の.seed()メソッドが非推奨に。 -
infosreturn_info:Trueの際には、obsだけではなくinfoも返す。- Release Noteが間違っており、変数名は
return_info - 後方互換のためにデフォルトは
False。 v1.0 で、デフォルトがTrueになる予定
- Release Noteが間違っており、変数名は
-
-
register()時に環境名にバージョンが不要に - ベクトル環境が、
infoで terminal_observation をサポート (?) - robotics環境が外部へ移管
ここから、後述の v0.24.0 で修正されるまで、gym.make("MODULE:ENV") 形式の環境生成が、ミスにより取り除かれてしまっている。
v0.23.0: 2022/03/05
- 描画のメタデータ
metadata変数の標準化 (PR)(を狙ったリネーム。これが issue 2675 の原因に。v0.23.1で読み替える機能追加。)-
"render.modes"→"render_modes" -
"video.frames_per_second"→"render_fps"
-
-
Monitorラッパーの削除 (早い・・・) - 使っていない(ほんとう?)環境の Striker とThrower を外部へ移管
- https://github.com/RushivArora/Gym-Mujoco-Archive (アーカイブのみで保守しないと明記。。。)
v0.23.1: 2022/03/12
-
VideoRecorderを gym<0.23 互換に。(PR)- 描画の
metadataの指定が、旧来の環境でも正しくVideoRecorderが動くように
- 描画の
v0.24.0: 2022/05/26
- 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+ モジュールのバックポート)
v0.24.1 2022/06/07
バグ修正リリース
- v0.24.0 で導入された
step()/reset()チェック機構の変更-
make内部でstep()/reset()を呼び出さなくなり、初回呼び出し時にチェックすることに (こんなにすぐ仕様変更するのは、設計時の考慮不足が懸念される)
-
- MuJoCo v4 環境のパラメータの修正
- 環境登録時の重複した警告の除去
- MuJoCo xmlファイルから math操作の除去 (?)
- 古い
space.Boxのunpickleのサポート - MuJoCo 環境における observation / action の docstring テーブル (?) の修正
- Wrapper からの
_np_randomプロパティへのアクセスを無効化。- 今後は
np_randomが環境に引き渡されることに
- 今後は
- setup.py に
"testing"依存の追加 -
rescaling_actionwrapper の docstring の修正