使用kedro run CLI命令覆盖嵌套参数



我在parameters.yml中使用嵌套参数,并希望使用kedro runCLI命令的运行时参数覆盖这些参数:

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}

我认为你有几个选择:

  1. 取消嵌套参数。这样,您将正确地覆盖它们
  2. 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项目文件中,并覆盖KedroContextConfigLoader

现在我可以在CLI中使用类似kedro run .. --params "train_kwargs_max_epochs:1"的东西,它将被转换为train_kwargs.max_epochs = 1

因此,我可以在我的管道中使用params:train_kwargs,并在节点中使用它来初始化Trainer:Trainer(**train_kwargs)

如果有人对此感兴趣,我很乐意提供完整的源代码。问题是当前的代码与我客户的源代码深度集成,我需要时间将其分离并发布。

相关内容

  • 没有找到相关文章

最新更新