微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

假设我的代码中有一个抽象类db,并且类db1db1,... 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. 不支持列表组合,列表在组合过程中全部或全部不提供。
  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”包的键不用于任何用途,但我发现它实际上使配置更清晰。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。