2

我正在尝试使用一些额外的参数加载 Kedro 上下文。我的意图是parameters.yml仅使用传入的配置更新配置extra_params因此其余配置应保持不变)。然后我将使用这个上下文实例来运行一些节点/管道(注意:我不想修改parameters.yml文件,只是为了这次运行更新它)。我可以为在顶层/根级别定义的每个配置执行此操作,parameters.yml但在嵌套参数的情况下仅保留传递的配置。

为了复制这个问题,

参数.yml

config_root1: "name"
config_root2: "surname"
config_root3:
   config_leaf1: 10
   config_leaf2: 20
   config_leaf3: 30

额外参数定义为,

extra_params = {'config_root1': 'new_name', 'config_root3': {'config_leaf1': 11}}

extra_params使用by加载上下文,

from kedro.framework.context import load_context    
context = load_context(proj_path, extra_params=extra_params)

上下文中的参数更新为,

config_root1: "new_name"
config_root2: "surname"
config_root3:
   config_leaf1: 11

需要注意的地方,

  1. config_root1处于根级别并且值已传入extra_params,因此已更新。
  2. config_root2处于根级别并且没有传递任何值,因此它保持不变。
  3. config_leaf1处于叶级,因此通过的值已更新。
  4. config_leaf{2, 3}处于叶子级别,因此没有传递任何值。

似乎问题与字典嵌套字典的合并方式有关。

extra_params除了总是传递所有参数(即使只需要更改少数参数)之外的任何解决方法?

谢谢你。

4

1 回答 1

0

密钥替换config_root3为新值的问题,不能轻易忽略。

我想最好的方法是创建两个单独的配置,它们使用Additional configuration environment相互覆盖,但它需要更改使用 load_context 的方式。

此外,您可以手动使用配置加载器和合并参数,然后将合并结果提供为extra_params.

于 2020-06-05T12:30:24.067 回答