【问题标题】:Is organizing config files within a config group in a directory structure a supported feature in hydra?在目录结构中的配置组中组织配置文件是 hydra 支持的功能吗?
【发布时间】:2021-07-20 21:11:41
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: fb-hydra


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢!我认为递归默认列表对我的用例没有帮助。我将退回到像bar_a.yaml 这样的命名方案,这样我就可以使用glob(bar_*) 而不是glob(bar/*)。这不像用于大量配置的目录层次结构那样简洁,但它现在应该可以解决问题。将来我可能会打开一个功能请求,其中包含更具体的用例和建议。
    • 看看你是否可以利用默认列表插值来简化事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 2022-08-23
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多