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 的环境有以下几种共享方法:
environment.yml配置文件共享;conda-pack工具打包;- 直接共享虚拟目录。
方法一:配置文件共享
这种方法是将现有环境中配置、已安装的包、依赖关系、路径等信息导出到 environment.yml 配置文件,然后根据这个配置文件在其他设备上重建虚拟环境。
# 导出配置好的环境配置
conda env export > environment.yml
把配置文件拷贝到目标设备并据此重建虚拟环境:
# 使用配置文件创建虚拟环境
conda env create -f environment.yml
这是 Conda 官方推荐的环境共享方式,它的优势在于可以跨系统、跨架构,因为它共享的是材料清单(而不是材料),在目标设备上只要照着清单安装所需的资源即可。但这种方式对安装了大量包的环境不太友好,需要目标设备重复下载资源,如果网络环境不好的话,难免要多花些时间。
方法二:使用打包工具
这种方法是使用专门的工具来打包虚拟环境,把它所有东西都装到一个压缩包里,这样在目标设备上解压就能使用。
# 需要安装 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回写模式对磁盘的可靠性有一定的要求,因为数据会先写到磁盘缓存再存入对象存储,在写数据时要防止系统断电,避免写不完全。
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 :
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 是基于云的文件系统,底层的对象存储和数据库都是网络资源,读和写都会有一定的时延。对性能敏感的读者可以通过以下方式进行优化和调整:
- 在内网环境中自建数据库和对象存储,尽量让这些资源与设备靠近;
- 为挂载点主机配备更高速的 SSD,让缓存可以写在更快的磁盘上;
- 加大带宽,打破网络接口瓶颈。
另外,读者也可以针对不同的虚拟环境的类型和规模来灵活改变 Conda 虚拟环境共享方法,让 Conda 和 JuiceFS 都在最适合的状态下工作。
总结
本文简要分享了在多机环境下,如何利用 JuiceFS 复用 Conda 虚拟环境的具体方法与注意事项。希望这篇文章中的技巧和经验能够为读者的日常开发和团队协作提供帮助,并提升工作效率。我们鼓励感兴趣的读者亲自动手尝试,并在实践中探索更多的优化方式。
如果您在配置和使用过程中遇到任何问题,欢迎前往 JuiceFS 用户社区进行反馈、提问与交流。您的问题和分享将有助于推动整个社区的进步。
Conda + JuiceFS :增强 AI 开发环境共享能力的更多相关文章
- 5分钟配置好你的AI开发环境
作者 | Revolver 无论是第一次设置TensorFlow的新手数据科学爱好者,还是使用TB级数据的经验丰富的AI工程师,安装库.软件包或者框架总是一个困难又繁琐的过程.但是像Docker这样的 ...
- conda配置python混合开发环境一站式入门【全平台】
下载安装 清华的镜像 [https://mirror.tuna.tsinghua.edu.cn/help/anaconda/] 官方说明 [http://conda.pydata.org/docs/u ...
- 2019-04-03 Anaconda+VSCode搭建python开发环境,并连接GIthub
1.最好的Python开发环境 :Anaconda+VSCode搭建python开发环境,conda提供了python开发环境和大量的你不用安装的库 conda的环境变量: 直接在conda 中下载启 ...
- AI应用开发实战 - 从零开始搭建macOS开发环境
AI应用开发实战 - 从零开始搭建macOS开发环境 本视频配套的视频教程请访问:https://www.bilibili.com/video/av24368929/ 建议和反馈,请发送到 https ...
- XE6移动开发环境搭建之IOS篇(5):解决Windows和虚拟机下Mac OSX的共享问题(有图有真相)
网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 在安装XE6 PAS ...
- [AI开发]centOS7.5上基于keras/tensorflow深度学习环境搭建
这篇文章详细介绍在centOS7.5上搭建基于keras/tensorflow的深度学习环境,该环境可用于实际生产.本人现在非常熟练linux(Ubuntu/centOS/openSUSE).wind ...
- Python开发篇——构建虚拟Python开发环境(Conda+Poetry)
前言 之前虽略有提及Python,但是没有实际地写点料.惭愧,惭愧,所以这次先起个头,讲讲如何构建虚拟Python开发环境.相信之前看过我博客的人可能会想:博主不会又要聊聊Docker吧?放心,不会. ...
- 华为云ModelArts 2.0全面升级,革新传统AI开发模式
[中国,上海,9月20日] 在HUAWEI CONNECT 2019期间,华为云EI服务产品部总经理贾永利宣布--华为云AI重装升级,并重磅发布一站式AI开发管理平台ModelArts 2.0. 现场 ...
- 华为全栈AI技术干货深度解析,解锁企业AI开发“秘籍”
摘要:针对企业AI开发应用中面临的痛点和难点,为大家带来从实践出发帮助企业构建成熟高效的AI开发流程解决方案. 在数字化转型浪潮席卷全球的今天,AI技术已经成为行业公认的升级重点,正在越来越多的领域为 ...
- HUAWEI HiAI亮相华为开发者生态大会 助力应用AI开发实现加速度
6月23日,在2018华为终端·全球合作伙伴及开发者大会AI分论坛体验区的一角,被层层叠叠的人群围得水泄不通.站在最前面的一名体验者,正跟随着“快手短视频”APP上不断出现的小人左右扭动,每完成一个动 ...
随机推荐
- Flutter(able) 的单例模式
文/ 杨加康,CFUG 社区成员,<Flutter 开发之旅从南到北>作者,小米工程师 单例设计模式(Singleton Design Pattern)理解起来非常简单. 一个类只允许创建 ...
- BOOST 环形队列circular_buffer
BOOST库的环形队列比较灵活,前插或后插,删除队首或删除队尾元素,都支持. 只贴代码: #include <boost/circular_buffer.hpp> #include < ...
- 使用 fabric.js 开发移动端 H5 图片编辑器
大家好,我是开源图片编辑器的 https://github.com/ikuaitu/vue-fabric-editor 的作者,它是一款基于 PC 版本的开源图片编辑器. 最近很多开发者咨询,是否可以 ...
- 最好的文件管理器-dolphin
WARN:windows没有,废话少说,直接开始 what's dolphin 长得好看 dolphin使用kde的主题管理,可以通过kde的主题商店配合kvantum manager 配制出一个好看 ...
- bfs 与优先队列————洛谷p1126(历经两个小时总算AC了,哭晕)
机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径 \(1.6\) 米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个 \(N\tim ...
- 如何创建一个Java游戏客户端
创建一个完整的Java游戏客户端示例是一个相对复杂的任务,因为它通常涉及图形用户界面(GUI).事件处理.游戏逻辑等多个方面.为了简化,我将提供一个基于Java Swing的简单游戏客户端示例:一个简 ...
- 八字测算api接口数据示例_奥顺八字测算接口分享
八字测算免费api接口,每日开放时间在早上8点到晚上十点,本api接口完全免费,是奥顺居八字测算网程序内部接口,提供本地调用的,现在免费分享出来,仅供测试. 接口名称:八字精批测算api接口示例 接口 ...
- 【USB3.0协议学习】Topic2·USB3.0的LTSSM分析
一.什么是LTSSM,处于USB层次中的哪个位置? LTSSM是链路训练状态机的简称,位于USB3.0协议的link layer,共有12种状态,在链路的两端,也就是Downstream port和U ...
- WebAssembly C++开发环境搭建
WebAssembly 开发环境搭建 简介 WebAssembly 是一种新的编码方式,可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸 ...
- 使用 Debugger 断点 如果打开了断点调试 就会跳转空白页面
<!DOCTYPE html> <html> <header> <title>test</title> </header> &l ...