当前位置: 首页 > news >正文

Prompt 焚诀——一个模板,终结你和 AI 的所有沟通问题确

AI训练存储选型的演进路线

第一阶段:单机直连时代

早期的深度学习数据集较小,模型训练通常在单台服务器或单张GPU卡上完成。此时直接将数据存储在训练机器的本地NVMe SSD/HDD上。

其优势在于IO延迟最低,吞吐量极高,也就是“数据离计算最近”。缺点也很明显:

数据孤岛:多台机器无法共享数据,数据拷贝(scp/rsync)及其耗时。

容量受限:本地磁盘容量有限。

数据安全:数据没有冗余,机器或盘挂了,数据可能就丢了。

第二阶段:传统共享存储时代(NFS/NAS)

到后来开始团队协作,训练规模也变大,则需要多机多卡分布式训练,同时出于使用方便,大家希望像操作本地文件一样操作共享数据。

此时开始以NFS(Network File System)挂载传统的NAS存储阵列来使用。

其优势在于POSIX兼容,不需要修改PyTorch/TensorFlow代码,直接读写文件路径,共享也十分便利,所有节点看到的目录结构一致。缺点则在于元数据性能瓶颈,NFS在处理海量小文件的open,lookup操作时,元数据服务器可能被瞬间打死。另外,所有计算节点抢占同一个NAS的出口带宽,也可能导致GPU等待IO,造成GPU无法维持高使用率。

第三阶段:大数据融合时代(HDFS)

Google等大厂入局,Hadoop诞生。数据存储在HDFS上,通过一些软件层面的优化将大量小图片打包成大文件,变成“顺序读”,训练代码通过API读取。这样就能够极大地利用HDFS的设计初衷:吞吐量极高、大规模顺序读,同时还能利用现成的大数据基础设施。

但同样有缺点:

生态割裂:PyTorch对HDFS支持不如TensorFlow友好。

随机访问差:对于需要频繁Shuffle(随机打乱)的数据集,HDFS性能不佳。

Java开销:HDFS客户端通常较重,占用CPU资源

第四阶段:高性能并行文件系统(HPC/Parallel FS)

此时的AI领域进入超算时代,模型越来越大,对低延迟和超高带宽的要求极高。

此时的方案是借用超算(HPC)领域的Lustre或GPFS(IMB Spectrum Scale)。优点在于专为高并发设计,可以轻松喂饱数千张GPU,支持POSIX,且元数据性能极强。缺点则在于贵,运维难(Lustre等系统内合级调优十分困难,一旦集群崩溃,恢复十分困难),扩容困难,很难像云存储那样弹性伸缩。

第五阶段:存算分离与分层架构(Object Storage + Cache)

当前这个时代即云原生时代,数据集达到PB级别,成本成为了核心考量。对象存储最便宜且容量无限,但性能(尤其是元数据)不够好。 此时针对元数据有了若干解决方案:

方案一: 原生对象存储+格式优化

这种方案将数据存储在S3,客户端使用S3 SDK进行对接,以对象存储的接口访问文件。同时降低小文件数量,对小文件进行打包。此处的缺点则在于丧失了POSIX标准。

方案二:对象存储+高性能文件网关

这是目前的最终形态,也是本文将要讲的形态。

其底层数据存储在对象存储中(S3、COS、OSS、ceph),在用户和对象存储层中加一个中间层,作为文件系统层,负责将文件系统与对象存储的操作进行翻译转换,从而实现POSIX兼容。而最重要的是,在GPU训练节点的本地NVMe SSD上建立热数据缓存,以提升IO能力。

此时第一次读取时从对象存储拉取数据,过程稍慢,而后续的读取则可以直接走本地缓存,极快。而一些实现(如JuiceFS)将元数据独立放在Redis/TiKV中,可以完美地解决对象存储list对象的性能问题。据最新的企业版JuiceFS文档说明,当前单机文件系统已经可以支持5000亿级别文件!

本文将以“对象存储+高性能文件网关”的技术路线的现状进行分析,描述业界若干实现的设计思想,抛砖引玉。

