【问题标题】:In hydra-python structured configs, how do you interpolate values?在 hydra-python 结构化配置中,如何插入值?
【发布时间】:2021-11-21 21:23:40
【问题描述】:

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

在使用 yaml 时,我可以通过咨询 documentation 来做到这一点:


run:
  dir: outputs
  name: try1

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

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

【问题讨论】:

  • 您想用结构化配置替换上面配置的哪一部分?是要替换包含"outputs""try1" 字符串的"run" 部分,还是要替换包含插值的"hydra" 部分?
  • “九头蛇”部分。我希望动态更改运行目录,因为我给我的实验起一个昵称 (try1)。在上面的例子中,我希望hydra.run.dir 成为outputs/try1

标签: fb-hydra hydra-python


【解决方案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被创建。

作为在cs.store 方法调用中使用package="hydra.run" 关键字参数的替代方法,您可以使用config.yaml 中的“@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 文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多