使用 hydra 覆盖子模块的完整配置

override complete config for submodule with hydra

所以,我有一个 hydra 模型配置 (autoencoder.yaml) 定义为:

_target_: student.models.AutoEncoder
defaults:
  - dataloader: msa
  - encoder: default_encoder
  - decoder: vae_decoder
  - scheduler: null
  - optimizer: adam
  - preprocessing: null

batch_size: 256

现在在编码器文件夹中,我有以下 YAML 配置:

- default_encoder.yaml
- vae_encoder.yaml

我的基本配置文件如下:

# @package _global_

defaults:
  - _self_
  - model: autoencoder.yaml
 
  # enable color logging
  - override hydra/hydra_logging: colorlog
  - override hydra/job_logging: colorlog

work_dir: ${hydra:runtime.cwd}
seed: null
name: "default"

现在,我可以按原样调用它:

python myapp.py seed=42  #works

但是当我做类似的事情时:

python myapp.py ++model.encoder=vae_encoder

附带错误:

Top level config has to be OmegaConf DictConfig, plain dict, or a Structured Config class or instance

我怎样才能通过 hydra 的合成来替换底层对象?基本上,当我这样做或 ++model.encoder=vae_encoder 时,它会将其替换为字符串而不是引用 yaml 文件

修改默认列表时,使用斜杠 ('/') 而不是句点 ('.') 作为路径组件的分隔符:

python myapp.py model/encoder=vae_encoder

而不是

python myapp.py model.encoder=vae_encoder