依赖管理的内部
在幕后,Metaflow 做的远不止包裹如 pip install 或 conda install 这样的 CLI 命令:
- 它为每个步骤动态创建隔离的虚拟环境,并自动缓存以便将来使用。
- 它支持对
python解释器版本的固定,而pip不支持这种功能。 - 它解析每个步骤的完整依赖关系图,锁定图以确保稳定性和可重现性,存储审计的元数据。
- 它提供本地解析的环境以便进行远程执行,即使远程环境使用的操作系统和CPU架构与客户端不同(OS X与Linux)。
- 它对数据存储中的所有软件包进行快照,使得在数千个并行容器中重建环境成为可能,这会导致并行
pip install时出现问题。
note
有关更多功能,请参阅 Netflix 的 Metaflow 扩展,其中包含更多功能丰富的 @pypi 和 @conda。
如何 @pypi 和 @conda 工作
当你指定 --environment=pypi 或 --environment=conda 时,后台会发生以下情况。两个选项的工作方式相同,如下面的图所示:

让我们按照蓝色步骤,从顶部开始过一遍操作:
本地
.py文件和其他通过--package-suffixes指定的文件将 按照常规打包到代码包中。在使用
@pypi或@conda时,每个步骤都有自己的虚拟环境。- 如果两个步骤具有完全相同的包集,则在这些步骤之间重用环境。
- 环境是使用
mamba创建的,并安装了所需版本的python。 - 对于特定步骤的依赖解析,
@pypi调用pip,而@conda使用mamba。 - 完整的确切包列表,也就是“锁定文件”,存储在与运行或部署对应的代码包中。
一旦为每个步骤创建了完整的包列表,包将并行下载并存储在本地。
这些包被上传到Metaflow数据存储中,例如在基于AWS的配置中使用S3。这确保了远程任务不会重复和冗余地从上游包存储库下载包。
这完成了客户端的操作。代码包与数据存储中的缓存包一起包含了一个完整的、隔离的环境,用于执行每个步骤所需的任务。
运行时操作
当 @pypi / @conda 启用的任务远程执行时,我们首先通过 mamba 设置一个空的虚拟环境,下载数据存储中的缓存包,并将它们解压到环境中。代码包被解压以使本地依赖可用。
之后,任务在一个恰好包含指定包的环境中执行。没有更多,没有更少。