注意:以下翻译的准确性尚未经过验证。这是使用 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)尝试找到满足所有瞬态依赖关系的包和版本。瞬态依赖关系包括在环境配置面板中指定的包的依赖关系,这些依赖关系的依赖关系,等等。此步骤包括四个阶段:
repodata.json
文件,并将索引条目转换为内存中的对象。如果求解成功,接下来是安装步骤。在这里,每个工件从正确的频道检索,包管理器使用这些工件来构建环境。此步骤包括三个阶段:
上述所有步骤在某些情况下可能会受到速度慢的影响。速度慢的原因通常分为以下三类之一:
速度慢的一个显著部分是由Foundry外部的因素引起的。
因为这些因素是外部且不透明的,所以很难对性能回归进行根本原因分析。环境可能会突然加载更长时间,因为某个频道最近的大小增加了,或者因为某个包在其最新版本中声明了几个新依赖关系。
更常见的是,速度慢与环境规范本身直接相关。求解步骤的规模与环境大小呈超线性增长,因此作为一般经验法则,具有更多包的环境将需要更长时间来初始化。
有两种方法可以缓解这些情况。
python
)和具有复杂依赖关系图的包(如scipy
),版本约束最有效。这样做将使Conda能够更积极地缩减索引,这意味着SAT求解不需要考虑那么多的包版本。包大小 通常比本节中的其他因素问题较少,但在某些情况下仍然相关。
下载和提取即使是单个包也可能不是微不足道的。例如,pytorch
包大约为460 MB,提取可能需要超过35秒。
下载、提取和验证的规模与环境中的包的大小和数量成线性比例。由于瞬态依赖关系,已解决的环境通常包含比环境定义中明确指定的更多的包,并且包的增加可能导致速度变慢。
在这种情况下的补救措施类似于环境规范的建议:尽量保持环境尽可能小。