我使用以下代码导入自定义环境,然后对其进行训练:
from ray.tune.registry import register_env
import ray
from ray import air, tune
from ray.rllib.algorithms.ppo import PPO
from gym_env.cube_env import CubeEnv
select_env = "2x2x2_cube-v0"
register_env(select_env, lambda config: CubeEnv())
ray.init()
tune.run(PPO, config={
"env": "2x2x2_cube-v0",
"framework": "torch",
"log_level": "INFO",
"batch_mode": "truncate_episodes",
"rollout_fragment_length": 200
})
尽管指定了“batch_mode”:“truncate_episodes”和“rollout_fragment_length”:200,但我的剧集即使在 4000 步后也不会结束。
我还收到一条警告:“您的环境没有 .spec.max_episode_steps 属性。您的地平线将默认为无穷大,并且您的环境不会重置。”
我的随机生成环境的难度可能会有很大差异,因此如果模型在 200 步后卡住,就重新启动会更好。
我是否需要将这个“max_episode_steps”属性添加到我的环境中(如果是的话如何)或者我可以直接在tune.run()配置中设置它吗?
我尝试过使用 Ray 网站,但我找不到任何缩减,并且那里的许多可用教程都使用过时的代码。
我尝试从我能找到的不同 PPO 复制配置,例如“batch_mode”:“truncate_episodes”和“rollout_fragment_length”:200,但它们似乎没有按照我希望的方式进行操作。
您可以将您的环境包装在gymnasium 的 TimeLimit 包装器中:参见此处
作为额外参数,您需要提供 max_episode_steps(即 200 步)。当达到该数字时,您的环境会将
truncated
函数中的 step
标志设置为 true。
所以在你的情况下是:
from gymnasium.wrappers.time_limit import TimeLimit
TimeLimit(CubeEnv(), max_episode_steps=200)