使用同一组中的多个配置在 yaml 文件中插入值

Using multiple configs in the same group to interpolate values in a yaml file

在 Hydra 中我有以下配置:

├── conf
    │   ├── config.yaml
    │   ├── callbacks
    │   │   ├── callback_01.yaml
    │   │   └── callback_02.yaml
    │   └── trainer
    │       ├── default.yaml
         

回调的结构如下:

_target_: callback_to_instantiate

我需要通过插值将这两个回调传递给 trainer/default.yaml。 我这样试过:

    _target_: pytorch_lightning.Trainer
    callbacks:
        - ${callbacks.callback_01}
        - ${callbacks.callback_02}

与 config.yaml 这样:

    defaults:
      - _self_
      - trainer: default

我也做了其他的试验,但似乎没有用。有没有办法通过使用配置组中的两个或多个 yaml 文件在 yaml 文件中进行插值? 如果可能的话,我想保留这个结构。

目前推荐的做法是:

  1. 组成一个映射,其值为所需的回调,然后
  2. 使用 oc.dict.values OmegaConf 解析器从该字典中获取值列表。
# conf/config.yaml
defaults:
  - callbacks@_callback_dict.cb1: callback_01
  - callbacks@_callback_dict.cb2: callback_02
  - trainer: default
  - _self_
# conf/trainer/default.yaml
_target_: pytorch_lightning.Trainer
callbacks: ${oc.dict.values:_callback_dict}
# my_app.py
from typing import Any
import hydra
from omegaconf import DictConfig, OmegaConf

@hydra.main(config_path="conf", config_name="config")
def app(cfg: DictConfig) -> Any:
    OmegaConf.resolve(cfg)
    del cfg._callback_dict
    print(OmegaConf.to_yaml(cfg))

if __name__ == "__main__":
    app()

在命令行:

$ python my_app.py
trainer:
  _target_: pytorch_lightning.Trainer
  callbacks:
  - _target_: callback_to_instantiate_01
  - _target_: callback_to_instantiate_02

作为参考,Hydra 的 github 回购中有 an open issue 提倡改善周围的用户体验