从 cli 覆盖默认列表中指定的包

overriding the package specified in default list from cli

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

我有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()

我想使用 CLI 或任何其他方法将 env@_here_env1 覆盖到 env2。我浏览了 Hydra 文档几次,但找不到如何执行此操作。

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

python my_app.py env=env2

由于最近 breaking change 提高了 Hydra 的 API 的一致性,很快就需要这样做:

python my_app.py env@_global_=env2

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

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

  • base.yaml 中使用 - env@_here_: env1,这就是您在上面所做的。
  • base.yaml
  • 中使用- env@_global_: env1
  • base.yaml中使用- env: env1并在env1.yamlenv2.yaml
  • 中添加_global_package header

conf/env/env1.yaml:

# @package _global_
c: 5
d: 6

conf/env/env2.yaml:

# @package _global_
c: 7
d: 8

关键字_global_指的是Hydra生成的输出配置中的顶级包。 您可以阅读更多关于 _global__here_ 关键字的 here