Object Storage + Cache的一般性设计原则

本小节介绍Object Storage + Cache的一般性设计原则。在介绍之前,首先需要理清楚文件系统与对象存储的区别是什么,文件系统对接对象存储需要做哪些工作,之后才考虑性能的优化与可靠性的优化。

文件系统与对象存储的异同点分析

文件系统的核心特征如下所示:

层级结构:数据以目录树的形式组织,文件包含在目录中,目录又包含在父目录中。

寻址方式:通过路径名来访问。

数据可变性:支持原地修改。应用程序可以打开一个文件,seek到特定偏移量,然后只修改文件中间的几个字节,而无需重写整个文件。

操作接口:基于系统调用,如open(), read(), write(), seek(), close(), flock()等。

元数据:如权限、创建时间、大小与文件数据紧密绑定,通常存储在inode中。

强一致性:在单机文件系统中,写入数据后,随后的读取操作立即能看到新数据。

原子性:许多元数据操作(如rename)通常是原子的。

对象存储的核心特征如下所示:

扁平结构:数据存储在“桶“中,没有真正的文件夹或目录层级。虽然看起来像目录,但这只是对象键名(key)中的前缀字符串。

寻址方式:通过key访问,需要结合对象存储访问域名/IP来访问。

数据不可变性:对象通常被视为原子单元。无法修改对象的中间部分。如果要修改部分数据,必须新上传一个对象来覆盖旧对象(Read-Modify-Write)。

操作接口:基于RESTful API(HTTP),主要操作是PUT(上传/覆盖),GET(下载),DELETE(删除),HEAD(获取元数据),不支持seek或部分写入。

一致性模型:不同的对象存储实现下有不同的一致性模型。可能是强一致性(如ceph),也可能是最终一致性。

整理如下表所示:

image

将对象存储(S3 协议等)挂载为本地文件系统(FUSE)是业界的常见需求,目的是为了让不支持 S3 API 的传统应用也能利用对象存储的低成本和无限容量。

由于我们在上一部分分析了“文件系统”与“对象存储”存在巨大的语义鸿沟,因此这些 FUSE 工具的核心设计难点都在于:如何用笨重的 HTTP 对象接口去模拟灵活的 POSIX 文件接口。

业界主流有两个设计流派

直接映射型(1:1 Mapping):文件对应对象,元数据存放在对象头中。

元数据分离型(Metadata Separation):数据存在对象存储,元数据存放在独立的数据库中。

对象存储的 FUSE 并不是完美的。直接映射型保留了数据的通用性但牺牲了性能和语义;元数据分离型重建了文件系统语义和性能,但把对象存储降级为了纯粹的“硬盘”,牺牲了数据的通用访问性。

设计优劣势分析

1. 直接映射型 (S3FS, Goofys, Rclone)

设计优点:

通用性强: 写入的数据就是标准的 S3 对象。你用 S3FS 传上去的图片,可以直接用浏览器通过 S3 URL 打开,也可以被其他不使用 FUSE 的程序处理。

部署简单: 无需额外部署数据库,只要有 S3 账号就能用。

无状态: 客户端挂了重启即可,不依赖外部元数据服务。

设计劣势:

元数据性能灾难: S3 处理元数据非常慢。执行 ls -l 可能会很慢,还可能造成集群slow op。

重命名原子性缺失: 在 S3 中没有“重命名目录”的操作。重命名一个包含 1000 个文件的目录,S3FS 需要执行 1000 次 Copy + 1000 次 Delete。这不仅慢,而且如果在中间崩溃,目录会断裂(一半在旧名,一半在新名)。

无法支持随机写/追加写: 修改 1GB 文件的最后 1 个字节,S3FS 必须下载 1GB -> 修改 -> 上传 1GB。效率极低。

2. 元数据分离型 (JuiceFS)

设计优点:

极致性能: 元数据操作(ls, getattr, rename)都在 Redis/SQL 中完成,延迟是微秒级,与本地文件系统无异。

