Shortcuts

从DI-zoo学习

什么是DI-zoo

DI-zoo 是一个使用 DI-engine 封装的强化学习环境集合。它涵盖了绝大多数强化学习环境,包括基础环境如 OpenAI Gym,以及更复杂的环境如 SMAC。此外,对于每个环境,DI-zoo 提供了不同算法的入口及其最优配置。

DI-zoo的结构

对于特定的环境/策略对,为了在DI-engine中运行RL实验,DI-zoo主要提供两个文件:config.py文件,包括运行RL实验所需的关键配置以及入口点;env.py文件,包含在DI-engine中运行的环境封装。

注意

此外,一些环境/策略对还拥有一个main.py入口文件,这是之前版本遗留下来的训练管道。

这里我们简要展示了基于CartPole环境和DQN算法的DI-zoo的结构。

dizoo/
  classic_control/
    cartpole/
      config/cartpole_dqn_config.py # Config
      entry/cartpole_dqn_main.py  # Main
      envs/cartpole_env.py  # Env

如何使用DI-zoo

你可以直接执行DI-zoo提供的config.py文件来训练某个环境/策略对。对于CartPole/DQN,你可以轻松地使用以下代码进行RL实验:

python dizoo/classic_control/cartpole/config/cartpole_dqn_config.py

DI-engine 还为用户提供了 CLI 工具,您可以在终端中输入以下命令:

ding -v

如果终端返回了正确的信息,您可以使用此CLI工具进行常见的训练和评估,您可以输入ding -h以获取更多使用信息。

要训练CartPole/DQN,你可以直接在终端中输入以下命令:

ding -m serial -c cartpole_dqn_config.py -s 0

其中 -m serial 表示你调用的训练管道是 serial_pipeline-c cartpole_dqn_config.py 表示你使用的 config 文件是 cartpole_dqn_config.py-s 0 表示 seed 为 0。

DI-zoo的定制

您可以通过更改config.py中的配置来自定义您的训练过程或调整您的RL实验的性能。

这里我们以cartpole_dqn_config.py为例:

from easydict import EasyDict

cartpole_dqn_config = dict(
    exp_name='cartpole_dqn_seed0',
    env=dict(
        collector_env_num=8,
        evaluator_env_num=5,
        n_evaluator_episode=5,
        stop_value=195,
        replay_path='cartpole_dqn_seed0/video',
    ),
    policy=dict(
        cuda=False,
        load_path='cartpole_dqn_seed0/ckpt/ckpt_best.pth.tar',  # necessary for eval
        model=dict(
            obs_shape=4,
            action_shape=2,
            encoder_hidden_size_list=[128, 128, 64],
            dueling=True,
        ),
        nstep=1,
        discount_factor=0.97,
        learn=dict(
            batch_size=64,
            learning_rate=0.001,
        ),
        collect=dict(n_sample=8),
        eval=dict(evaluator=dict(eval_freq=40, )),
        other=dict(
            eps=dict(
                type='exp',
                start=0.95,
                end=0.1,
                decay=10000,
            ),
            replay_buffer=dict(replay_buffer_size=20000, ),
        ),
    ),
)
cartpole_dqn_config = EasyDict(cartpole_dqn_config)
main_config = cartpole_dqn_config
cartpole_dqn_create_config = dict(
    env=dict(
        type='cartpole',
        import_names=['dizoo.classic_control.cartpole.envs.cartpole_env'],
    ),
    env_manager=dict(type='base'),
    policy=dict(type='dqn'),
    replay_buffer=dict(
        type='deque',
        import_names=['ding.data.buffer.deque_buffer_wrapper']
    ),
)
cartpole_dqn_create_config = EasyDict(cartpole_dqn_create_config)
create_config = cartpole_dqn_create_config

if __name__ == "__main__":
    # or you can enter `ding -m serial -c cartpole_dqn_config.py -s 0`
    from ding.entry import serial_pipeline
    serial_pipeline((main_config, create_config), seed=0)

两个字典对象 cartpole_dqn_configcartpole_dqn_create_config 包含了CartPole/DQN训练所需的关键配置。你可以通过更改这里的配置来改变训练管道的行为。例如,通过更改 cartpole_dqn_config.policy.cuda,你可以选择是否使用你的cuda设备来运行整个训练过程。

如果你想使用DI-engine提供的其他训练管道,或者使用你自己定制的训练管道,你只需要更改调用训练管道的config.py__main__函数。例如,你可以将示例中的serial_pipeline更改为parallel_pipeline来调用并行训练管道。

对于CLI工具ding,你也可以将之前的cli命令更改为

ding -m parallel -c cartpole_dqn_config.py -s 0

调用 parallel_pipeline

注意

要自定义训练管道,您可以参考serial_pipeline,或者参考DQN示例,使用DI-engine提供的中间件来构建管道。

如果你想在DI-engine中使用自己的环境,你可以直接继承由DI-engine实现的BaseEnv。关于这部分内容,你可以参考如何将你的环境迁移到DI-engine

DI-zoo支持的算法和环境列表

DI-engine 的算法文档

DI-engine 的环境文档

支持的算法列表

支持的环境列表