DI-engine 配置规范¶
为了确保配置的易用性、可读性和可扩展性,开发者提交的配置需要遵守以下规范。
DI-engine 的配置由两部分组成:main_config 和 create_config。
示例链接¶
深度Q网络(DQN)示例:
https://github.com/opendilab/DI-engine/blob/main/dizoo/atari/config/serial/pong/pong_dqn_config.py
示例配置适用于带有模型或数据的算法,例如 SQIL: https://github.com/opendilab/DI-engine/blob/main/dizoo/atari/config/serial/pong/pong_sqil_config.py
规格详情¶
语法规范¶
配置需要通过python的flake8语法检查并执行yapf格式化。
命名规范¶
X_config.py 的文件名,与 main_config 和 create_config 中的相关变量名
X_config.py 统一按照 <环境名称>_<算法名称>_config.py 的格式命名。 X_config.py 的名称和配置文件中相关变量的名称不需要添加默认字段。例如,配置文件名称 hopper_onppo_default_config.py 应改为 hopper_onppo_config.py。
同样地 对于像ICM这样的算法,完整的算法是论文中提出的模块与基线算法结合,其相应的配置文件名应命名为
_ _ _config.py,例如cartpole_icm_offppo_config.py ,例如cartpole_icm_offppo_config.py 如果算法有多个版本,包括on-policy和off-policy,请在X_config.py文件名和文件中的相关变量名称中统一相关名称,并使用onppo/offppo来区分算法的on-policy和off-policy版本。例如,对于on-policy PPO算法的配置,hopper_ppo_config.py应更改为hopper_onppo_config.py。
实验名称字段
main_config 必须包含 exp_name 字段
命名格式为<环境>_<算法>_seed0,例如 qbert_sqil_seed0
文件路径的名称
请参考sqil示例,并相应地进行注释。如果需要加载多个模型,模型路径变量的命名如下:prefix1_model_path, prefix2_model_path, …. 数据路径的变量也以相同的方式命名。
config = dict(
...,
# Users should add their own model path here. Model path should lead to a model.
# Absolute path is recommended.
# In DI-engine, it is ``exp_name/ckpt/ckpt_best.pth.tar``.
model_path='model_path_placeholder',
# Users should add their own data path here. Data path should lead to a file to store data or load the stored data.
# Absolute path is recommended.
# In DI-engine, it is usually located in ``exp_name`` directory
data_path='data_path_placeholder',
)
主要规范¶
对于create_config中的env_manager字段,除了cartpole、pendulum、bitflip等一些简单的环境外,我们将其设置为base,对于其他环境,我们将env_manager设置为subprocess:
env_manager=dict(type='subprocess'),
确保评估器环境数量:n_evaluator_episode = 1:1 (期望为smac环境)
manager字段通常不应包含在main_config的env字段中(当不包含manager字段时,shared_memory默认为True):
smac环境是一个例外,由于状态维度问题,smac需要设置shared_memory=False。
在非SMAC环境中,如果由于状态维度问题报告错误,您可以包含manager字段并设置shared_memory=False。
如果您想开启/关闭共享内存,请在env.manager文件中进行控制
config = dict( ..., env=dict( manager=dict( shared_memory=True, ), ), )
创建配置
在环境字段中,我们有两个字段:类型和导入名称: 例如:
env=dict( type='atari', import_names=['dizoo.atari.envs.atari_env'], ),
一般来说,字段replay_buffer是不必要的。但如果你想使用存储为deque的缓冲区,你可以通过以下方式指定replay_buffer的类型:
replay_buffer=dict(type='deque'),
serial_pipeline
请使用次级引用以避免循环导入:使用
from ding.entry import serial_pipeline而不是from ding.entry.serial_entry import serial_pipeline使用
[main_config, create_config]来统一风格,如果某个算法需要调用其他配置,可以放弃此约定。例如模仿 学习算法需要引入专家配置,详情请参见sqil的示例。每个配置必须有一个启动命令,其格式类似于以下内容:
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)
记住这行代码 ding.entry import serial_pipeline 不应该放在文件的头部,而是应该放在 if ___name___ == “___main___” 下面。
如果算法使用不同的serial_pipeline_X,你需要在CLI中添加相应的启动命令
serial_X。
种子在入口函数中设置,不要在配置中包含种子。
如果算法中的超参数有一定的合理范围,请在算法配置的相应超参数上写注释。例如sqil的alpha值:
alpha=0.1, # alpha: 0.08-0.12
请确保配置中的所有参数都是有效的,未使用的冗余参数应被删除。
TODO通常不包含在配置中,如果您确实需要编写TODO项,请明确标明开发者和内容,例如TODO(姓名): xxx。