数据连接与集成Python转换Python environment环境创建概述

注意:以下翻译的准确性尚未经过验证。这是使用 AIP ↗ 从原始英文文本进行的机器翻译。

环境创建概述

这是一个详细介绍环境初始化过程的高级指南。适用于对可能影响初始化性能的技术考虑因素感兴趣的用户。有关常见环境相关问题的一般指导,请参阅环境故障排除指南

Conda是一个开源的、与语言无关的包和环境管理器。Mamba是Conda包管理器的开源重新实现。Hawk是Palantir开发的Conda包管理器的重新实现。代码库在提交后运行检查时使用Hawk来解析包依赖关系。与Mamba和Conda相比,Hawk在包解析方面提供了几个优势,尤其是在速度提升和积极维护与开发方面。

本页介绍了最重要的概念,并概述了环境创建过程;有关更多信息,请查阅官方Conda文档 ↗Mamba文档 ↗

重要术语

是一个文件集合,通常包含元数据、库和/或二进制文件。代码库提供了丰富的包选择(例如numpy)以补充核心语言功能。

一个包是版本化的,并且几乎总是有一组依赖关系——必须安装的其他包,以确保其正常运行。依赖关系可能是包的特定版本、可接受版本的范围或任何版本。

频道

频道,有时称为仓库,是存储包的任何位置。一个频道可能是本地文件系统中的目录,另一个可能是托管在网络服务器上的目录。

无论类型如何,每个频道都是一个目录树,根据平台架构划分包。每个平台子目录包含一个名为repodata.json的文件,这是该子目录中所有包的索引。

Conda在需要获取包时会搜索一组预配置的频道。有关Foundry中频道管理的更多信息,请参阅包文档

环境

Conda 环境 是包含特定包集合的目录。通过向Conda传递在环境配置面板中指定的包,为每个代码库创建一个环境。Conda构建出满足配置和所有依赖关系的包集,并将这些包安装到支持代码库的Spark模块上。

性能

以下对性能的解释借鉴了这篇Anaconda博客文章 ↗,该文章详细讨论了Conda性能,但也适用于Mamba或Hawk的实现。接下来的两个部分总结了此材料并概述了与代码库最相关的性能因素:

创建环境

环境创建包括两个主要步骤:求解步骤安装步骤

求解步骤

求解步骤中,指定的包管理器(Conda、Mamba或Hawk)尝试找到满足所有瞬态依赖关系的包和版本。瞬态依赖关系包括在环境配置面板中指定的包的依赖关系,这些依赖关系的依赖关系,等等。此步骤包括四个阶段:

  1. 下载和处理包索引。包管理器将从每个配置的频道下载相关的repodata.json文件,并将索引条目转换为内存中的对象。
  2. 缩减索引。包管理器构建出可能用于环境的所有包的集合。为此,算法从提供的包规范开始,并递归遍历所有依赖关系。所有不需要的包——主要是那些不在依赖关系图中的包——都会被修剪掉。
  3. 将依赖关系约束表达为布尔可满足性(SAT)问题。包管理器倾向于某些类型的解决方案,例如可能的最新版本的包,这些偏好会融入到子句构建中。
  4. 运行SAT求解器。

安装步骤

如果求解成功,接下来是安装步骤。在这里,每个工件从正确的频道检索,包管理器使用这些工件来构建环境。此步骤包括三个阶段:

  1. 下载并提取已解决环境中的所有包。
  2. 验证包内容。根据配置,Conda将使用校验和或验证文件大小是否正确。
  3. 将包链接到环境中。

限制

上述所有步骤在某些情况下可能会受到速度慢的影响。速度慢的原因通常分为以下三类之一:

上游更改

速度慢的一个显著部分是由Foundry外部的因素引起的。

  • 下载和处理频道索引的规模与索引文件的总大小成比例;需要考虑的频道越多,这些频道越大,这些步骤所需的时间就越长。
  • 索引缩减也与瞬态依赖关系的数量成比例;瞬态依赖关系的数量由包选择声明的依赖关系决定。

因为这些因素是外部且不透明的,所以很难对性能回归进行根本原因分析。环境可能会突然加载更长时间,因为某个频道最近的大小增加了,或者因为某个包在其最新版本中声明了几个新依赖关系。

环境规范

更常见的是,速度慢与环境规范本身直接相关。求解步骤的规模与环境大小呈超线性增长,因此作为一般经验法则,具有更多包的环境将需要更长时间来初始化。

有两种方法可以缓解这些情况。

  • 首先,从环境定义中删除不需要的包。拥有小而专业化的环境比拥有大而通用的环境更高效。
  • 其次,尝试在环境配置面板中为某些包添加版本约束。对于具有许多现有构建的包(如python)和具有复杂依赖关系图的包(如scipy),版本约束最有效。这样做将使Conda能够更积极地缩减索引,这意味着SAT求解不需要考虑那么多的包版本。

包大小

包大小 通常比本节中的其他因素问题较少,但在某些情况下仍然相关。

下载和提取即使是单个包也可能不是微不足道的。例如,pytorch包大约为460 MB,提取可能需要超过35秒。

下载、提取和验证的规模与环境中的包的大小和数量成线性比例。由于瞬态依赖关系,已解决的环境通常包含比环境定义中明确指定的更多的包,并且包的增加可能导致速度变慢。

在这种情况下的补救措施类似于环境规范的建议:尽量保持环境尽可能小。