JuiceFS 在多云架构中加速大模型推理
在大模型的开发与应用中,数据预处理、模型开发、训练和推理构成四个关键环节。本文将重点探讨推理环节。在之前的博客中,社区用户 BentoML 和贝壳的案例提到了使用 JuiceFS 社区版来提高模型加载的效率。本文将结合我们的实际经验,详细介绍企业版在此场景下的优势。
下图是一个典型的大模型推理服务的架构。我们可以观察到几个关键特点。首先,架构跨越多个云服务或多个数据中心。目前在大模型领域, GPU 资源紧张,多数厂商或公司倾向于采用多云、多数据中心或混合云的策略来部署他们的推理服务。
另一个特点是,为了确保数据一致性和管理的便捷性,会在特定地区选择公有云的对象存储作为所有模型数据的存储点。当进行推理任务调度时,可能会选取特定云服务进行任务调度。数据模型的拉取过程需要人工介入,如提前进行数据拷贝。这是因为调度系统不清楚当前数据中心具体需要哪些数据,而这些数据又是动态变化的,所以数据拷贝过程会带来额外成本。
此外,从每个推理计算集群的内部情况来看,由于是规模庞大的集群,会有数百到数千 GPU 卡,因此在推理服务器初始化时,会有高并发模型数据拉取需求。
因此,概括地说在大模型推理与存储相关的挑战主要集中这样几个方面:高效访问数据、跨区域数据快速分发、存量数据读取以及资源优化。接下来将逐个为大家介绍我们在这些场景中的实践经验。
挑战 1:如何保证大模型数据的高吞吐、高并发读取?
推理环节常需处理百 GB 级别的模型文件,满足高并发顺序读取需求。加载速度是用户最关注的问题之一。
为了满足这种场景的性能需求,可以借助 JuiceFS 企业版的分布式缓存构建大规模的缓存空间。将常用模型数据集中存储在缓存集群中,能显著提高数据读取速度,特别是在同时启动数千个推理实例时。此外,对于需要频繁切换模型的 AI 应用场景,如 Stable Diffusion 文生图服务,缓存集群可以大幅减少模型加载时间,从而直接提升用户体验。
例如在单机单卡加载 Safetensors 格式的 Stable Diffusion 模型时,从缓存集群读取数据的延迟可低至 0.5ms,而从对象存储读取的延迟通常在 20ms 左右, 性能提升了将近 40 倍。
下图是 JuiceFS 分布式缓存的架构图,上层为推理集群,中间层为 JuiceFS 缓存集群,底层为对象存储,右上角是元数据服务。在推理服务部署后,首先通过推理集群上挂载的 JuiceFS 访问所需的模型数据。如果数据可以在推理集群的本地内存缓存中找到,则直接使用;若未命中,则查询位于中间的缓存集群。缓存集群如果也未命中,最后会从对象存储读取数据。
虽然推理集群和缓存层从图上看似乎是分开的两个层次,但在实际应用或部署中,如果GPU 机器上有 NVMe SSD,这两层可以合并。
在每个 GPU 机器都配备多块 SSD 的情况下,下图示例中,每个 GPU 机器配有三块 SSD,其中一块 SSD 用作本地缓存,其余两块 SSD 则用作分布式缓存的存储盘。这种情况下,我们推荐一个部署方式:在一个 GPU 服务器上部署两个客户端,FUSE daemon 和缓存集群客户端。当推理任务需要读取数据时,它首先会尝试从本地 FUSE 挂载点读取数据。如果本地缓存中没有相应的模型数据,推理任务将通过同一台机器上的另一个 JuiceFS 客户端访问分布式缓存。完成数据读取后,数据将返回给推理任务,并在缓存集群管理的两块 SSD 及本地 FUSE 挂载点上缓存,以便未来快速访问。
这种在一个 GPU 服务器上部署两个客户端的做法有两个主要好处:
- 首先,通过本地缓存,可以尽量减少网络通信的开销,虽然 GPU 服务器间通过高速网卡进行网络通信,但网络通信本身还是会产生大量的开销;
- 其次,通过缓存集群客户端,可以让推理任务访问其它 GPU 服务器上的数据,实现一个分布式缓存集群的效果。
挑战 2:如何在多云、混合云架构中有效地分发模型数据到各计算节点?
在多云和混合云架构中,由于数据分散在不同的云平台和数据中心,传统的手动介入、拷贝和迁移方法不仅成本高,而且管理和维护也较为复杂,包括权限控制在内的各种问题都十分棘手。
JuiceFS 企业版镜像文件系统功能允许用户将数据从一个地区复制到多个地区,形成一对多的复制关系。整个复制流程对用户和应用来说是透明的:只需将数据写入指定区域,系统便会自动规划并复制到其它多个区域。
下图展示了在镜像文件系统中数据写入与数据读取时的流程。图中展示了两个区域:源区域和镜像区域。当数据在源区域写入时,JuiceFS 会自动将数据从源区域复制到镜像区域。
在读取数据时,镜像区域的客户端首先尝试从其所在区域的对象存储中拉取数据。如果数据不存在或因同步延迟未到达,则自动回退到源区域存储,通过备用数据源链路拉取数据。因此,镜像区域的所有客户端最终都能访问到数据,虽然部分数据可能来自备用数据源。
写数据流程示例
这里展示了一个大模型企业实际部署镜像文件系统的案例,其架构与文章开头展示的典型架构图相似。在图的顶部有一个中心集群,该集群作为数据生产的源头。
- 步骤 1:写数据。数据首先在中心集群中被创建并写入;
- 步骤 2:全量镜像元数据。数据生产完成后,将写入到 JuiceFS 中,触发元数据的全量镜像流程。如图所示,数据从中心的 JuiceFS 元数据服务被镜像到一个或多个边缘集群(本例中为三个),使得边缘集群能够就近访问本地集群内的元数据;
- 步骤 3:预热缓存(可选)。这一步是为了优化数据访问速度。当有新数据添加后,除了复制元数据外,还希望能够就近访问这些数据。在没有对象存储的环境中,可以结合分布式缓存功能,在每个机房内部署一个分布式缓存集群。然后通过缓存预热,将新增的数据复制到每个边缘集群的缓存集群中,从而加速数据访问。
读数据流程示例
- 步骤 1:访问镜像的元数据服务。如上图绿色编号所示,当 GPU 集群需要获取模型数据时,首先会访问镜像的元数据服务;
- 步骤 2:读取元数据并获取数据。在读取到元数据后,客户端会首先尝试通过机房内的缓存集群获取所需数据。如果之前进行了缓存预热,那么大多数情况下可以直接在机房内的缓存集群中命中所需的模型数据;
- 步骤 3:回源数据。如果由于某种原因未能在缓存集群中找到数据,也无需担心,因为所有缓存集群的节点都会自动回源至中心的对象存储桶中获取最终的原始数据。
因此,整个数据读取流程是畅通无阻的。即使部分数据未被预热或新数据尚未预热成功,也可以通过自动回源的方式,从中心的 JuiceFS 存储桶中拉取数据。
挑战 3:低成本高效读取海量存量数据
除了多云、混合云架构下数据分发的挑战,还有一个常见的需求,在与多家大模型公司的交流中,我们了解到许多公司希望将其积累的大量原始数据(如数 PB 级别)直接迁移到 JuiceFS 中。这种需求增加了大规模数据管理的复杂性,并可能需要进行数据双写等调整,这些都可能影响业务流程的正常运作。
JuiceFS 企业版的「导入对象存储元数据」功能使得企业可以更高效地完成数据导入,同时减少对业务的侵入性。用户无需进行数据拷贝,只需持续导入元数据即可。同时,导入的数据可以通过 JuiceFS 的分布式缓存进行加速,从而提升数据访问速度。下图是该功能的工作流程示意图:
第一步,导入元数据。通过 JuiceFS 的命令行工具,用户可以选择性地导入原始数据桶中的部分数据,而不必导入整个存储桶。这一过程主要通过前缀匹配实现,此步骤仅涉及元数据的导入,不拷贝对象存储中的数据,因此导入流程会很快完成。
元数据导入不是一次性的操作,随着原始数据的增加或修改,用户可以再次执行增量导入,无需担心重复导入造成额外开销。每次增量导入时,系统只会导入新增或修改的部分数据的元数据,不会重复导入已处理的文件,从而避免额外负担。
第二步,读取元数据。当元数据导入到 JuiceFS 后,应用(例如推理任务)便能通过 JuiceFS 客户端访问这些导入的数据。因此,应用可以立即开始执行,无需等待原始数据桶中的数据拷贝到 JuiceFS 中。
第三步,读取数据。在推理等场景中,通常会配置分布式缓存以优化数据读取。由于在第一步中仅导入了元数据而未导入实际数据,初次通过分布式缓存读取时将无法直接获取数据。
第四步,回源原始桶并缓存数据。这一步需要通过分布式缓存系统回源到原始数据桶中,从中检索并读取数据。读取完成后,数据会自动缓存到 JuiceFS 的分布式缓存中,这样在后续访问相同数据时,就无需重新回到原始数据桶中进行数据读取,从而提高数据访问效率。
经过这几个步骤,推理任务便能够快速访问存量数据,并获得高性能分布式缓存的加速效果。
挑战 4:在异构环境中,如何充分利用硬件资源以优化存储和计算性能?
异构环境涉及到一个系统内部集成多种不同类型或配置的硬件设备,只有充分利用异构的硬件资源才能为企业带来最大价值。在下面这个示例中,我们有三台机器,每台机器配备的 SSD 数量和容量如下表所示,根据每台机器的总存储容量,这三台机器的缓存容量比例为 1:2:3。
编号 | SSD 数量 | 单块 SSD 容量(TB) | 总容量(TB) |
---|---|---|---|
机器 1 | 2 | 4 | 8 |
机器 2 | 2 | 8 | 16 |
机器 3 | 3 | 8 | 24 |
默认情况下,JuiceFS 的分布式缓存假设所有机器的硬件配置是同构的,因此所有缓存节点的权重相同。在这种配置下,整个系统的性能将被最小容量机器的容量上限所限制,在这个示例中是 8TB,其它机器缓存盘无法被充分利用,第三台机器中甚至有 ⅔ 可能未被利用。
为了避免这种情况,我们引入了「缓存节点权重」的概念,允许用户根据实际环境动态或静态地调整每个 GPU 节点的权重。例如,第一台 GPU 服务器的缓存权重可以设置为默认值 100,第二台为 200,第三台为 300,这些权重与 SSD 容量的比例(1:2:3)相对应。通过这种差异化权重设置,可以更有效地利用各缓存机器的存储资源,优化整体系统的性能。这种方法为处理不同硬件配置的机器提供了一个典型的解决方案。
除了上述这个场景外,缓存节点权重还可以应用于其它场景。例如,GPU 机器容易出现故障,用户可能每周需要对一两台机器进行下线和更换硬件等常规运维操作。因机器直接停机将导致该机器上的缓存数据丢失或暂时无法访问,这可能影响整个缓存集群的命中率。在这个场景中,也可以使用「缓存节点权重」功能,来尽可能减少机器故障或维护过程中对缓存集群利用率的影响。
未来展望
最后,让我们探讨一下未来我们在推理场景以及其它潜在应用场景中将要进行哪些改进。
首先,引入分布式缓存的多副本特性。目前,分布式缓存系统中的数据通常是单副本形式,意味着如果某台机器(如 GPU 服务器)意外宕机,该机器上的缓存数据将因缺乏备份而丢失,从而直接影响缓存命中率。由于这种情况是突发的,我们无法通过人工干预来逐步迁移数据至其它节点。
在这种背景下,单副本缓存将不可避免地影响整个缓存集群的效率。因此,我们正在考虑将其从单副本升级为多副本。这种升级的好处显而易见:尽管使用了更多的存储空间,但是可以显著提高机器频繁故障场景的缓存命中率和缓存的可用性。
第二点,我们正在探索用户态客户端的实现。当前,基于 FUSE 挂载方式的文件系统虽然能有效地实现文件系统功能,但由于其依赖 Linux 系统内核,涉及用户态与内核态之间的多次切换和数据拷贝,因此带来了一定的性能开销。尤其在云上的无服务器(serverless)和 Kubernetes 环境中,FUSE 挂载可能无权限使用,这限制了 JuiceFS 的应用场景。
因此,我们正在考虑开发一个纯用户态的客户端,这将是一个不依赖内核态的组件,可以显著降低使用门槛,并在不支持 FUSE 的环境中提供服务。此外,由于避免了内核态与用户态的频繁切换和内存拷贝,这种客户端在性能上也可能有显著提升,特别是在需要高吞吐量的 GPU 密集型环境中。
然而,这种客户端的一个潜在缺点是它可能不如 POSIX 接口透明,因为它可能需要用户通过引入特定的库(如 JuiceFS 库)来实现功能,这种方式可能会对应用程序产生一定的侵入性。
第三,提升可观测性。鉴于 JuiceFS 架构中包含多个复杂环节,如从 GPU 机器到缓存集群,再通过专线回到中心的对象存储,以及缓存预热等,我们计划引入更便捷的工具和方法来增强整体架构的可观测性。这将有助于 JuiceFS 的用户更快更方便地定位及分析问题。未来我们将进一步优化包括分布式缓存在内的各个组件的可观测性,帮助用户在出现问题时进行快速的问题排查和解决。
希望这篇内容能够对你有一些帮助,如果有其他疑问欢迎加入 JuiceFS 社区与大家共同交流。
相关文章:

