在 hydra-python 结构化配置中,如何插入值?

In hydra-python structured configs, how do you interpolate values?

我在 hydra 1.1 中使用结构化配置(基于@dataclass)并尝试插入一些值。具体来说,我想通过替换我的一些配置值来设置工作目录。

我在使用 yaml 时参考 documentation 可以做到这一点:


run:
  dir: outputs
  name: try1

hydra:
  run:
    dir: ${run.dir}/${run.name}

我如何使用结构化配置来做到这一点?

下面的示例展示了如何创建可用于覆盖 Hydra 的默认输出目录的结构化配置。

# config.yaml
defaults:
  - my_run_dir
  - _self_

run:
  dir: outputs
  name: try1
# my_app.py
from dataclasses import dataclass
import hydra
from hydra.conf import RunDir
from omegaconf import DictConfig, OmegaConf
from hydra.core.config_store import ConfigStore

cs = ConfigStore.instance()

@dataclass
class MyRunDir(RunDir):
    dir: str = "${run.dir}/${run.name}"

cs.store(name="my_run_dir", node=MyRunDir, package="hydra.run")

@hydra.main(config_path=".", config_name="config")
def my_app(cfg: DictConfig) -> None:
    from hydra.core.hydra_config import HydraConfig
    assert HydraConfig.get().run.dir == "outputs/try1"

if __name__ == "__main__":
    my_app()

当此 python 文件为 运行 时,将创建目录 outputs/try1

作为对 cs.store 方法调用使用 package="hydra.run" 关键字参数的替代方法,您可以使用来自 config.yaml:[=19= 的“@package”默认列表条目]

# config.yaml
defaults:
  - my_run_dir@hydra.run
...
# my_app.py
...
cs.store(name="my_run_dir", node=MyRunDir)  # omit the `package=` argument
...

有关这方面的更多信息,请参阅 Packages 上的 Hydra 文档。