1

在 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 文件中进行插值?如果可能的话,我希望保持这种结构。

4

1 回答 1

1

目前推荐的方法是:

  1. 组成一个映射,其值是所需的回调,然后
  2. 使用oc.dict.valuesOmegaConf 解析器从该字典中获取值列表。
# 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 repo 上有一个未解决的问题,提倡改善用户体验

于 2022-02-10T19:48:33.150 回答