使用 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}
我想你有几个选择:
- Un-nesting 参数。这样你就可以正确地覆盖它们。
- 向
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
并覆盖 KedroContext
和 ConfigLoader
.
现在我可以在 CLI 中使用类似 kedro run .. --params "train_kwargs_max_epochs:1"
的东西,它会被转换为 train_kwargs.max_epochs = 1
。
所以我可以在我的管道中使用 params:train_kwargs
并在节点中使用它来初始化 Trainer:Trainer(**train_kwargs)
.
如果有人对此感兴趣,我很乐意提供完整的源代码。
问题是当前代码与我客户的源代码深度集成,我需要时间将其分离并发布。
我在 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}
我想你有几个选择:
- Un-nesting 参数。这样你就可以正确地覆盖它们。
- 向
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
并覆盖 KedroContext
和 ConfigLoader
.
现在我可以在 CLI 中使用类似 kedro run .. --params "train_kwargs_max_epochs:1"
的东西,它会被转换为 train_kwargs.max_epochs = 1
。
所以我可以在我的管道中使用 params:train_kwargs
并在节点中使用它来初始化 Trainer:Trainer(**train_kwargs)
.
如果有人对此感兴趣,我很乐意提供完整的源代码。 问题是当前代码与我客户的源代码深度集成,我需要时间将其分离并发布。