JuiceFS 在多云架构中加速大模型推理
在大模型的开发与应用中,数据预处理、模型开发、训练和推理构成四个关键环节。本文将重点探讨推理环节。在之前的博客中,社区用户 BentoML 和贝壳的案例提到了使用 JuiceFS 社区版来提高模型加载的效率。本文将结合我们的实际经验,详细介绍企…...

【DCL】Dual Contrastive Learning for General Face Forgery Detection
文章目录 Dual Contrastive Learning for General Face Forgery Detectionkey points:贡献方法数据视图生成对比学习架构实例间对比学习实例内对比学习总损失函数实验实验细节定量结果跨数据集评估跨操作评估消融实验可视化Dual Contrastive Learning for General Face Forgery…...
https的特点
https的特点 优点:缺点:HTTPS是如何保证安全的? 优点: 使用HTTPS协议可以认证用户和服务器,确保数据发送到正确的客户端和服务器;使用HTTPS协议可以进行加密传输、身份认证,通信更加安全、防止…...
〖open-mmlab: MMDetection〗解析文件:mmdet/models/losses/cross_entropy_loss.py
目录 深入解析MMDetection中的CrossEntropyLoss及其应用1. 概述2. 核心函数2.1 cross_entropy2.1.1 函数定义和参数说明2.1.2 函数体2.1.3 总结 2.2 binary_cross_entropy2.2.1 _expand_onehot_labels函数2.2.2 binary_cross_entropy函数2.2.3 总结 2.3 mask_cross_entropy2.3.…...
【PyTorch单点知识】torch.nn.Embedding模块介绍:理解词向量与实现
文章目录 0. 前言1. 基础介绍1.1 基本参数1.2 可选参数1.3 属性1.4 PyTorch源码注释 2. 实例演示3. embedding_dim的合理设定4. 结论 0. 前言 按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但…...

