0

我正在尝试在分层配置结构中覆盖默认列表中的包。作为一个简化的例子:

我有conf/base.yaml

defaults:
  - _self_
  - env@_here_: env1
a: 1
b: 2

conf/env/env1.yaml

c: 5
d: 6

conf/env/env2.yaml

c: 7
d: 8

跑步时my_app.py

import hydra
import omegaconf

@hydra.main(config_path="conf", config_name="base")
def my_app(cfg: omegaconf.DictConf) -> None:
    print(omegaconf.OmegaConf.to_yaml(cfg))

my_app()

我想env@_here_env1使用env2CLI 或任何其他方法覆盖。我已经浏览了 Hydra 文档几次,但找不到如何做到这一点。

4

1 回答 1

1

在当前的 hydra 版本 (Hydra 1.1.1) 中,您可以使用:

python my_app.py env=env2

由于最近为提高 Hydra API 的一致性而进行的重大更改,很快就需要这样做:

python my_app.py env@_global_=env2

这一重大更改可能是 Hydra 1.1.2 或 1.2.0 的一部分。

旁注:有几种不同的方法可以达到与上述示例相同的结果。您的选择包括:

  • 使用- env@_here_: env1in base.yaml,这就是您在上面所做的。
  • 使用- env@_global_: env1base.yaml
  • 使用- env: env1inbase.yaml并将_global_ 包头添加到env1.yamlandenv2.yaml

conf/env/env1.yaml

# @package _global_
c: 5
d: 6

conf/env/env2.yaml

# @package _global_
c: 7
d: 8

关键字_global_指的是 Hydra 生成的输出配置中的顶级包。您可以在此处阅读有关_global__here_关键字的更多信息。

于 2021-09-01T17:30:30.437 回答