从 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.yaml
和env2.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。
我正在尝试覆盖分层配置结构中默认列表中的包。作为一个简化的例子:
我有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
中使用 - 在
base.yaml
中使用- env: env1
并在env1.yaml
和env2.yaml
中添加
- env@_global_: env1
_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。