我正在使用 Hydra 来训练机器学习模型。它非常适合执行复杂的命令,例如python train.py data=MNIST batch_size=64 loss=l2. 但是,如果我想使用相同的参数运行经过训练的模型,我必须执行类似的操作python reconstruct.py --config_file path_to_previous_job/.hydra/config.yaml。然后,我使用argparse加载前面的 yaml 并使用 compose API 来初始化 Hydra 环境。训练模型的路径是从 Hydra 文件的路径推断出来的.yaml。如果我想修改其中一个参数,我必须添加其他argparse参数并运行类似python reconstruct.py --config_file path_to_previous_job/.hydra/config.yaml --batch_size 128. 然后,代码手动使用命令行上指定的参数覆盖任何 Hydra 参数。
这样做的正确方法是什么?
我当前的代码如下所示:
train.py:
import hydra
@hydra.main(config_name="config", config_path="conf")
def main(cfg):
# [training code using cfg.data, cfg.batch_size, cfg.loss etc.]
# [code outputs model checkpoint to job folder generated by Hydra]
main()
Run Code Online (Sandbox Code Playgroud)
reconstruct.py:
import argparse
import os
from hydra.experimental import initialize, …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个分层配置结构,以便内部目录中的配置文件继承外部目录中的配置文件。例如,在以下场景中
upper_config
|
|-middle_config
| |
| |-lower_config
Run Code Online (Sandbox Code Playgroud)
我希望middle_config能够继承和覆盖 的参数upper_config,并且lower_config能够继承和覆盖 和 的middle_config参数upper_config。
一种解决方案是编写一个配置解析器,以便首先读取外部模块,然后在读取内部模块时覆盖外部模块中的字段。
但是,我想使用 Hydra(或其他一些工具,欢迎建议)来获得所有额外的便利。我已经从头到尾阅读了文档几次,虽然感觉配置组或包指令应该能够处理这个问题,但我无法完全将其拼凑在一起。
我相信这篇文章提出了一个非常相似的问题,但答案并没有启发我,而且提出问题的人似乎决定实现我上面描述的配置解析器的一个版本。
我希望有一种方法可以将内部配置文件的package指令更改为指向父配置,并以某种方式继承其默认列表。
我想拥有:
\nconf/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 config.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 data\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 data.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 render\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 renderer.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 storage\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 local.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 text\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 font.yaml\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 regions.yaml\nRun Code Online (Sandbox Code Playgroud)\n其中,在 中config.yaml,text/font.yaml分配给font和text/regions.yamlto regions,类似于:
\ndefaults:\n - font: text.font\n - regions: text.regions\n - render: renderer\n - data: data\n - storage: local\nRun Code Online (Sandbox Code Playgroud)\n或者
\n\ndefaults:\n - font:\n - text/font\n - regions:\n - text/regions\n - render: renderer\n - data: data\n - storage: local\nRun Code Online (Sandbox Code Playgroud)\n上面这些不行!
\n是否能够在某种程度上达到预期的结果yaml?
我正在使用Hydra来记录实验的超参数。
@hydra.main(config_name="config", config_path="../conf")
def evaluate_experiment(cfg: DictConfig) -> None:
print(OmegaConf.to_yaml(cfg))
...
Run Code Online (Sandbox Code Playgroud)
有时我想做一次试运行来检查一些东西。为此,我不需要任何保存的参数,所以我想知道在这种情况下如何完全禁用文件系统的保存?
我想运行Hydra multirun,但在配置文件中指定扫描。\n我想知道在请求功能请求之前是否有办法执行此操作。
\n到目前为止,我已经尝试过以下内容:
\n树结构:
\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 conf\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 compile\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 base.yaml\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 grid_search.yaml\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 config.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_app.py\nRun Code Online (Sandbox Code Playgroud)\n内容my_appy.py:
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 conf\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 compile\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 base.yaml\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 grid_search.yaml\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 config.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_app.py\nRun Code Online (Sandbox Code Playgroud)\n内容conf/config.yaml:
import hydra\nfrom omegaconf import DictConfig, OmegaConf\n\n@hydra.main(config_path="conf", config_name="config")\ndef my_app(cfg : DictConfig) -> None:\n print(OmegaConf.to_yaml(cfg, resolve=True))\n\nif __name__ == "__main__":\n my_app()\nRun Code Online (Sandbox Code Playgroud)\n内容conf/compile/base.yaml:
defaults:\n - compile: base\nRun Code Online (Sandbox Code Playgroud)\n内容conf/compile/grid_search.yaml:
loss: mse\noptimizer: adam\n …Run Code Online (Sandbox Code Playgroud) 假设我们有一个具有以下结构的 Python 项目:
\nhydra_config\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 conf\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 api_key\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 non_prod.yaml\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 prod.yaml\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 db\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 mysql.yaml\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 postgresql.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 modules\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 module.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_app.py\nRun Code Online (Sandbox Code Playgroud)\n现在,在 Hydra 的配置文档中,他们指出我们需要在我们想要访问配置文件的函数之上添加一个 Python 装饰器。my_app.py但是,文档仅展示了如何对项目主模块的函数执行此操作。
问题是,如何添加
\n@hydra.main(config_path="conf")\nRun Code Online (Sandbox Code Playgroud)\n函数的 Python 装饰器,假设module_function哪个位于modules/module.py? 以下是 的内容module.py:
import hydra\nfrom omegaconf import DictConfig, OmegaConf\n\n@hydra.main(config_path="conf")\ndef module_function(cfg: DictConfig):\n print(OmegaConf.to_yaml(cfg))\nRun Code Online (Sandbox Code Playgroud)\n下面是主要Python模块的内容my_app.py:
from modules.module import module_function\n\ndef main():\n module_function()\n\nif __name__ == "__main__":\n main()\nRun Code Online (Sandbox Code Playgroud)\n当我尝试使用 运行主 Python 模块时my_app.py, …
我想知道使用 Hydra 管理我的配置文件与直接加载 .yaml 配置文件(使用 import yaml)相比有什么优势?
已经有一个相关的问题,但是建议的Compose API不再支持 Hydra 0.11.3 将配置作为参数传递。
我想知道是否有办法通过命令行传递配置或者是否在最新版本中禁用了此功能?
假设我的代码中有一个抽象类,db并且类, , ...继承自。\n我的项目使用Hydra并具有以下结构:db1db1db1db
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_app.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 conf.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 db\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 db1.yaml\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 db2.yaml\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 db3.yaml\nRun Code Online (Sandbox Code Playgroud)\n我需要一个列表,db所以我想得到一个最终的配置文件,如下所示:
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_app.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 conf.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 db\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 db1.yaml\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 db2.yaml\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 db3.yaml\nRun Code Online (Sandbox Code Playgroud)\n所以这是, , .\n在文件中db的参数列表,我想像这样:db1db2db3conf.yaml
db:\n -\n param1_of_db1: key_1_1\n param2_of_db1: key_1_2\n -\n param1_of_db2: key_2_1\n param2_of_db2: key_2_2\n -\n param1_of_db3: key_3_1\n param2_of_db3: key_3_2\nRun Code Online (Sandbox Code Playgroud)\n有没有办法做类似的事情?
\n当我在python pytorch项目中使用Hydra时,运行结果提示\xe2\x80\x9c设置环境变量HYDRA_FULL_ERROR=1以获得完整的堆栈跟踪。\xe2\x80\x9d\n但我不知道如何设置它。
\n一些背景:可以为平方根定义自定义插值:
from omegaconf import OmegaConf
import math
OmegaConf.register_resolver("sqrt", lambda x: math.sqrt(float(x)))
Run Code Online (Sandbox Code Playgroud)
并将其与此 config.yaml 一起使用:
foo: ${sqrt:9}
Run Code Online (Sandbox Code Playgroud)
加载和打印 foo:
cfg = OmegaConf.load('config.yaml')
print(cfg.foo)
Run Code Online (Sandbox Code Playgroud)
输出 3.0
使用 Hydra 尝试此操作时:
import hydra
@hydra.main(config_path="config.yaml")
def main(cfg):
print(cfg.foo)
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Unsupported interpolation type sqrt
full_key: foo
reference_type=Optional[Dict[Any, Any]]
object_type=dict
Run Code Online (Sandbox Code Playgroud)
使用 Hydra 时如何注册我的解析器?
我对 Hydra 有以下配置:
data_files: null
theta: 0.2
use_weights: true
Run Code Online (Sandbox Code Playgroud)
我可以将其重写为:
python -m apps.test_hydra data.data_files=x
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将列表指定为:
python -m apps.test_hydra data.data_files=[x,y]
Run Code Online (Sandbox Code Playgroud)
然后我收到以下错误:
zsh: no matches found: data.data_files=[x,y]
Run Code Online (Sandbox Code Playgroud)
我不确定这是否是 zsh shell 或 Hydra 问题