在我的团队中,我们正在用 Python 进行数据分析,我们遇到的问题之一是如何编写/执行管道。目前,每个人都以不同的方式编写他们的管道,有不同的缺点:
他们用一个大的 python 脚本编写了整个管道。缺点:如果他们想在某个中间步骤更改参数,则整个管道将重新计算,与简单地从该中间步骤重新启动相比,这可能需要额外几个小时
他们为管道的每个部分编写不同的 Python 脚本,并手动启动他们想要执行的部分。缺点:启动脚本的人为错误,很难重建完整的管道(最好是在自述文件中)并且更新一个脚本或重命名中间文件需要更改其他地方的代码,...整体维护很重
他们使用某种缓存机制(如 joblib 内存)将整个管道编写在一个大型 python 脚本中。这可能是三个中目前最好的解决方案,但主要缺点是对中间文件的控制非常差(即它们是二进制文件,因此如果我们希望导出某种人类可读的形式,则需要使用另一个脚本例如 csv,...)。另一个问题是它们依赖于 Python 版本,我们可能需要为管道的不同部分使用不同版本的 Python。
我想到的另一种解决方案是简单地使用 Makefile 来指定管道。好处:
主要缺点:这需要我的团队学习一种新语言(makefile),并且规则中的 % 符号而不是正则表达式形式是有限的。此外,我觉得 Makefile 生态系统不适合这项任务(但我可能是错的)。然而,目前这仍然是最好的解决方案,尤其是当我们从某种 Python 脚本生成 Makefile 时。
我觉得这个问题很标准,应该已经有很好的工具了,但我还没有找到一个非常适合这个任务的工具。您知道我们可以使用的任何众所周知的、有据可查的工具/库/……吗?以下是必要/可能的功能:
任务的依赖图是一个静态已知的DAG(当然动态也可以)
运行时,只重新计算需要的任务
可以针对每个计算任务在不同版本的Python(conda环境)中使用Python脚本。
[奖励] 显示依赖图的 GUI + 显示哪些任务已经完成
[奖励]任务的并行化
感谢您的帮助!