跳过主要内容

依赖管理的内部

在幕后,Metaflow 做的远不止包裹如 pip installconda install 这样的 CLI 命令:

  • 它为每个步骤动态创建隔离的虚拟环境,并自动缓存以便将来使用。
  • 它支持对 python 解释器版本的固定,而 pip 不支持这种功能。
  • 它解析每个步骤的完整依赖关系图,锁定图以确保稳定性和可重现性,存储审计的元数据。
  • 它提供本地解析的环境以便进行远程执行,即使远程环境使用的操作系统和CPU架构与客户端不同(OS X与Linux)。
  • 它对数据存储中的所有软件包进行快照,使得在数千个并行容器中重建环境成为可能,这会导致并行 pip install 时出现问题。
note

有关更多功能,请参阅 Netflix 的 Metaflow 扩展,其中包含更多功能丰富的 @pypi@conda

如何 @pypi@conda 工作

当你指定 --environment=pypi--environment=conda 时,后台会发生以下情况。两个选项的工作方式相同,如下面的图所示:

package ecosystem

让我们按照蓝色步骤,从顶部开始过一遍操作:

  1. 本地 .py 文件和其他通过 --package-suffixes 指定的文件将 按照常规打包到代码包中

  2. 在使用 @pypi@conda 时,每个步骤都有自己的虚拟环境。

    • 如果两个步骤具有完全相同的包集,则在这些步骤之间重用环境。
    • 环境是使用 mamba 创建的,并安装了所需版本的 python
    • 对于特定步骤的依赖解析, @pypi 调用 pip,而 @conda 使用 mamba
    • 完整的确切包列表,也就是“锁定文件”,存储在与运行或部署对应的代码包中。
  3. 一旦为每个步骤创建了完整的包列表,包将并行下载并存储在本地。

  4. 这些包被上传到Metaflow数据存储中,例如在基于AWS的配置中使用S3。这确保了远程任务不会重复和冗余地从上游包存储库下载包。

这完成了客户端的操作。代码包与数据存储中的缓存包一起包含了一个完整的、隔离的环境,用于执行每个步骤所需的任务。

运行时操作

@pypi / @conda 启用的任务远程执行时,我们首先通过 mamba 设置一个空的虚拟环境,下载数据存储中的缓存包,并将它们解压到环境中。代码包被解压以使本地依赖可用。

之后,任务在一个恰好包含指定包的环境中执行。没有更多,没有更少。