标签: fb-hydra

将 Hydra/omegaconf 配置转换为 python 嵌套字典/列表?

我想将 OmegaConf/Hydra 配置转换为嵌套字典/列表。我怎样才能做到这一点?

python fb-hydra omegaconf

16
推荐指数
2
解决办法
2万
查看次数

从 python 文件在 Hydra DictConfig 中创建一个新密钥

我想在加载 Hydra 配置后添加一个键 + 值。本质上我想运行我的代码并检查 GPU 是否可用。如果是,则将该设备记录为 gpu,否则保留 cpu。

本质上保存了以下输出:

torch.cuda.is_available()
Run Code Online (Sandbox Code Playgroud)

当我尝试添加带有“setdefault”的键时:

@hydra.main(config_path="conf", config_name="config")
def my_app(cfg: DictConfig) -> None:
    cfg.setdefault("new_key", "new_value")
Run Code Online (Sandbox Code Playgroud)

如果我这样做,也会出现同样的错误:

  cfg.new_key = "new_value"
  print(cfg.new_key)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

omegaconf.errors.ConfigKeyError: Key 'new_key' is not in struct
        full_key: new_key
        reference_type=Optional[Dict[Union[str, Enum], Any]]
        object_type=dict
Run Code Online (Sandbox Code Playgroud)

我当前的解决方法是仅使用 OmegaConfig:

  cfg = OmegaConf.structured(OmegaConf.to_yaml(cfg))
  cfg.new_key = "new_value"
  print(cfg.new_key)
  >>>> new_value
Run Code Online (Sandbox Code Playgroud)

当然一定有更好的方法来做到这一点吗?

python fb-hydra

15
推荐指数
1
解决办法
1万
查看次数

如何在不使用 @hydra.main() 的情况下获取 Hydra 配置

假设我们有以下设置(从Hydra 文档中复制和缩短):

配置文件: config.yaml

db:
  driver: mysql
  user: omry
  pass: secret
Run Code Online (Sandbox Code Playgroud)

蟒文件: my_app.py

import hydra
@hydra.main(config_path="config.yaml")
def my_app(cfg):
    print(cfg.pretty())
if __name__ == "__main__":
    my_app()
Run Code Online (Sandbox Code Playgroud)

当我们可以在函数上使用装饰器时,这很有效my_app。现在我想(为了小脚本和测试目的,但这并不重要)cfg在任何函数之外获取这个对象,只是在一个普通的 python 脚本中。据我了解装饰器的工作原理,应该可以调用

import hydra
cfg = hydra.main(config_path="config.yaml")(lambda x: x)()
print(cfg.pretty())
Run Code Online (Sandbox Code Playgroud)

但 thencfg只是None而不是所需的配置对象。所以看起来装饰器没有传递返回值。有没有另一种方法可以做到这一点cfg

python-3.x hydra-python fb-hydra

13
推荐指数
2
解决办法
5117
查看次数

是否可以在 Hydra-core python 包的结构化配置中使用 Pydantic 代替数据类?

最近我开始使用Hydra来管理我的应用程序中的配置。我使用结构化配置为 .yaml 配置文件创建架构。Hyda 中的结构化配置使用数据类进行类型检查。但是,我还想对我在结构化配置中指定的某些参数使用某种验证器(类似这样)。

您知道是否可以使用 Pydantic 来实现此目的吗?当我尝试使用 Pydantic 时,OmegaConf 抱怨它:

omegaconf.errors.ValidationError: Input class 'SomeClass' is not a structured config. did you forget to decorate it as a dataclass?
Run Code Online (Sandbox Code Playgroud)

hydra-core fb-hydra

10
推荐指数
1
解决办法
4440
查看次数

如何从脚本中覆盖 Hydra 工作目录?

我知道我可以通过hydra.run.dir=XXX从命令行设置来更改配置中的工作目录。但是如何从不使用 CLI 参数的脚本中正确执行此操作,甚至将日志保存在我设置的目录中?

该代码不起作用,因为:

  1. 当我尝试更改目录时,Hydra 及其记录器已经初始化
  2. 没有这样的属性cfg.hydra

UPD:我在评论中得到了指示。if __name__ == 'main':我可以在调用 Hydra 之前更改块中的 Hydra 参数。hydra.run.dir但如何从脚本中获取和修改呢?

    @hydra.main(config_path="conf", config_name="config")
    def main(cfg):
        cfg.hydra.run.dir = "./c_out/cached_loss"  # no such attribute
        logger.info('I log something')
Run Code Online (Sandbox Code Playgroud)

我的九头蛇配置如下所示:

defaults:                     
  - hydra/job_logging: custom_logging 
Run Code Online (Sandbox Code Playgroud)
# hydra/custom_logging.yaml
# python logging configuration for tasks                           
version: 1                                                         
formatters:                                                        
  simple:                                                          
    format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' 
handlers:                                                          
  console:                                                         
    class: logging.StreamHandler                                   
    formatter: simple                                              
    stream: ext://sys.stdout                                       
  file:                                                            
    class: logging.FileHandler                                     
    formatter: simple                                              
    # relative to the job log directory                            
    filename: …
Run Code Online (Sandbox Code Playgroud)

python fb-hydra

8
推荐指数
3
解决办法
8748
查看次数

由于 VS 构建工具,Hydra 在 python 3.10 上安装失败

