从 DI-zoo 开始学习
===============================
什么是 DI-zoo
-------------------------------
DI-zoo 是一个使用 DI-engine 封装的强化学习环境集合。它覆盖了绝大多数强化学习环境,既包括基础的 `OpenAI Gym `_ ,也包括 `SMAC `_ 等更为复杂的环境。除此之外,针对每个环境,DI-zoo 都提供了不同算法的运行入口,以及每个算法对应的最优配置。
DI-zoo 的结构
-------------------------------
为了在 DI-engine 中进行强化学习训练,对于某一环境/策略组合,DI-zoo 主要提供了如下两个文件: ``config.py`` 文件,包括运行该环境/策略组合所需的关键配置,以及对训练管线的调用,作为算法的运行入口; ``env.py`` 文件,包括为了使用 DI-engine 运行该环境,而对其进行的封装。
.. note::
除此之外,某些环境/策略组合还包括一个 ``main.py`` 的入口文件,是之前版本所遗留下来的训练管线文件。
这里我们基于 CartPole 环境与 DQN 算法来简单展示一下 DI-zoo 的结构。
.. code-block::
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 ,您可以通过以下代码来轻易进行它的强化学习训练:
.. code-block:: bash
python dizoo/classic_control/cartpole/config/cartpole_dqn_config.py
DI-engine还为用户准备了CLI工具,您可以在终端中键入以下命令:
.. code-block:: bash
ding -v
如果终端返回正确的信息,您可以使用这个CLI工具进行常见的训练和评估,您可以键入 ``ding -h`` 查看更多帮助。
对于 CartPole/DQN 的训练,您可以直接通过在终端键入以下命令来完成:
.. code-block:: bash
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`` 中的配置,来自定义训练流程,或者对某环境/策略组合的性能进行调优。
还是以 ``cartpole_dqn_config.py`` 为例进行演示:
.. code-block:: python
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`` 文件最下方, ``__main__`` 函数中调用训练管线的部分即可。比如您可以把例子中的 ``serial_pipeline`` 改成 ``parallel_pipeline``,来调用并行的训练管线。
对于CLI工具 ``ding``,您也可以把之前的cli命令改成
.. code-block:: bash
ding -m parallel -c cartpole_dqn_config.py -s 0
来调用 ``parallel_pipeline``。
.. note ::
如何自定义训练管线可以参考 `serial_pipeline `_ 的写法,或者参考 `DQN example `_,使用 DI-engine 提供的 `中间件 <../03_system/middleware_zh.html>`_ 来进行搭建。
如果您想要接入自己的环境,只需继承 DI-engine 实现的 ``BaseEnv`` 即可。这部分可以参考 `如何将自己的环境迁移到DI-engine中 <../04_best_practice/ding_env_zh.html>`_。
DI-zoo 已支持的算法和环境列表
-------------------------------
`DI-engine 算法文档 <../12_policies/index_zh.html>`_
`DI-engine 环境文档 <../13_envs/index_zh.html>`_
`已支持的算法 `_
`已支持的环境 `_