fastchan,一个新的 conda 迷你分发版

技术
作者

Jeremy Howard

发布日期

2021 年 7 月 15 日

总结:今天我们宣布推出 fastchan,这是一个专注于 PyTorch 生态系统的新型 conda 迷你分发版。使用 fastchan,安装和更新诸如 PyTorchRAPIDS 等库将变得更快、更容易、更可靠。

这篇详细的博客文章Weights and Biases 的杰出作者 Aman Arora 所写,极好地概述了 fastchan 的用途、它与生态系统其他部分的关系以及它如何在实践中让工作更轻松。

你需要了解什么

如果您使用 Anaconda,现在可以使用一个统一的命令安装 Python 软件,例如 fastaiRAPIDStimmOpenCVHugging Face Transformersconda install -c fastchan。同样的方法也可用于升级您从 fastchan 安装的任何软件。fastchan 上的软件已在 Mac、Linux 和 Windows 上测试并成功安装,支持所有最新版本的 Python。可用软件包的完整列表可在此处查看

在过去几个月里,我们一直在测试 fastchan,并且已将 fastai 的官方安装源切换为使用 fastchan。据 Anaconda 称,它的受欢迎程度已经几乎与 PyTorch 自己的 channel 不相上下了!

PyTorch 的 Anaconda 下载统计数据

背景

conda 是我最喜欢的软件之一。它允许我安装种类繁多的软件,例如 Rust、GCC、CUDA Toolkit、Python、graphviz 等等,数千种,甚至不需要 root 权限。它能安装可执行文件、C 库、Python 模块以及你能想到的几乎任何东西。它还会自动处理所需依赖项的安装。

如果你用过像 apt (Ubuntu) 或 yum (Fedora) 这样的 Linux 软件包管理器,那么这听起来会相当熟悉 —— conda 基本上就是另一个软件包管理器。但它不是用来安装作为操作系统一部分使用的系统软件包,而是用于安装你自己的个人软件。这意味着如果你使用 conda,你不会不小心损坏你的操作系统。

它还可以创建独立的、自包含的环境,这些环境拥有完全隔离的软件安装。这意味着我可以创建一个快速的一次性环境来测试一些新软件,而不会破坏我的基础环境,甚至可以为不同的项目保留独立的环境,这些项目可能需要(例如)不同版本的 Python 或库。

有些人将 conda 与 pipvirtualenv 混淆。然而,这些仅用于管理 Python 包。它们无法管理可执行文件、C 库等等。

conda 从channel安装软件,channel 是安装包的仓库。使用最广泛的 channel 是 defaults(由最流行的 conda 系统安装器 Anaconda 自动使用)和 conda-forge(一个社区仓库,成千上万的开发者贡献了 conda 包)。

许多组织维护自己的 channel,例如 fastainvidiapytorch

分发版问题

您可能听说过分发版这个术语,就像在 Linux 世界中使用的那样。像 Ubuntu 和 Fedora 这样的分发版提供定期发布的软件包集合,这些软件包经过测试可以协同工作。它们还提供仓库,在测试软件以确保其作为该分发版的一部分正常工作后,会在其中提供新版本的软件。

Anaconda 和 defaults channel 也是一个分发版。Anaconda 定期发布其主要安装器的新版本,以及一组经过测试可以协同工作的软件包。此外,他们在软件发布之间继续测试新版本的软件包,准备好后将其添加到 defaults channel。

defaults channel 中的许多软件包源自 conda-forge。conda-forge 本身不是一个分发版,而是一个仓库,任何用户都可以在其中上传用于构建软件的“配方”,并提供构建结果。Anaconda 采用这些软件包的一个子集,以及他们自己打包的软件和其他合作伙伴打包的软件,对这些软件包的组合进行额外的集成测试,然后在他们的分发版中提供它们。

这个系统在许多情况下都运作良好。需要最新版本软件或在 defaults channel 中不可用的软件包的用户可以直接从 conda-forge 安装,而需要分发版的便利性和可靠性的用户可以直接从 defaults 安装软件。

然而,许多 Python 库不在 defaults 或 conda-forge channel 中,或者根本不在任何 channel 中。此外,conda-forge 现在变得非常庞大(这得益于它的巨大成功!),以至于当我试图安装使用 conda-forge 的软件时,我不得不等待两天以上,让 conda 解析依赖项。(有一个快得多的 conda 替代品,名为 mamba,但它尚未功能完善,目前无法正确安装 PyTorch。)

