Python 当任务具有未知数量的输入时,什么是工作流自动化工作?

Python 当任务具有未知数量的输入时,什么是工作流自动化工作?,python,automation,workflow,luigi,Python,Automation,Workflow,Luigi,我想使用Luigi或其他工作流自动化套件。我的问题是,我的节点具有未知数量的输入。例如,Luigi要求您提前硬编码输入 假设我有一个图,其中节点表示任务,线都向下流动,从输出指向其他任务的输入 A / \ | B \ / C 我们从A开始,向下流到B,然后是C,C也接受A的输出 我发现了一些类似SciLuigi的东西,但它并不能完全解决我的问题 您需要回答的问题是:C如何知道何时运行?A和B如何知道何时运行?这就是Luigi任务的所需的方法。Luigi模型是一个拉动模型,其中每

我想使用Luigi或其他工作流自动化套件。我的问题是,我的节点具有未知数量的输入。例如,Luigi要求您提前硬编码输入

假设我有一个图,其中节点表示任务,线都向下流动,从输出指向其他任务的输入

  A
 / \
|   B
 \ /
  C
我们从A开始,向下流到B,然后是C,C也接受A的输出


我发现了一些类似SciLuigi的东西,但它并不能完全解决我的问题

您需要回答的问题是:C如何知道何时运行?A和B如何知道何时运行?这就是Luigi任务的
所需的
方法。Luigi模型是一个拉动模型,其中每个批处理任务根据其所依赖的任务的完成情况决定何时运行。(认为
A
B
向下流动到
C
,这是没有帮助的。)

在您展示的简单模型中,
C
是管道的启动任务
C
将加载(但不调用
run
),并检查
A
B
是否已完成。如果其中任何一个未完成,它将通知该子集运行。如果它们已经完成,或者一旦完成,
C
将调用
run
。如果任务
A
B
只有有条件的工作要做,那么在没有工作要做的情况下,它们的
complete
方法可以返回
True
<代码>C
然后可以
运行

然而,我不确定这是否是你的特殊问题。也许您希望
C
A
运行一次,而
C
B
运行一次?在这种情况下,我通常编写
C
run
方法来操作任意输入列表(无论它们是目录中的文件、状态数据库中的行还是其他引用列表)。然而,在这种情况下,有时最好只是将
C
所做的任何事情添加到
A
B
的定义中,也许可以定义任务的子类,该子类添加到
C
提供的后处理步骤中


在任何情况下,运行管道的方法都有很多,但是很难在您描述的极高抽象级别上提出好的替代方案。我发现转变你的思维成为拉动模式可能是找到它们的第一步。

你做到了(以下是)。除此之外,你应该试着解释一下你是如何尝试编写你的Luigi任务来解决你的问题的。我确实看到了这个例子,但它也不太适合我的问题情况。对于单个任务,它可以接受任意数量的输入,但不确定来自哪些其他任务或有多少其他任务。重要的是他们的产出。到目前为止,我已经与SciLuigi和其他框架合作,看看哪种框架可以工作。除了我所遇到的这种情况之外,没有一个能与Luigi的易用性相媲美。我已经研究过为一个特殊任务创建一个子类,然后由工厂创建,特殊的
run()
方法将运行一个行为。不确定它是否会成功…你在前两段中描述的是我认为正在发生的事情。我的情况是,我确实知道A、B和C是什么,以及它们应该在什么时候运行。我想用它来运行人们可以快速改变的机器学习模型。假设用户知道他们需要对数据进行转换,以a、B和C表示,但只更改周围的超参数。也许他们需要再次添加从A到C的另一个B数据转换(因此我们得到一个菱形图)。理想情况下,我想交一个JSON/YML文件,描述已知的代码模块及其关系,然后让它运行。我真正的问题是,a、B、C中的任何一个在任何时候都不可能提前知道他们依赖谁,所以也许像你描述的基于拉动的工作流自动化对我来说不起作用。什么样的机器学习模型?类似于
Sklearn.pipeline.pipeline
?我认为Luigi的概念是从这样一个事实演变而来的,即当您试图将json/yml作为编程语言使用时,尝试使用json/yml进行管道变得过于复杂。请参见此处的幻灯片23-26。这是一个极好的资源,谢谢!我的想法是,这将是两者之间的交叉。依赖关系图可以指定已经编写的代码,可以是预打包的,也可以是用户编写的。JSON图和python/java/scala代码都会被上传。如果您想优化模型,不需要任何代码,只需要json。如果你需要做一个新的特殊转换,那么也上传它,并在依赖关系图中记录下来。我非常喜欢JSON部分,因为我希望有一个好的GUI使这部分变得简单。至于哪个模型,它可以是任何东西。有些代码是python,有些是java,有些是pytorch,有些是DL4J,谁知道还有什么。:)