我在parameters.yml
中使用嵌套参数,并希望使用kedro run
CLI命令的运行时参数覆盖这些参数:
train:
batch_size: 32
train_ratio: 0.9
epochs: 5
以下似乎不起作用:
kedro run --params train.batch_size:64,train.epochs:50
epoch和batch_ size的值是来自CCD_。如何使用cli命令覆盖这些参数?
附加参数通过kedro_cli.py
中的load_context(Path.cwd(), env=env, extra_params=params)
传递到KedroContext
对象中。在这里,您可以看到有一个名为_split_params
的回调(受保护(函数,它拆分:
上的键值对。
此_split_params
首先将字符串拆分为逗号(以获得多个params(,然后再拆分为冒号。实际上,添加一个关于传递到extra_params
中的内容的打印/日志记录语句会显示以下内容:
{'train.batch_size': 64, 'train.epochs': 50}
我认为你有几个选择:
- 取消嵌套参数。这样,您将正确地覆盖它们
- 在
kedro_cli.py
中向_split_params
添加自定义逻辑,以创建一个关于.
字符的嵌套字典,该字典将传递到上述函数中。我认为您可以重用许多现有的逻辑
NB:这是在kedro==0.16.2
上测试的。
NB2:kedro
拆分嵌套参数的方式是使用context.py
中的_get_feed_dict
和_add_param_to_feed_dict
函数。具体地说,_add_param_to_feed_dict
是一个递归函数,它将字典解包并格式化为"{}.{}".format(key, value)
。IMO你可以从这里使用逻辑。
我建议另一种方法。我将run.py
添加到我的Kedro项目文件中,并覆盖KedroContext
和ConfigLoader
。
现在我可以在CLI中使用类似kedro run .. --params "train_kwargs_max_epochs:1"
的东西,它将被转换为train_kwargs.max_epochs = 1
。
因此,我可以在我的管道中使用params:train_kwargs
,并在节点中使用它来初始化Trainer:Trainer(**train_kwargs)
。
如果有人对此感兴趣,我很乐意提供完整的源代码。问题是当前的代码与我客户的源代码深度集成,我需要时间将其分离并发布。