具有 Hydra 组合的值插值

Value interpolation with hydra composition

我正在使用具有以下结构的 hydra 组合物:

├── configs
    │   ├── config.yaml
    │   ├── data
    │   │   ├── dataset_01.yaml
    │   │   └── dataset_02.yaml
    │   └── model
    │       ├── bert.yaml
    │       └── gpt.yaml
defaults:
  - model: bert
  - data: dataset_01

...

# @package _group_

name: "dataset_01"

train:
  path: "../resources/datasets/dataset_01/train.jsonl"
  num_samples: 1257391

test:
  path: "../resources/datasets/dataset_01/test.jsonl"
  num_samples: 71892

val:
  path: "../resources/datasets/dataset_01/val.jsonl"
  num_samples: 73805

# @package _group_

name: "bert"

encoder: "source.encoder.BertEncoder.BertEncoder"

encoder_hparams:
  architecture: "bert-base-uncased"

lr: 1e-7

tokenizer:
  architecture: "bert-base-uncased"

predictions:
  path: "../resources/predictions/bert_predictions.pt"
@hydra.main(config_path="configs/", config_name="config.yaml")
def perform_tasks(hparams):

    model = MyModel(hparams.model)

if __name__ == '__main__':
    perform_tasks()

hparams.model 的上下文中,OmegaConf 无法插入键 data.name,因为它不在范围内。 因此,如果有一种方法可以在应用程序开始时引起插值,那就太好了。

OmegaConf 插值是绝对的,并在最终配置上运行。

试试这个:

Hydra 1.0(稳定)

predictions:
  path: "../resources/predictions/bert_${data.name}_predictions.pt"

Hydra 1.1(开发)

Hydra 1.1 将不再需要在配置中指定名称。 您将能够在不添加名称字段的情况下使用 hydra:choices.GROUP_NAME:

进行插值
predictions:
  path: "../resources/predictions/bert_${hydra:choices.data}_predictions.pt"

这已记录在案 here。 请注意,这仅在尚未正式发布的 Hydra 1.1 中可用(您可以通过安装开发版本来试用)。