Jedis 操作 Redis 数据结构全攻略
Jedis 操作 Redis 数据结构全攻略 一 . 认识 RESP二 . 前置操作2.1 创建项目2.2 关于开放 Redis 端口的问题2.2.1 端口转发?2.2.2 端口配置 2.3 连接到 Redis 服务器 三 . 通用命令3.1 set 和 get3.2 exists 和 del3.3 keys3.4 expire、ttl、type 三 . string 相关命令3.1 mse…...

ctf.show靶场ssrf攻略
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 web351 解析:post传入url参数他就会访问。 解法: hackbar传入url参数写入https://127.0.0.1/flag.php web352 解析:post传入url参数,不能是127.0.0.1和localhost 解法:缩写127.1传入 web353 解析…...
在 PyTorch 中,如何使用 `pack_padded_sequence` 来提高模型训练的效率?
在PyTorch中,pack_padded_sequence 是一个非常有用的函数,它可以用来提高模型训练的效率,特别是在处理变长序列数据时。这个函数的主要作用是将填充后的序列数据打包,以便循环神经网络(RNN)可以更高效地处理…...
Gossip协议
主要用在Redis Cluster 节点间通信 Gossip协议,也称为流行病协议(Epidemic Protocol),是一种在分布式系统中用于信息传播和故障探测的算法。 一、工作原理 随机选择传播对象 每个节点会定期随机选择一些其他节点作为传播对象。这…...
数据结构————双向链表
内存泄漏: 内存泄漏(Memory Leak)是指程序中已动态分配的内存由于某种原因程序未释放或无法释放,导致系统内存的浪费,严重时会导致程序运行缓慢甚至崩溃。这种情况在长时间运行的程序或大型系统中尤为常见,…...
55 - I. 二叉树的深度
comments: true difficulty: 简单 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9855%20-%20I.%20%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%B7%B1%E5%BA%A6/README.md 面试题 55 - I. 二叉树的深度 题目描述 输入一棵二叉树的根节点…...

