被AI存储坑掉百万预算后,我总结了这些教训

2026-08-14 华南腾飞科技

封面图

去年秋天,我在佛山一家做机器视觉质检的工厂里,陪技术负责人老张盯了一整天的存储监控。那个场景我到现在还记得——产线上十几台工业相机拍出来的缺陷图片,正以每秒上千张的速度往存储里灌,但GPU训练集群那边,利用率在40%上下跳动,怎么也压不上去。

老张当着我的面,指着监控屏上的波浪线说:“你看,显存占用掉下来又顶上去,像不像人在打嗝?我花60万买的全闪存阵列,买了GPU就快没钱了,结果算力在那儿空转。”

他不是没折腾过。起初用的是普通NAS,走千兆网络,结果一读小文件就卡死,训练一个Epoch要等半小时。后来他咬牙上了全闪存阵列,从iscsi到NFS换了好几轮协议,单卷带宽是上去了,但只要一跑多机并行训练,存储延迟就飙到200毫秒以上。再后来换了分布式存储,IOPS数据是漂亮,但文件锁和元数据交互又变成新瓶颈。前前后后半年,三套方案,120万预算烧掉,模型还是没能稳定跑起来。

这种情况我见过太多次了。企业IT决策者对AI存储的认知,往往还停留在“大容量、高带宽”这两个词上。但AI时代的存储,跟传统数据库或虚拟化场景用的存储,逻辑完全不同。问题根本不是硬盘快不快,而是数据怎么流动、怎么被吃进去。

先说一个最核心的事实:AI训练和推理对存储的需求,不是“容量”,而是“消费数据的速度”。GPU等数据的每一秒钟,都是真金白银在烧。

传统业务存储,比如ERP、OA、数据库,是典型的“低并发、大块读”。一个请求进来,从磁盘上搬几十MB数据,带宽到了就行,延迟多点少点无所谓。但AI训练不一样。尤其是视觉模型,数据集里动辄几十万张小图,每张图几十KB到几百KB。训练框架让GPU拿一批数据,这批数据要同时从存储里拉几百个小文件过来。这就是典型的“高并发、随机小IO”。

很多存储阵列出事就出在这。全闪存阵列的随机读性能确实不差,但走NFS协议时,协议本身的锁机制和属性交互会消耗大量CPU,每秒能处理的元数据操作量有上限。一但跑到几千个并发文件读,存储处理器先过载了,前端带宽再高也是白搭。老张遇到的情况就是典型的“存储甁颈在元数据”而不是“介质速度”。

另外,训练过程还有两个动作极其考验存储:一个是Checkpoint保存,一个是日志写入。

Checkpoint是训练中途存模型快照,一写就是几十GB的大文件。问题在于训练框架通常会阻塞等待写完成,而存储如果这时在忙小文件读取,磁盘和控制器要同时应付两种截然相反的数据流,带宽和延迟双双恶化。更有意思的是,Checkpoint写完了还有同步需求——多机训练时每个节点都要看到同一份快照,这就对文件一致性提出了额外要求,很多存储根本没有这套机制。

还有一个容易被忽略的:数据预处理管道。按理说,数据在进入训练之前应该已经转换成了TFRecord或者类似的高效格式。但我见过很多项目,工程师直接让训练框架去读原始图片。每读一张图就做一次JPEG解码,GPU没吃上,CPU先炸了。这时候你怪存储不行,其实冤枉它了。

至于推理场景,重点又不一样。推理延迟是端到端的,从客户端发请求到返回结果,其中数据读取占的路径比我们想象的长。模型参数要从存储拉进显存,特征数据要实时读取,返回的结果还可能写回日志和样本数据库。一个企业级推理服务,每秒处理几百个请求,意味着存储必须维持稳定的低延迟,不能有毛刺。传统HDD阵列的寻道延迟在这种场景下就是致命伤,所以很多老系统到了一定并发就撑不住了。

那怎么选才能不踩坑?我基于和老张一起复盘出来的经验,结合给其他客户做过的一些调优,整理了几步可操作的做法。

第一步,先做存储访问画像。别急着买设备,先搞清楚你的AI应用到底在怎么用存储。跑到生产环境或者试运行集群上,装一个指标采集工具,记录一整天对存储的请求大小分布、并发数量、顺序/随机比例、读写比例。很多存储厂商都有免费的评估工具,花半天时间就能把数据拉出来。老张当时装完,发现他有85%的请求是小于64KB的随机读,只有15%是大块写——这个比例一出来,答案就很清楚了:他需要的不是阵列带宽,而是高元数据性能。

