从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_config 和 cartpole_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