如何在 Hydra 中覆盖文件?

How to do file over-rides in hydra?

我有一个主配置文件,比方说 config.yaml:

num_layers: 4
embedding_size: 512
learning_rate: 0.2
max_steps: 200000

我希望能够在命令行上用另一个文件覆盖它,比如 big_model.yaml,我在概念上使用它,如:

python my_script.py --override big_model.yaml

big_model.yaml 可能看起来像:

num_layers: 8
embedding_size: 1024

我希望能够覆盖任意数量的此类文件,每个文件都优先于最后一个。假设我也有 fast_learn.yaml

learning_rate: 2.0

然后我想在概念上做类似的事情:

python my_script.py --override big_model.yaml --override fast_learn.yaml

在 hydra 中执行此操作的 easiest/most 标准方法是什么? (或者可能在 omegaconf 中?)

(请注意,我希望这些覆盖文件理想情况下只是标准的 yaml 文件,理想情况下覆盖早期的 yaml 文件;尽管如果我必须改用覆盖 DSL 来编写,我可以这样做,如果那是easiest/best/most 标准方式)

听起来包覆盖可能是适合您的解决方案。

可以在此处找到文档:https://hydra.cc/docs/next/advanced/overriding_packages

可在此处找到示例应用程序: https://github.com/facebookresearch/hydra/tree/master/examples/advanced/package_overrides

以示例应用程序为例,您可以通过执行以下操作来实现覆盖

$ python simple.py db=postgresql db.pass=helloworld
db:
  driver: postgresql
  user: postgre_user
  pass: helloworld
  timeout: 10

参考基础教程,阅读config groups

您可以创建任意配置组,select每个配置组一个选项(从 Hydra 1.0 开始,配置组选项是互斥的),您需要两个配置组: 一个可以是 model,具有 normalsmallbig 模型,另一个可以是 trainer,可能具有 normal 和 [=18] =] 选项。

配置组也可以覆盖其他配置组中的内容。 您也可以始终从命令行附加到默认列表 - 因此您还可以添加仅在命令行中使用的其他配置组。 'experiment' 配置组就是一个例子。您可以将其用作:

$ python train.py +experiment=exp1

在此类覆盖整个配置的配置组中,您应该使用全局包(阅读有关包的更多信息 in the docs)。

# @package _global_
num_layers: 8
embedding_size: 1024
learning_rate: 2.0