facebook Hydra 的 + 和 ++ 运算符之间的区别

数据挖掘 Python 九头蛇 Facebook 欧米茄 配置
2022-03-02 20:56:43

如果您已经遵循深度学习中的一些最佳实践,那么Facebook 的 Hydra可能是您熟悉的名字。通过Hydra 文档,我遇到了两个重要的运算符+++文件中提到了这些运算符的使用,如下所示:

Appending a config value : +foo.bar=value
Appending or overriding a config value : ++foo.bar=value

我需要一些帮助来理解这些运算符,因为从技术上讲,在代码中使用它们对整体输出没有影响。

1个回答

假设我们有以下简单的 hydra 应用程序:

├── config.yaml
└── my_app.py
# my_app.py
import hydra
from omegaconf import OmegaConf, DictConfig

@hydra.main(".", "config")
def app(cfg: DictConfig):
    print(OmegaConf.to_yaml(cfg))

if __name__ == "__main__":
    app()
# config.yaml
a:
  b: c
$ python my_app.py
a:
  b: c

让我们看一下您链接的文档页面中“修改配置对象”的四种方法:

  • 覆盖配置值:foo.bar=value
  • 附加配置值:+foo.bar=value
  • 附加或覆盖配置值:++foo.bar=value
  • 删除配置值:~foo.bar~foo.bar=value

覆盖配置值:

$ python my_app.py a.b=y
a:
  b: y
$ python my_app.py a.x=y
Could not override 'a.x'.
To append to your config use +a.x=y
Key 'x' is not in struct
    full_key: a.x
    object_type=dict

附加配置值:

$ python my_app.py +a.b=y
Could not append to config. An item is already at 'a.b'.
Either remove + prefix: 'a.b=y'
Or add a second + to add or override 'a.b': '++a.b=y'
...
$ python my_app.py +a.x=y
a:
  b: c
  x: y

附加或覆盖配置值:

$ python my_app.py ++a.b=y
a:
  b: y
$ python my_app.py ++a.x=y
a:
  b: c
  x: y

删除配置值:

$ python my_app.py ~a.b
a: {}
$ python my_app.py ~a.b=c
a: {}
$ python my_app.py ~a.b=y
Could not delete from config. The value of 'a.b' is c and not y.
...
$ python my_app.py ~a.x
Could not delete from config. 'a.x' does not exist.
...
$ python my_app.py ~a.x=y
Could not delete from config. 'a.x' does not exist.

总结一下:

  • foo.bar=value仅当给定键已存在于配置中时,覆盖配置值 ( ) 才有效
  • +foo.bar=value仅当给定键尚未出现在配置中时,附加配置值 ( ) 才有效
  • ++foo.bar=value无论该键是否存在于配置中,附加或覆盖配置值 ( ) 都有效
  • 仅当给定的键或键值对在配置中时,删除配置值 ( ~foo.bar, ) 才有效。~foo.bar=value