使用 GPU 的库是一个特别的问题,因为 conda-forge 尚未提供构建和测试支持 GPU 的软件的设施。此外,GPU 库特别难以正确打包,需要与 CUDA、cudnn、Python 和 OS 的许多版本组合协同工作。有一个依赖 PyTorch 的庞大软件生态系统,PyTorch 团队在每次发布之前都建立了大量集成测试。PyTorch 也有自己构建软件的自定义框架,生成的包可以自动识别适合每个用户的安装程序。

这些问题导致安装该生态系统中的软件包需要复杂的命令,例如当前安装 NVIDIA 强大的 RAPIDS 软件所需的此命令:

conda create -n rapids-21.06 -c rapidsai -c nvidia -c conda-forge \
    rapids-blazing=21.06 python=3.7 cudatoolkit=11.0

正如 Aman Arora 雄辩地解释的那样,运行此命令会创建一个新的环境,其中不包含我们之前安装的任何其他软件,并且没有提供保持软件最新状态的机制。以这种方式组合多个 channel 时,版本不匹配非常常见,因此向该环境添加其他软件包变得复杂。

我想创建依赖于 RAPIDS 的软件包,但没有真正的方法让用户能够轻松地安装和更新此类软件包。

我听到很多开发者告诉数据科学家,他们应该为每一个单独的项目创建新的 docker 或 conda 环境,并说这是避免这些问题的正确方法。然而,这就像告诉人们,每想使用一个应用程序就安装一个新的操作系统一样。想象一下,如果你不能同时运行 Chrome 和 vscode,而必须为每个程序切换到一个新环境!我们需要能够在同一个地方、同时安装我们工作所需的所有软件和库。我们需要能够同时使用它们,并进行维护。

解决方案:一个新的分发版

为了避免这些问题,我们创建了一个新的 channel 和分发版,名为fastchan。fastchan 包含安装 fastai、PyTorch、RAPIDS 等等所需的所有依赖项。我们使用 PyTorch 官方构建的 PyTorch,NVIDIA 官方构建的 RAPIDS 和 CUDA Toolkit 等等。这些软件包的开发者花费了大量时间以最佳方式打包他们的软件,所以我们认为最好是利用他们的工作,而不是从零开始。

对于仅在 conda-forge 上可用的库和依赖项,我们将这些复制到 fastchan channel 中。我们使用一个鲜为人知但非常有用、名为 copy 的 Anaconda 命令,它用于在 channel 之间复制软件包。

fastchan 使用 conda 自己的依赖项解析器来递归地找出所有必需的依赖项。我们只包含那些 defaults channel 中尚不可用的依赖项。这是因为 defaults 在 Anaconda 中默认已使用,所以我们不需要重复已有的内容。

此外,我们打包了一些目前仅在 pypi 上作为 pip 包提供的软件。我们使用几种方法来完成此任务。一种是使用澳大利亚同胞 Chris Billington 开发的极好的 setuptools-conda 软件。另一种是我们编写的一个新的 build.py 程序,它用于编译后的软件,例如 sentencepiece 和 OpenCV。

得益于这些GitHub Actions 工作流,软件包每天自动构建和复制两次。

结果

所有这些努力的结果是,您只需依赖 defaults 和 fastchan channel 即可安装您几乎所需的一切,特别是如果您在使用 PyTorch 和 Hugging Face 生态系统中的软件。比安装更重要的是更新——现在您可以使用一个命令一次性更新所有软件包!要自动处理这一切,请创建一个包含以下内容的 ~/.condarc 文件:

channels:   
  - fastchan
  - defaults

然后您只需使用 conda installconda upgrade,甚至无需传递 -c fastchan。如果您运行 conda upgrade --all,您的整个环境将完全更新到最新状态(类似于使用 sudo apt upgrade 来保持 Ubuntu 安装最新)。

未来工作

我希望 fastchan 对于考虑 Python 打包和部署的人来说,将是一个有用的起点。还有很多可以改进的地方。例如,目前 fastchan 提供的唯一保证是所提供的软件包可以正确地一起安装。它实际上并不检查它们是否正常工作。理想情况下,应该在 CPU 和 GPU 上都运行集成测试,以确保同时使用这些库的代码能产生预期结果。

如果有一种社区驱动的方式,让任何人都可以请求将软件包添加到 fastchan,并添加他们自己的集成测试,那也将是非常好的。集成测试尤其重要,以确保没有人添加或更改导致依赖软件包损坏的软件包(或者至少确保损坏的下游软件包被明确标记)。

fast.ai 的使命是让深度学习更易于访问,它并不是一个明显的 conda 分发版所在地。我们创建 fastchan 是因为我们自己和我们的用户需要它。希望未来 PyTorch、NVIDIA、Anaconda 和 conda-forge 等主要参与者能一起解决分发版问题,并让 fastchan 过时!