Translate

2021年3月17日水曜日

OpenAI Gym カスタム環境のinfoに"episode"というキーで値を入れたら1回目のミニバッチ終了時にTypeErrorが発生する件

OpenAI Gym のカスタム環境クラスをつくったのだが、
環境クラス内部でエピソード番号を表示させたくなった。

そこで
step()の戻り値の一つinfoが特に型が決まっていないので
__init__()内で辞書self.infoを作ってその中にカウンタ用の
整数を入れてreset()が呼び出されるたびに加算するように
実装した。

以下のコードは、独自環境クラスの例である。

class TestEnv(gym.Env):
    def __init__(self):
            super().__init__()
            self.action_space = gym.spaces.Box(
                low= -1, high=+1, shape=(3,), dtype=np.float32)
            self.observation_space = gym.spaces.Box(
                low=0, high=255, shape=(120, 160, 3), dtype=np.uint8)
            self.info = {
                'episode': 1,
            }

    def reset(self):
        self.info['episode'] += 1
        return np.zeros(shape=(120, 160, 3))

    def step(self, action):
        return np.zeros(shape=(120, 160, 3)), 1.0, True, self.info


そして、以下のように強化学習トレーニングを実行しようとした。

env = TestEnv()
from stable_baselines3 import SAC
model = SAC('CnnPolicy', env, verbose=1, tensorboard_log='./logs')
model.learn(total_timesteps=4096)


すると..

C:\Users\XXXXX\Anaconda3\envs\gym_donkey\lib\site-packages\torch\cuda\__init__.py:52: UserWarning: CUDA initialization: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx (Triggered internally at  ..\c10\cuda\CUDAFunctions.cpp:100.)
  return torch._C._cuda_getDeviceCount() > 0
Using cpu device
Wrapping the env in a DummyVecEnv.
Wrapping the env in a VecTransposeImage.
Logging to ./logs\PPO_1
Traceback (most recent call last):
  File "tests\test_gym.py", line XX, in <module>
    test_learn_ppo()
  File "tests\test_gym.py", line XX, in test_learn_ppo
    model.learn(total_timesteps=4096)
  File "C:\Users\XXXXXX\Anaconda3\envs\gym_donkey\lib\site-packages\stable_baselines3\ppo\ppo.py", line 264, in learn
    reset_num_timesteps=reset_num_timesteps,
  File "C:\Users\XXXXXX\Anaconda3\envs\gym_donkey\lib\site-packages\stable_baselines3\common\on_policy_algorithm.py", line 234, in learn
    if len(self.ep_info_buffer) > 0 and len(self.ep_info_buffer[0]) > 0:
TypeError: object of type 'int' has no len()

(gym) D:\projects\hogegoge>


そこでカスタム環境クラスのself.infoで扱う'episode'キーワードを
別のラベルに変更すると..正常動作するようになった...

どうも、親クラスでself.infoを使っていて
しかもOpenAI Gym内部で'episode'キーワードを使っているらしく
想定外の型(上記例ではstr)が入っていてエラーになってしまったらしい..


Stable Baselines3 はドキュメントが充実しているのが売りだったはずなのに..

..公式ドキュメントに、書いててほしかった..


既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...