【问题标题】:Override nested parameters using kedro run CLI command使用 kedro run CLI 命令覆盖嵌套参数
【发布时间】:2020-08-04 00:18:32
【问题描述】:

我在 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 命令覆盖这些参数?

【问题讨论】:

    标签: python command-line-interface kedro


    【解决方案1】:

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

    _split_params 首先将字符串拆分为逗号(以获取多个参数),然后拆分为冒号。实际上,添加传递给extra_params 的内容的打印/记录语句将显示如下内容:

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

    我认为你有几个选择:

    1. 取消嵌套参数。这样您就可以正确地覆盖它们。
    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)。 IMO 你可以使用这里的逻辑。

    【讨论】:

    • 我希望有一个 cli 语法允许这样做,但我已经担心在处理嵌套参数时我将不得不使用您建议的第二个选项。感谢@napoleon_borntoparty 确认这一点。
    【解决方案2】:

    我会建议另一种方式。 我添加到我的 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)

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

    【讨论】:

      猜你喜欢
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      相关资源
      最近更新 更多