Redis——初识Redis
初识Redis Redis认识Redis 分布式系统单机架构为什么要引入分布式理解负载均衡数据库的读写分离引入主从数据库 引入缓存数据库分库分表业务拆分——微服务常见概念了解 Redis背景介绍特性应用场景Redis不能做的事情Redis客户端redis客户端的多种形态 Redis 认识Redis 存储数…...

Xshell or Xftp提示“要继续使用此程序,您必须应用最新的更新或使用新版本”
Xshell提示“要继续使用此程序,您必须应用最新的更新或使用新版本”,笔者版本是xshell 6 方法一:更改系统时间 对于Windows 10用户,首先找到系统日期,右键点击并选择“调整时间/日期”。将日期设定为上一年。完成调整后&#x…...

table用position: sticky固定多层表头,滑动滚动条border边框透明解决方法
问题:我发现,这个上下滑动有内容经过就会出现如图的情况。 解决的方法:用outline(轮廓)替代border,以达到我们想要的样式。 outline主要是在元素边框的外围设置轮廓,outline不占据空间,绘制于…...

基于飞桨paddle2.6.1+cuda11.7+paddleRS开发版的目标提取-道路数据集训练和预测代码
基于飞桨paddle2.6.1cuda11.7paddleRS开发版的目标提取-道路数据集训练和预测代码 预测结果: 预测影像: (一)准备道路数据集 下载数据集地址: https://aistudio.baidu.com/datasetdetail/56961 mass_road.zip …...
数学建模笔记—— 整数规划和0-1规划
数学建模笔记—— 整数规划和0-1规划 整数规划和0-1规划1. 模型原理1.1 基本概念1.2 线性整数规划求解1.3 线性0-1规划的求解 2. 典型例题2.1 背包问题2.2 指派问题 3. matlab代码实现3.1 背包问题3.2 指派问题 整数规划和0-1规划 1. 模型原理 1.1 基本概念 在规划问题中&am…...

