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 配置文件,然后根据这个配置文件在其他设备上重建虚拟环境。

# 导出配置好的环境配置
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 是基于云的文件系统,底层的对象存储和数据库都是网络资源,读和写都会有一定的时延。对性能敏感的读者可以通过以下方式进行优化和调整:

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

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

总结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot】31 Session + Redis 实战

Gitee https://gitee.com/Lin_DH/system 介绍 【SpringBoot】30 Cookie、Session、Token https://blog.csdn.net/weixin_44088274/article/details/144241595 背景 Spring Session 是 Spring 的一个子项目,它提供了一种管理用户会话信息的方法,无论…

关于网站的权重和百度蜘蛛爬虫的关系

网站的权重和百度蜘蛛爬虫的关系是密切关联的。 网站权重是一个衡量网站在搜索引擎中重要性的概念,它反映了网站在搜索引擎算法中的相对重要程度。而百度蜘蛛爬虫则是百度搜索引擎用来抓取网页内容的工具,通过分析网页的URL、内容、链接等因素来评估网站…

游戏引擎学习第35天

开场介绍 今天的任务是继续改进一个虚拟的瓦片地图系统,使其适合处理更大的世界。我们希望这个系统能管理大范围的游戏世界,其中包含按需存储的小区域。昨天,我们介绍了“内存区域”的概念,用于管理持久性存储。我们计划今天继续…

Leetcode经典题5--轮转数组

题目描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 输入输出示例 : 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右…

【JS】简单CSS简单JS写的上传进度条

纯JS写的&#xff0c;简单的上传进度条&#xff0c;当上传的文件较大&#xff0c;加一个动态画面&#xff0c;就不会让人觉得出错了或网络卡了 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"v…

2023 年“泰迪杯”数据分析技能赛B 题企业财务数据分析与造假识别

2023 年“泰迪杯”数据分析技能赛B 题企业财务数据分析与造假识别 一、背景 财务数据是指企业经营活动和财务结果的数据记录&#xff0c;反映了企业的财务状况与经营成果。对行业、企业的财务数据进行分析&#xff0c;就是要评价其过去的经营业绩、衡量现在的财务状况、预测未…

perl Window安装教程

perl Window安装教程 下载地址 https://platform.activestate.com/tangxing806/ActivePerl-5.28/distributions 运行state-remote-installer.exe 按下图截图步骤 检查perl版本 参考文献&#xff1a; perl安装教程

知识图谱9:知识图谱的展示

1、知识图谱的展示有很多工具 Neo4j Browser - - - - 浏览器版本 Neo4j Desktop - - - - 桌面版本 graphX - - - - 可以集成到Neo4j Desktop Neo4j 提供的 Neo4j Bloom 是用户友好的可视化工具&#xff0c;适合非技术用户直观地浏览图数据。Cypher 是其核心查询语言&#x…

【数据分享】1901-2023年我国省市县三级逐年最低气温数据(Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月最低气温栅格数据和Excel和Shp格式的省市县三级逐月最低气温数据&#xff0c;原始的逐月最低气温栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据&#xff01;基于逐月栅格数据我们采用求年平均值的方法得到逐年最…

HBU深度学习实验15-循环神经网络(2)

LSTM的记忆能力实验 飞桨AI Studio星河社区-人工智能学习与实训社区 (baidu.com) 长短期记忆网络&#xff08;Long Short-Term Memory Network&#xff0c;LSTM&#xff09;是一种可以有效缓解长程依赖问题的循环神经网络&#xff0e;LSTM 的特点是引入了一个新的内部状态&am…

使用windows的包管理工具chocolatey

开发人员&#xff0c;在windows环境下&#xff0c;最头疼的是安装和配置各种环境变量&#xff0c;现在chocolatey 可以一键安装&#xff0c;不需要再去配置环境变量了。比如你安装一个java的环境&#xff0c;仅仅需要你敲几个命令&#xff0c;都能帮你搞定。 我自己已经使用这…

VTK知识学习(21)- 数据的读写

1、前言 对于应用程序而言&#xff0c;都需要处理特定的数据&#xff0c;VTK应用程序也不例外。 VTK应用程序所需的数据可以通过两种途径获取: 第一种是生成模型&#xff0c;然后处理这些模型数据(如由类 vtkCylinderSource 生成的多边形数据); 第二种是从外部存储介质里导…

QT 中 QString 转换为 Unicode 和 ASCII 的方法

目录 ​编辑 前言 一、QString转换成 Unicode编码 二、QString转换成ASCII编码 三、Unicode编码转换成QString汉字 四、ASCII编码转成QString 五、注意事项 六、总结 前言 在 Qt 开发中&#xff0c;经常会遇到需要将QString中的字符转换为特定编码格式的需求。本文将介…

基于51单片机64位病床呼叫系统设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机病床呼叫系统设计( proteus仿真程序设计报告原理图讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0095 1. 主要功能&#xff1a; 基于51单片机的病床呼叫系统proteus仿…

【OpenDRIVE_Python】使用python脚本更新OpenDRIVE数据中路口Junction名称

示例代码说明&#xff1a; 遍历OpenDRIVE数据中每个路口JunctionID,读取需要变更的路口ID和路口名称的TXT文件,若JunctionID与TXT文件中的ID一致&#xff0c;则将TXT对应的点位名称更新到OpenDRIVE数据中Junction name字段。补充&#xff1a;需要保持TXT和OpenDRIVE数据文件编…

java+ssm+mysql商品管理系统

项目介绍&#xff1a; 使用javassmmysql开发的商品库存管理系统&#xff0c;系统包含管理员&#xff0c;员工角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;员工管理&#xff1b;供应商管理&#xff1b;客户管理&#xff1b;商品管理&#xff1b;商品进货&#xf…

android studio创建虚拟机注意事项

emulator 启动模拟器的时候&#xff0c;可以用 AVD 界面&#xff0c;也可以用命令行启动&#xff0c;但命令行启 动的时候要注意&#xff0c;系统有两个 emulator.exe &#xff0c;建议使用 emulator 目录下的那个&#xff01;&#xff01; 创建类型为google APIs的虚拟机可从…

小皮面板(PHPSTUDY)配置多个域名或IP

问题描述 小皮面板默认采用nginx的静态部署&#xff0c;按照使用nginx的习惯只需要额外添加一个server即可&#xff0c;但是会发现直接往配置文件里添加新的server是不生效的&#xff0c;小皮的官网论坛几乎已经停止维护&#xff0c;因此资料较少&#xff0c;原本也没有仔细使…

搭建voiceapi实时语音转录/合成github项目教程【windows版】

github项目地址&#xff1a;https://github.com/ruzhila/voiceapi 项目简介&#xff1a;python实现的基于sherpa-onnx的语音转录/合成API 运行环境&#xff1a;windows、python3.10 1.下载项目 git clone https://github.com/ruzhila/voiceapi.git2.新建环境 注意使用python …

网络编程 | TCP套接字通信及编程实现经验教程

1、TCP基础铺垫 TCP/IP协议簇中包含了如TCP、UDP、IP、ICMP、ARP、HTTP等通信协议。TCP协议是TCP/IP协议簇中最为常见且重要的通信方式之一&#xff0c;它为互联网上的数据传输提供了可靠性和连接管理。 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议…