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

Override nested parameters using kedro run CLI command

我在 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 的值来自 parameters.yml。如何使用 cli 命令覆盖这些参数?

附加参数通过 kedro_cli.py 中的 load_context(Path.cwd(), env=env, extra_params=params) 传递到 KedroContext 对象。在这里您可以看到有一个名为 _split_params 的回调(受保护)函数,它将 : 上的 key-value 对拆分。

这个 _split_params 首先在逗号上拆分字符串(以获得多个参数),然后在冒号上。实际上添加一个 print/logging 声明什么被传递到 extra_params 会显示类似的东西:

{'train.batch_size': 64, 'train.epochs': 50}

我想你有几个选择:

  1. Un-nesting 参数。这样你就可以正确地覆盖它们。
  2. kedro_cli.py 中的 _split_params 添加自定义逻辑,以在 . 个字符上创建嵌套字典,该字典将传递到上述函数中。我认为你可以重用很多现有的逻辑。

注意:这是在 kedro==0.16.2.

上测试的

NB2:kedro 拆分嵌套参数的方式是使用 context.py 中的 _get_feed_dict_add_param_to_feed_dict 函数。具体来说,_add_param_to_feed_dict 是一个递归函数,它解压字典并将格式设置为 "{}.{}".format(key, value)。在我看来,您可以使用此处的逻辑。

我会建议另一种方法。 我添加到我的 Kedro 项目文件 run.py 并覆盖 KedroContextConfigLoader.

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

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

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