[001-03-007].第26节:分布式锁迭代3->优化基于setnx命令实现的分布式锁-防锁的误删
我的博客大纲 我的后端学习大纲 1、问题分析: 1.1.问题: 1.锁的超时释放,可能会释放其他服务器的锁 1.2.场景: 1.如果业务逻辑的执行时间是7s。执行流程如下 1.index1业务逻辑没执行完,3秒后锁被自动释放。2.index…...

【Unity踩坑】为什么有Rigidbody的物体运行时位置会变化
先上图,不知你有没有注意过这个现象呢? 一个物体加上了Rigidbody组件,当勾选上Use Gravity时,运行后,这个物体的位置的值会有变化。这是为什么呢? 刚体由物理系统处理,因此它会对重力、碰撞等做…...

NGINX开启HTTP3,给web应用提个速
环境说明 linuxdockernginx版本:1.27 HTTP3/QUIC介绍 HTTP3是由IETF于2022年发布的一个标准,文档地址为:https://datatracker.ietf.org/doc/html/rfc9114 如rfc9114所述,http3主要基于QUIC协议实现,在具备高性能的同时又兼备了…...
秋招季!别浮躁!
好久没写了,今天兴致来了,众所周知我一旦想说话,就来这里疯狂写。 最近,我去了一家国企的研究院,听着是不是贼高大上,呵——这玩意儿把我分配到三级机构,我一个学计算机的,它不把我…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...