整个 Kedro 管道的并行性

问题描述

我正在处理一个处理超大图像的项目。管道有多个节点,每个节点都会产生下一个节点运行所需的输出。我的理解是 ParallelRunner 并行运行节点。它正在等待每个进程在移动到第二个节点之前完成第一个节点,等等。我的问题是输入需要不同的时间来完成。如此多的进程卡在等待其他进程完成一个节点,当它没有必要时,因为每个并行进程不依赖于另一个进程,只有它自己先前计算的结果。

有没有办法在不同的内核上并行运行整个管道?我不希望每个并行进程等待其他进程完成一个节点。我有一个想法,我可以通过创建我的 kedro 项目的多个副本并修改它们的数据目录来处理数据集的不同部分,然后使用 subprocess 模块并行运行它们来实现这一点,但这似乎效率低下。

解决方法

编辑:

我的理解是 ParallelRunner 正在运行节点 在平行下。它正在等待每个进程完成第一个节点 在移动到第二个之前,等等

不确定我是否理解正确,但是一旦进程完成,它将立即移动到准备执行的下一个节点。它不应该等待任何东西。

===

与您对多个项目的想法相同,还有一个替代方案。但是,您无需创建项目的多个副本即可获得相同的结果。您可以使用一组特定的输入参数化运行并编写包装脚本(bash、python 等)来调用任意数量的 kedro run。例如,如果您想为 data/01_raw 目录中的一个文件运行专用的 Kedro,然后将在其自己的进程中运行,您可以执行以下操作:

for input in data/01_raw/*
do
    file=$(basename $input)
    kedro run --params=input:"$file"
done

实现这项工作的技巧是实现一个 before_pipeline_run 钩子,以动态添加具有输入参数值的目录条目。我在这里有一个演示存储库来演示此技术:https://github.com/limdauto/demo-kedro-parameterised-runs -- 如果这解决了您的问题,请告诉我。