0

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

使用 yaml 时,我可以通过查阅文档来做到这一点:


run:
  dir: outputs
  name: try1

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

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

4

1 回答 1

1

下面是一个示例,展示了如何创建可用于覆盖 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创建目录。

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

# 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 文档。

于 2021-10-11T04:44:54.380 回答