Shortcuts

DI-engine 配置规范

为了确保配置的易用性、可读性和可扩展性,开发者提交的配置需要遵守以下规范。

DI-engine 的配置由两部分组成:main_config 和 create_config。

规格详情

语法规范

  • 配置需要通过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。