我正在使用@dataclass
带有 hydra 1.1 的结构化配置(基于 -)并尝试插入一些值。具体来说,我想通过替换我的一些配置值来设置工作目录。
使用 yaml 时,我可以通过查阅文档来做到这一点:
run:
dir: outputs
name: try1
hydra:
run:
dir: ${run.dir}/${run.name}
如何使用结构化配置来做到这一点?
我正在使用@dataclass
带有 hydra 1.1 的结构化配置(基于 -)并尝试插入一些值。具体来说,我想通过替换我的一些配置值来设置工作目录。
使用 yaml 时,我可以通过查阅文档来做到这一点:
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
创建目录。
作为对方法调用使用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 文档。