如何在Hyda中进行文件超控?

问题描述

我有一个主要的配置文件,例如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中最简单/最标准的方法是什么? (或者可能在omegaconf中?)

(请注意,理想情况下,我希望这些替代文件只是标准的yaml文件,理想情况下,这些文件将替代早期的yaml文件;尽管如果我必须使用替代DSL进行写操作,我可以这样做,如果那是最简单的方法/最佳/最标准的方式)

解决方法

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

可以在这里找到文档: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的信息。

您可以创建任意配置组,然后从每个配置组中选择一个选项(从Hydra 1.0开始,配置组选项是互斥的),此处将需要两个配置组: 一个可以是model,具有normalsmallbig模型,另一个可以是trainer,具有normal和{{1 }}选项。

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

fast

在这种覆盖整个配置中所有内容的配置组中,您应该使用全局软件包(有关软件包in the docs的更多信息)。

$ python train.py +experiment=exp1