Conda + JuiceFS :增强 AI 开发环境共享能力

Conda 是当前 AI 应用开发领域中非常流行的环境和包管理系统,因其能够简单便捷地创建与系统资源相隔离的虚拟环境广受欢迎。

Conda 支持在不同的操作系统上重建相同的工作环境,但在环境共享复用方面仍存在一些挑战。比如,在不同机器上复用相同环境需手动执行多步骤,过程中可能出现依赖不一致的问题。其次,维护多个环境版本并保持同步对快速迭代的项目,操作起来较为繁琐。

作为一个云原生分布式文件系统,JuiceFS 极大地简化了数据和环境的共享过程。开发人员可以将 Conda 环境存储在 JuiceFS,实现环境配置的共享和实时访问。JuiceFS 的跨平台兼容性在多操作系统和云环境之间提供了无缝的数据共享能力,支持复杂的多平台开发需求。

本文将从 Conda 的基本用法开始,一步步为您介绍 Conda 虚拟环境的常用共享方法、存在的问题,以及如何应用 JuiceFS 让环境共享变简单。

Conda 的基本用法

Conda 提供了两个主要版本:一个是预装了大量数据科学和机器学习库的 Anaconda,另一个是更简洁的 Miniconda,仅包含基本的 Python 和 Conda 环境管理工具。

Conda 是开源的跨平台工具,支持在 Linux、Mac 和 Windows 系统上运行。各操作系统的安装方式略有不同,关于 Miniconda 或 Anaconda 的安装细节,请读者参考其官方文档,本文不再赘述。

1. 查看虚拟环境

默认情况下,Conda 会将新虚拟环境的相关数据保存在它的安装目录,可以使用 conda env list 查看详情。如下图,是 Linux 系统中内置的 base 虚拟环境的保存路径。

2. 创建虚拟环境

使用 create 命令创建新虚拟环境,如下图,创建了一个名为 myrag 的虚拟环境。执行命令会有一个提示,确认后瞬间就能完成虚拟环境的创建。

可以看到,新的虚拟环境会保存在 miniconda 的 $base/envs/ 目录中。

3. 激活虚拟环境

使用 activate 可以激活一个虚拟环境,如下图。激活的虚拟环境会有一个 * 标识,终端提示符前面也有虚拟环境的名称。

4. 基本使用

激活虚拟环境以后,利用 conda install 可以安装 Anaconda 仓库中提供的各种包和库。比如,在 myrag 虚拟环境中,当前的 python 版本是 3.12.3。

执行命令安装 conda-forge::python

Python 版本就替换成了 3.13.0

同样的,可以在虚拟环境中安装特定版本的 NodeJS、Rust、Golang、Java 等。通过 conda install 命令安装的包全都存储在虚拟目录中,它与操作系统的是隔离的,安装的包互不影响。

5. 退出虚拟环境

执行 conda deactivate 命令即可退出虚拟环境

虚拟环境复用的挑战

现代开发环境通常复杂且多样化,不仅涉及团队协作中的多人多机情况,每位开发者也可能同时维护多个开发环境。如果在一台设备上配置好的开发环境能够便捷地在其他设备上复用,这将大大节省开发者的时间和精力,同时有效避免因单独配置环境而导致的版本不统一等问题。

一般而言,Conda 的环境有以下几种共享方法:

  1. environment.yml 配置文件共享;
  2. conda-pack 工具打包;
  3. 直接共享虚拟目录。

方法一:配置文件共享

这种方法是将现有环境中配置、已安装的包、依赖关系、路径等信息导出到 environment.yml 配置文件,然后根据这个配置文件在其他设备上重建虚拟环境。

bash 复制代码
# 导出配置好的环境配置
conda env export > environment.yml

把配置文件拷贝到目标设备并据此重建虚拟环境:

bash 复制代码
# 使用配置文件创建虚拟环境
conda env create -f environment.yml

这是 Conda 官方推荐的环境共享方式,它的优势在于可以跨系统、跨架构,因为它共享的是材料清单(而不是材料),在目标设备上只要照着清单安装所需的资源即可。但这种方式对安装了大量包的环境不太友好,需要目标设备重复下载资源,如果网络环境不好的话,难免要多花些时间。

方法二:使用打包工具

这种方法是使用专门的工具来打包虚拟环境,把它所有东西都装到一个压缩包里,这样在目标设备上解压就能使用。

bash 复制代码
# 需要安装 conda-pack 程序
conda install conda-pack

# 打包当前环境
conda pack -n xxx

conda-pack 会将虚拟环境打包成一个 tar.gz 压缩包,拷贝到目标设备,解压即可直接使用。

这种方法可以弥补第一种方法的不足,对于安装了特别多包的环境,复用的效率会更高。但它也存在一些不足,比如环境的变化无法在多台设备之间实时同步。

另外,如果虚拟环境中包含 pip 或 setup.py 安装的包(editable packages),那么它就无法打包这个虚拟环境。

方法三:直接共享虚拟目录

这种方式是直接把 conda 虚拟目录拷贝或共享给其他设备使用,相比之下,这是三种方式当中最简单直接的虚拟环境共享方法。但它的局限和缺点也很明显,因为虚拟环境中的某些文件可能包含硬编码的路径信息,在不同设备上可能是不同的,这就会导致环境无法正常工作。因此这种方法要求共享使用的设备有相同的 CPU 架构和操作系统。

上述复用虚拟环境的方法各有利弊和适合的场景,难说孰优孰劣。但可以确定的是,想要高效的复用环境,离不开一个可靠的数据共享方案。

特别是像 AI 应用这类日新月异变化的项目,开发环境的一致性和高效协作尤为重要,当机器数量很多,而且环境中的资源经常发生变化,且要求全部使用一致的虚拟环境时,就需要引入像 JuiceFS 这样能够便捷提供多设备数据共享能力的专业工具来满足需求。