我正在尝试在 Windows 10 系统上安装 Hydra 2.5。我安装了 Visual Studio Build Tools 2022 和桌面 C++ 开发选项。当我使用 pip 时,我收到下面附加的错误。我已经尝试过 python 3.10 和 3.9。我尝试过新的 conda 环境。我还尝试安装 Mingw-w64 看看是否有帮助,但没有帮助。任何建议,将不胜感激。

\n
Building wheels for collected packages: hfcnn, hydra\n  Building wheel for hfcnn (setup.py) ... done\n  Created wheel for hfcnn: filename=hfcnn-0.1.0-py2.py3-none-any.whl size=42563 sha256=6eddd284ff183a321cd329928f9d3c242253072b854502a6df97de9b413edc69\n  Stored in directory: C:\\Users\\natep\\AppData\\Local\\Temp\\pip-ephem-wheel-cache-w1fs1loj\\wheels\\24\\17\\50\\c13d5e23193f95d3a4a29906052d1bfec09abb75cf58968c32\n  Building wheel for hydra (setup.py) ... error\n  error: subprocess-exited-with-error\n\n  \xc3\x97 python setup.py bdist_wheel did not run successfully.\n  \xe2\x94\x82 exit code: 1\n  \xe2\x95\xb0\xe2\x94\x80> [39 lines of output]\n      running bdist_wheel\n      running build\n …
Run Code Online (Sandbox Code Playgroud)

python python-3.x windows-10 visual-studio-2017-build-tools fb-hydra

8
推荐指数
1
解决办法
5220
查看次数

访问 Hydra 当前输出目录的正确方法是什么?

假设我阻止Hydra更改当前工作目录,我怎样才能从中检索作业的输出目录(即 Hydra 创建用于存储特定作业结果的文件夹)main()

理想情况下,我想要一种无论是常规运行还是多次运行都有效的方法。我知道我可以通过 访问配置hydra.core.hydra_config.HydraConfig.get(),但不清楚其中的任何设置是否始终映射到输出文件夹。相关教程页​​面讨论了如何设置输出文件夹,但没有讨论在我们不更改 cwd 的情况下如何检索它。

python fb-hydra

6
推荐指数
1
解决办法
6232
查看次数

Hydra:如何在配置文件中表示 None ?

我有一个非常简单的 Python 脚本:

import hydra
from omegaconf import DictConfig, OmegaConf


@hydra.main(version_base="1.3", config_path=".", config_name="config")
def main(cfg: DictConfig) -> None:
    if cfg.benchmarking.seed_number is None: 
        raise ValueError()

if __name__ == "__main__": 
    main()
Run Code Online (Sandbox Code Playgroud)

这里是配置文件:

benchmarking: 
  seed_number: None 
Run Code Online (Sandbox Code Playgroud)

不幸的是,Python 脚本不会引发错误。相反,当我打印 的类型时cfg.benchmarking.seed_number,它是str。我怎样才能通过None呢?

python fb-hydra

6
推荐指数
1
解决办法
1957
查看次数

如何在 Hydra 中进行文件覆盖?

我有一个主配置文件,比方说config.yaml

num_layers: 4
embedding_size: 512
learning_rate: 0.2
max_steps: 200000
Run Code Online (Sandbox Code Playgroud)

我希望能够在命令行上使用另一个文件(例如 say )覆盖它,big_model.yaml我在概念上使用它,例如:

python my_script.py --override big_model.yaml
Run Code Online (Sandbox Code Playgroud)

可能big_model.yaml看起来像:

num_layers: 8
embedding_size: 1024
Run Code Online (Sandbox Code Playgroud)

我希望能够覆盖任意数量的此类文件,每个文件的优先级都高于前一个文件。假设我也有fast_learn.yaml

learning_rate: 2.0
Run Code Online (Sandbox Code Playgroud)

所以我想从概念上做一些类似的事情:

python my_script.py --override big_model.yaml --override fast_learn.yaml
Run Code Online (Sandbox Code Playgroud)

在九头蛇中做到这一点的最简单/最标准的方法是什么?(或者可能在 omegaconf 中?)

(请注意,我希望这些覆盖文件理想地只是标准 yaml 文件,理想情况下覆盖早期的 yaml 文件;尽管如果我必须使用覆盖 DSL 来编写,我可以这样做,如果这是最简单/最好的/最标准的方式)

fb-hydra omegaconf

5
推荐指数
1
解决办法
1万
查看次数

Hydra:从代码中访问配置文件的名称

我有一个配置树,例如:

config.yaml
model/
  model_a.yaml
  model_b.yaml
  model_c.yaml

Run Code Online (Sandbox Code Playgroud)

其中config.yaml包含:

config.yaml
model/
  model_a.yaml
  model_b.yaml
  model_c.yaml

Run Code Online (Sandbox Code Playgroud)

我想从我的 python 代码或文件本身访问所使用的模型配置文件的名称(默认或覆盖)。就像是:

# @package _global_
defaults:
  - _self_
  - model: model_a.yaml

some_var: 42
Run Code Online (Sandbox Code Playgroud)

或(来自例如model_a.yaml

@hydra.main(...)
def main(config):
  model_name = config.model.__filename__
Run Code Online (Sandbox Code Playgroud)

提前致谢!

python fb-hydra omegaconf

5
推荐指数
1
解决办法
3415
查看次数