0

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

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

4

1 回答 1

0

编辑:

我的理解是 ParallelRunner 正在并行运行节点。它正在等待每个进程完成第一个节点,然后再移动到第二个节点,依此类推。

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

===

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

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 - 如果这解决了您的问题,请告诉我。

于 2021-01-06T15:51:18.403 回答