用 JuiceFS 托管 Conda 虚拟环境

JuiceFS 是云原生的分布式文件系统,利用对象存储作为底层数据存储,并通过独立的数据库管理元数据。这种独特的架构设计,使得分布在不同云端、不同区域的 JuiceFS 客户端能够高效地共享和读写同一份数据。JuiceFS 提供了数据一致性保障,并结合完善的缓存技术,实现数据的可靠存储和高速访问。特别是对可靠性要求较高的多客户端数据共享场景中,JuiceFS 是理想的解决方案。

作为开源、易用且功能强大的分布式文件系统,JuiceFS 能在不同环境中实现数据的高效访问和共享。其低延迟和高并发能力,让开发者能够快速访问和同步 Conda 虚拟环境,显著降低环境配置与同步的时间成本。

在开发环境中引入 JuiceFS,并灵活运用其共享和缓存功能,可以为 Conda 赋予便捷的资源共享能力。

1. 准备 JuiceFS

JuiceFS 是开源软件,任何企业和个人都可以在遵循 Apache 2.0 协议的基础上自由分发使用。

提示:对于性能有更极致要求的用户,还可以选择 JuiceFS 的云服务或私有部署的企业版本,它们由 Juicedata 自研的高性能分布式元数据引擎驱动,可以承载更大规模的数据。

对于使用开源版的用户,只需在业务端就近购买对象存储和数据库(Redis、Postgres、MySQL 等),或是自行搭建这两类资源。

JuiceFS 文件系统的创建非常简单,有需要可以参考官方文档。这里采用社区版客户端,使用本地内网自行搭建的 Redis 和 MinIO 创建一个名为 myjfs 的文件系统(元数据引擎为 redis://192.168.3.18/1 )。

完成了文件系统的创建,接下来需要挂载这个文件系统。挂载位置可以自行决定,这里使用了 -d 选项以守护进程的方式挂载到了 /myjfs 目录,同时开启了 --writeback 回写模式,数据会先写在本地缓存盘并异步写到对象存储,从而获得更快的写速度。

提示:--writeback 回写模式对磁盘的可靠性有一定的要求,因为数据会先写到磁盘缓存再存入对象存储,在写数据时要防止系统断电,避免写不完全。

bash 复制代码
sudo juicefs mount -d --writeback redis://192.168.3.18/1 /myjfs

JuiceFS 是分布式的文件系统,在任何能够访问到这套 Redis 和 MinIO 的主机上都可以使用 JuiceFS 客户端同时挂载这个文件系统。

现在,你可以把 JuiceFS 挂载点当作设备之间的高性能网盘,用来共享 environment.yml 或 conda-pack 导出的压缩包。也可以把 Conda 的默认存储路径设置在 JuiceFS 的挂载点(这里是 /myjfs),让所有设备共享使用目录中的虚拟环境。

2. 修改 Conda 的默认存储路径

Conda 的默认存储路径可以通过修改配置文件来变更,Linux 或 macOS 系统位于 ~/.condarc ,Windows 位于 C:\Users\用户名\.condarc,该文件会在首次执行 conda config 命令时自动创建。

可以手动修改配置文件中的 envs_dirs 数组,定义所有可用的虚拟环境存储路径。也可以执行命令修改,比如将路径修改为 /myjfs/conda

bash 复制代码
conda config --add envs_dirs /myjfs/conda

接下来再创建虚拟环境,就会存储到 JuiceFS 上面。

同样的,可以把已经创建的虚拟环境目录拷贝到 JuiceFS 上面直接使用。

3. 善用 warmup 加速使用

在其它主机上复用 Conda 环境时,挂载文件系统以后,可以使用 JuiceFS 提供的 warmup 命令来预先将相关的目录预热到本地,从而加快访问。如下图,是将整个 /myjfs/conda 目录都执行了预热。

4. 注意事项

对于目录共享和工具导出方式的虚拟环境,不同 CPU 架构系统创建的 Conda 虚拟环境之间不能复用。这是因为虚拟环境中安装的软件包是针对特定的 CPU 架构进行编译的。

如下图,窗口上方的系统是 x86_64 架构的,虽然它可以激活共享的虚拟环境,但却无法执行环境中的程序。因为这个虚拟环境是在窗口下方的 aarch64 架构系统上创建的,二者无法共用。

5. 其他问题

在使用 JuiceFS 作为 Conda 虚拟环境存储路径时,你会发现读写速度没有本地磁盘那么快。根本原因在于 JuiceFS 是基于云的文件系统,底层的对象存储和数据库都是网络资源,读和写都会有一定的时延。对性能敏感的读者可以通过以下方式进行优化和调整:

  1. 在内网环境中自建数据库和对象存储,尽量让这些资源与设备靠近;
  2. 为挂载点主机配备更高速的 SSD,让缓存可以写在更快的磁盘上;
  3. 加大带宽,打破网络接口瓶颈。

另外,读者也可以针对不同的虚拟环境的类型和规模来灵活改变 Conda 虚拟环境共享方法,让 Conda 和 JuiceFS 都在最适合的状态下工作。

总结

本文简要分享了在多机环境下,如何利用 JuiceFS 复用 Conda 虚拟环境的具体方法与注意事项。希望这篇文章中的技巧和经验能够为读者的日常开发和团队协作提供帮助,并提升工作效率。我们鼓励感兴趣的读者亲自动手尝试,并在实践中探索更多的优化方式。

如果您在配置和使用过程中遇到任何问题,欢迎前往 JuiceFS 用户社区进行反馈、提问与交流。您的问题和分享将有助于推动整个社区的进步。