第二步,分层存储,别指望一套搞定。热数据(正在训练的数据集、Checkpoint)要放在NVMe全闪存上,要求单卷IOPS高、延迟低,最好走NVMe-oF协议;温数据(历史数据、测试集)可以放在SATA SSD上;冷数据(原始图片、归档)放到对象存储里,成本低。关键点是各层之间要有自动迁移策略,别让数据堆在错误的层级。我们给老张搭的是三层结构,热数据层用两节点NVMe分布式存储,容量不大但单个卷的元数据性能很强;冷数据层则用普通X86服务器加HDD组成对象存储。这么做下来,成本反而比单一全闪方案低。

第三步,小文件先做大文件聚合。这一步非常有效。原始图片小文件多,那就先用预处理任务,把数据集打包成如TFRecord这种高效格式,让训练框架每次读取都是顺序读大文件。别忘了调大预取和缓存窗口,Linux下可以用posix_fadvise设置顺序读预见,减少页缓存抖动。我们实测过,光这一步改动,GPU利用率能从40%拉到60%以上。老张的团队后来把90%的训练数据都改成了打包格式,训练速度直接快了近两倍。

第四步,重写数据管线里的存储访问方式。训练框架的数据加载器(如PyTorch的DataLoader)不必直接读本地文件,可以改成从对象存储或共享文件系统读。配合缓存中间层(例如Redis或Memcached)做热点数据缓存,可以大幅减少重复读。数据预取也是一个关键动作,提前把下一批数据拉到本地内存。说白了,别让GPU在数据上等待,让数据在GPU面前排队。

第五步,如果预算允许,直接上并行文件系统或高性能分布式存储。这类产品支持RDMA和GPUDirect Storage,存储数据可以绕过CPU直接进GPU显存,那效果完全是质变。我们最近给一个自动驾驶公司做的方案,就是用这类存储加并行文件系统,把多节点训练规模从4机扩展到20机,加速比从原来的2.1倍提升到19倍,非常恐怖。不过,前提是你的网络要配合,至少要25Gbps起步跑到罗,100GbE最理想。否则存储再快,网卡先堵死。

总结下来,就六句话。

第一,AI选型,先看数据访问方式。别先问“多大容量”,先问“我模型的读模式是什么样”。

第二,存储性能的瓶颈往往在元数据和协议处理器,不在硬盘本身。这个坑最阴险,因为评测软件测单线程大文件读都好看,一跑真实负载就露馅。

第三,GPU利用率不高,先别急着调模型。先查数据路径上是不是堵了。我们把存储当成了默默无闻的配角,但事实上,你的GPU在等数据,你的训练速度就被存储锁死。

第四,成本和性能的平衡,靠分层设计,别押注在单一黑盒设备上。老张后来把预算重新分配,用原本三分之一的价格达到了更稳定的性能。

第五,监控一定要做端到端的。从GPU看、从应用看、从存储看,三层观测数据对照,才能定位真实瓶颈。别只看一张仪表盘就下结论。

第六,运维能力要跟上。AI存储与传统存储,管理方式完全不同。你需要的不是一位会配RAID的工程师,而是理解训练框架数据流的人。这一点基本上没有人提前想到,等到出问题了找人,才发现市场上有这种能力的人少得可怜。

老张那套系统后来跑通了。我们华南腾飞科技帮他重新规划了存储层,配合框架级的数据加载优化,GPU利用率稳定在了90%以上,原来那个每次训练要跑两天的模型,现在五个小时出结果。他后来跟我说,早知道存储的坑这么深,当初就该先把数据路径想清楚再动手。

其实很多IT团队在建AI基础设施时,对计算力的关注远远大于存储。这也能理解,毕竟GPU是花大价钱买来的,存储看起来“只是个柜子”。但如果你的数据管道是细脖子,哪怕GPU再强,也只会饿死在数据等待里。说句实在话,像这种AI存储选型出问题的项目,我们华南腾风科技接手过不少,问题都高度相似——存储不是买得不够快,而是匹配度不够。这一课,希望你别用一百多万的教训来补。

相关推荐


// 百度统计 - 转化追踪 (在线客服点击) $('.fixedSide li').on('click', function() { var txt = $(this).find('p').text().trim(); if(txt === '在线客服') { _hmt.push(['_trackEvent', '转化', '点击', '在线客服']); } });