完全 POSIX 兼容: 通过将文件切块(Chunking),实现了对象存储本身不支持的“随机写”和“追加写”(只用重传修改过的那个 Block)。

原子性保障: 重命名目录只是数据库里的一个事务,瞬间完成且原子。

缓存能力: 通常带有强大的本地缓存机制(利用本地磁盘缓存 S3 的数据块)。

设计劣势:

数据不透明(黑盒): 你在 S3 Bucket 里看到的不再是 photo.jpg,而是 chunks/1/123_456 这样的分块数据。脱离了 JuiceFS 客户端,你无法直接识别和使用 S3 里的数据。

运维复杂度: 需要额外部署和维护一个高可用的元数据引擎(如 Redis 集群或 RDS)。讶宗诚秸

http://www.jsqmd.com/news/621503/

相关文章:

  • 用Python+CVXPY从零实现ACC的MPC控制器(附Simulink对比与完整代码)
  • lite-avatar形象库新手教程:零基础完成数字人预览→下载→配置→对话全流程
  • ADXL345 I²C驱动深度解析:嵌入式加速度传感器底层实现
  • 2026荨麻疹治疗全解析:荨麻疹能治疗吗/专业痤疮医院/专业看荨麻疹医院推荐/专治湿疹的医院/医院治疗荨麻疹/去哪治疗皮肤白癜风/选择指南 - 优质品牌商家
  • RWKV7-1.5B-g1a入门指南:Gradio界面按钮功能详解——Clear/Submit/Regenerate逻辑
  • 2026年成都签证代办公司排行:英国签证办理/加拿大签证代办/加拿大签证办理/四川签证代办/四川签证办理/德国签证代办/选择指南 - 优质品牌商家
  • 有研复材科创板上市:市值86亿 年营收3.75亿同比降5.7%
  • 别再只调参了!深入对比改进A*与DWA融合前后,你的机器人路径规划效果差在哪?
  • 嵌入式LCD文本显示驱动:SED1330/SED1335轻量级终端库
  • 千问3.5-2B旅游行业落地:景点照片自动解说、多语种导览内容生成初探
  • s2-pro参数详解:Chunk Length对长文本连贯性的影响与实测数据
  • V-Viewer 进阶指南:解锁 Vue.js 图像查看器的隐藏功能
  • 鸿蒙开发新选择:手把手教你用CodeArts IDE创建第一个仓颉语言项目
  • 【AI原生研发团队建设白皮书】:20年实战沉淀的7大核心岗位配置模型与人才能力图谱(附2024头部企业校准数据)
  • 2026年热门的风管优质供应商推荐 - 品牌宣传支持者
  • AI模型代码双轨并行时代:如何用语义化版本(SemVer 3.0)管理Prompt、Weights与Pipeline?
  • Linux Socket 详解
  • Z-Image-GGUF惊艳效果:负向提示词精准过滤水印/文字/畸变的真实案例
  • 【Python实战解析】从数据采集到模型预测:一个完整天气数据分析项目的技术实现
  • WindNerd Core:基于磁传感的低功耗风速风向传感器设计
  • Redis如何批量更新用户信息_基于HMSET指令实现Hash多字段修改
  • 从医学分割到AI绘画:UNet架构如何成为DDPM等扩散模型的‘心脏’?
  • Flutter Riverpod 2.5.1 保姆级避坑指南:从购物车实战到异步状态刷新,手把手教你避开那些文档里没写的坑
  • 2026年软件测试薪资全景报告:城市与行业深度对比
  • JPlag代码抄袭检测技术架构深度剖析:3大算法实现与20+语言支持机制
  • MouseTo库:Arduino实现绝对坐标鼠标控制
  • Notepad++深度解析:免费开源轻量高效的程序员必备代码编辑器
  • Rhino_IT嵌入式语音意图识别引擎深度解析
  • FireRedASR-AED-L效果惊艳:中英术语缩写(如IoT、SaaS、CRM)精准识别
  • 从PyTorch的MKL依赖冲突,聊聊Conda和Pip安装包背后的‘静动态链接’选择