如何使用 Hydra-fb 在列表中收集配置文件?

How to gather config files in a list with Hydra-fb?

假设我的代码中有一个摘要 class db 和 classes db1, db1, ... db1继承自 db。 我的项目使用 hydra 并具有以下结构:

├── my_app.py
├── conf.yaml
└── db
    ├── db1.yaml
    ├── db2.yaml
    └── db3.yaml

我需要 db 的列表,所以我想获得这样的最终配置文件:

db:
  -
    param1_of_db1: key_1_1
    param2_of_db1: key_1_2
  -
    param1_of_db2: key_2_1
    param2_of_db2: key_2_2
  -
    param1_of_db3: key_3_1
    param2_of_db3: key_3_2

因此 dbdb1db2db3 的参数列表。 在 conf.yaml 文件中,我想是这样的:

defaults:
  - db: [db1, db2, db3]

有没有办法做这样的事情?

Hydra 不支持您要求的内容。

  1. 不支持列表组合,列表在组合过程中是all or nothing。
  2. 配置组是互斥的,有一个feature request放宽。

虽然你可以接近它(但不能从命令行覆盖结构是这样的: config.yaml:

defaults:
  - db/db1
  - db/db2
  - db/db3

此语法已记录 here

在每个数据库配置文件中,您可以执行以下操作:

db/db1.yaml:

# @pacakge _group_._name_
host: localhost
port: 3306

包覆盖记录 here

生成的配置如下所示:

db:       # from the config group of the corresponding config (path)
  db1:    # from the name of the corresponding config
    host: localhost
    port: 3306
  db2:
    ...

您可以非常接近与最新的列表合并 hydra/omegaconf

诀窍在于字典是组合的,因此您可以在字典中组合配置,然后使用新的 oc.dict.values 插值来获得最终列表。

所以在你的情况下它会是这样的:

defaults:
  - dbs/db1
  - dbs/db2
  - dbs/db3

db: ${oc.dict.values:dbs}

请注意,我已将“db”包重命名为“dbs”。所以最终解析的配置看起来像:

dbs:
  db1:    
    host: localhost
    port: 3306
  db2:
    host: localhost
    port: 3307
  db3:
    host: localhost
    port: 3308

db:
  - host: localhost
    port: 3306
  - host: localhost
    port: 3307
  - host: localhost
    port: 3308

“dbs”包的密钥没有用于任何用途,但我发现它实际上使配置更清晰。