首页 > 解决方案 > 在目录结构中的配置组中组织配置文件是 hydra 支持的功能吗?

问题描述

让我们假设一个配置组foo和配置文件组织在以下目录结构中:

conf
├── foo
│   ├── bar
│   │   ├── a.yaml
│   │   ├── b.yaml
│   │   ├── c.yaml
│   └── baz
│       ├── d.yaml
│       ├── e.yaml
│       └── f.yaml

每个 yaml 文件都将包设置为foousing # @package foo。在运行相应的应用程序时,我可以简单地foo通过指定类似的东西来覆盖foo=bar/aor foo=baz/f。因此,子目录barbaz指示具有更大的可能配置集合的某个类别。

虽然这适用于 hydra 的标准使用,但 hydra 的一些更高级的功能似乎与这种结构不兼容。例如,我想将 glob 与这样的目录结构结合使用foo=glob(bar/*)来扫描某个类别的所有配置。但是,这似乎不起作用,因为 glob 在此示例中找不到任何配置。此外,如果我分配了一个无效的配置foo并且 hydra 列出了可用的选项,那么该列表是空的。

这让我想知道在配置组中进行结构化是否是 hydra 中普遍支持的功能,并且还没有涵盖一些极端情况,或者我是否错误地使用了 hydra 并且不应该使用目录来组织组中的配置?

标签: fb-hydra

解决方案


不建议这样做,但没有明确禁止。在某些情况下,这可以提供帮助,但正如您所发现的那样,它与其他一些功能并不能很好地配合使用。配置组包含其他配置组/配置。

Hydra 1.1 增加了对递归默认列表的支持,这将使这种情况更加普遍。请参阅默认列表文档页面:

├── server
│   ├── db
│   │   ├── mysql.yaml
│   │   └── sqlite.yaml
│   └── apache.yaml
└── config.yaml

在该示例的场景中,server/db 下的实体与 server 下的实体不同,因此这样的 globing 没有意义。


推荐阅读