2026/10/16 23:30:24

AI项目存储选型:训练数据、模型权重与向量索引如何分层

AI项目存储选型:训练数据、模型权重与向量索引如何分层 做模型训练的同学应该都有过这种经历GPU利用率上不去显卡在等数据训练脚本的日志里好半天不见一个step更新。一开始大家会去调模型结构、调学习率折腾了半天才发现瓶颈不在算力在数据喂不上来。进入AI时代之后“数据如何存储”这个问题的复杂度被严重低估了。训练集、模型权重、向量索引、验证集、日志和样本库每一类数据的体量、读写模式、可靠性要求都不一样一套传统存储方案包打天下的做法越来越行不通。这篇文章把我这些年梳理AI项目数据存储方案时沉淀的判断标准写出来不绕弯子直接对照使用场景说清楚什么样的数据该放在哪一层性能和成本怎么权衡以及运维阶段最容易忽略的细节。准备搭建训练平台的技术负责人、被数据加载卡住的算法同学以及刚接触AI基础设施的运维朋友应该都能从中找到一条能落地的思路。1. AI负载让传统存储手忙脚乱先看清三对矛盾要决定数据放哪先得搞清楚AI工作负载对存储到底提出了什么要求。传统业务系统的存储负载相对单一数据库多半是随机小IO文件服务器多半是顺序大IO两者分得很开。AI项目则不一样同一个平台里既有训练作业又有推理服务还有一堆数据预处理任务存储要同时面对几对互相矛盾的需求。如果不先把这些矛盾摊开后面谈介质、谈协议很容易变成参数对比落不到真实场景里。1.1 顺序读与随机读的冲突训练作业读数据时基本以流式顺序读为主一次要读出几百MB甚至几个GB的特征文件送进GPU流水线希望存储能持续提供高带宽。推理服务则相反向量检索、特征召回这类操作每次只读几KB但并发量极高要求单个请求的时延在毫秒级。说白了前者像开着重卡走高速想要宽路后者像大量小轿车排队出停车场想要多个出口、快速放行。用同一套存储去扛这两种负载高峰期必然互相拖累。这类冲突在真实环境里非常普遍也很容易在运维监控图上看到训练任务一启动共享存储的带宽被打满在线推理的延迟立刻恶化数据加载一停存储又大量空闲。如果平台里训练和推理并存我建议至少在存储层面把这两类流量分开或者给不同业务设置明确的带宽上限。否则后续的很多优化都会被这层互相干扰拖住。1.2 海量小文件与大文件的体积差第二对矛盾是数据预处理阶段产生的海量小文件。语料切片、图像裁剪、音频分段之后经常出现几百万个KB级别的小文件。很多团队把数据集原样丢进文件系统结果还没开始训练光遍历目录就能等半天。问题本质不在总容量而在元数据。一个小文件对应一条元数据百万小文件就是百万条元数据文件系统的inode、目录索引都会不堪重负。同样是1GB的数据拆成100万个小文件和合并成1000个1MB级别的块文件访问效率会差一个数量级。所以数据入库前先做“大文件化”是性价比最高的优化把原始样本打包成分块格式让存储只面对少量大对象元数据开销降下来训练读取速度也能提上去。这一点常被人忽视却是很多性能问题的第一根源。1.3 从TB到PB的架构换挡第三对矛盾很容易被低估数据规模从TB跨到PB不是容量不够再买几块硬盘那么简单。TB级阶段一台大容量服务器加本地高速盘就能覆盖很多场景部署简单、运维成本低。到了PB级单机的带宽上限和存储密度很快就到顶了网络带宽、数据分片、多存储池、数据调度这些问题都会冒出来。可以类比搬家十个箱子叫一辆大车就行一千个箱子需要的是车队还要考虑装车顺序、路线和仓库位置。AI平台的数据量往往增长得非常快几次新数据集导入、模型迭代和历史归档叠加在一起容量就会突然跃迁。如果架构一开始没有留出横向扩展的接口后面做数据迁移会非常痛苦。规划存储时最好先问一句这个平台半年后数据量会是多少答案往往直接决定要不要上分布式方案。2. 按数据角色安置数据训练集、权重、向量索引该放哪很多人一想到存储方案第一反应是先挑工具、看参数。我更建议反过来先把平台里的数据按角色拆开它们分别是谁在什么场景下访问的丢失会造成什么后果访问频率有多高。角色分清楚了落在哪一层几乎是自然得出的结论而不是靠拍脑袋选一个昂贵的“通用方案”。2.1 训练数据吞吐优先冷热分层训练数据集通常由一组大块文件组成特征是体积大、顺序读取为主、丢失后可以靠原始数据重新生成。相比“绝对不能丢”它更在意“读取时不要拖慢GPU”。针对这种角色比较合理的做法是两层结构原始数据放在容量型存储里比如对象存储或大容量低频池它们便宜、容量大训练当前需要的子集则提前放到高速层比如本地的SSD或者共享高速存储让训练作业读取时带宽充足。实际操作中我建议把数据管线设计成“先预热、再训练”。启动训练任务前先从容量层把本epoch要用的数据拉到高速层或者用并行预取的方式提前填满本地缓存再开始跑计算。如果让训练边跑边从冷存储层拉数据一来带宽波动会影响训练稳定性二来冷存储层扛不住高并发很容易成为新的瓶颈。很多训练框架都有自动的预取机制但前提是底层存储能提供足够的突发带宽这个提前量和硬件能力要在压测阶段就摸清楚。2.2 模型权重与检查点可靠性优先快照思维模型权重和检查点是另一类角色单个文件可以到几百GB写入频率不高但可靠性要求极高。训练跑了两天的checkpoint如果损坏或丢失前面计算基本白费。所以它们不该和训练数据混在同一个优先追求吞吐的池子里而应该放进一个写一致性更好、有明确版本管理的存储区域。这里有一个容易被忽视的细节保存检查点时要避免直接覆盖旧文件而是要写出一个完整文件后再原子切换引用。很多框架原生支持这类写法但工程上仍然常看到半写状态的文件导致恢复失败。另外一个实用建议是设置多个保存点比如保留最近三轮的检查点再配合一个稳定的命名指针指向最新版本。恢复程序只要读最新的指针不必在几十个文件名里猜哪个才是可用的。2.3 向量索引与特征数据低时延优先内存和磁盘协同向量索引的角色又不一样。推理服务每次查询要快速找出与输入相近的topK向量请求规模可能是每秒数千次读的是KB级别的小对象对时延极其敏感。把索引全部放内存当然最快但千万级向量构建出的索引往往有几十GB甚至上百GB内存装不下或者太贵。更常见的做法是分层热点子集留在内存或本地高速缓存完整索引放在SSD存储上查询引擎负责在内存未命中时快速从磁盘加载对应分片。还需要注意索引构建和查询的资源隔离。索引构建是计算和IO密集型任务如果和在线查询共用同一批存储节点构建期间极有可能把查询时延打爆。我建议把构建任务放在单独的执行周期或者用资源组把两者的IO限流参数分开。服务启动时的索引加载也得提前设计让服务预热完成后再对外接收流量否则新节点加入时就成了全集群的存储IO冲击点。3. 介质、协议与分层参考架构存储选型的三张表把数据角色分清楚之后接下来要解决的是技术选型。存储系统通常可以从三个维度去看底层介质、访问协议、整体架构。每个维度都有自己的适用边界用错了场景再贵的设备也发挥不出价值。介质决定了物理性能的上限协议决定了数据能被谁访问架构决定了容量和扩展能力。三个维度分开考虑再组合起来看才不会在具体产品的参数里迷路。3.1 介质层怎么选硬盘、固态、内存的主场介质优点短板适合的AI数据机械硬盘容量大、单位成本低随机IO差、延迟高原始数据集、归档数据、低频备份固态硬盘随机和顺序IO都优秀单位成本高于HDD活跃训练集、活跃检查点、向量索引内存微秒级延迟、极高IOPS容量小、断电丢失向量热索引、频繁访问的样本缓存介质之间不是替代关系而是分层关系。大容量HDD负责把所有数据装下来SSD承担活跃数据的读取内存缓存兜住最热门的访问。预算充足当然可以全SSD但全闪方案对海量冷数据并不划算到了PB级阶段容量和成本会非常难看。实际上很多AI平台跑得稳靠的并不是某一层特别豪华而是让每一层都干自己擅长的事。3.2 访问协议怎么定块、文件、对象、键值的边界访问协议决定了数据怎么被读写也决定了能同时服务多少客户端。协议/形态典型使用方式优点不适合块存储单机挂载本地盘延迟低、可靠多机共享困难文件系统共享多台机器挂载同一个目录读写方便、适合训练集共享和代码元数据压力大、高频小文件场景容易吃力对象存储HTTP接口读写大对象容量大、元数据丰富、适合海量数据高频小对象改写效率低键值/缓存按key访问小对象毫秒级延迟容量有限不适合大文件选协议关键看使用方式训练作业希望多台机器同时读一批数据共享文件系统或对象存储的流式读取比较合适数据库这类低延迟随机写场景块存储更稳推理特征缓存和向量热索引键值缓存是主流。很多时候协议选错不是性能问题而是架构问题。比如向量索引这种类型不太适合硬塞进传统关系库也不是所有键值缓存都能扛住近邻检索的计算量需要在专用的检索引擎和底层存储之间做好分工。3.3 一套小型AI平台的分层落地参考如果没有特别复杂的背景我建议直接按下面这个五层结构起步。它不追求极致的硬件表现但足够支撑绝大多数训练和推理任务。层内容说明GPU服务器本地盘当前模型的临时文件、推理加载缓存走最快路径掉电可重建内存/缓存层向量热索引、频繁读的小样本毫秒级响应容量不用贪大高速共享存储当前活跃的训练集、最近检查点SSD介质多机可共享容量型共享存储全量训练集、历史检查点HDD/对象存储追求容量和成本归档/低频池原始数据集、旧版本模型极少访问可接受较高恢复时延这个结构把数据按热度放进了不同的容量和速度区间。训练时数据从容量层或高速层读取推理时向量子集从内存和缓存响应归档时旧数据安静地待在低频池里。每层之间通过策略自动迁移就形成了一个完整的数据流转闭环。它也是后面生命周期管理的基础。4. 性能、容量与成本怎么平衡算好三笔账方案设计得再漂亮最后都要过预算这一关。性能、容量、成本三者之间没有绝对最优只有针对业务场景的相对最优。同一块存储对训练任务可能贵得离谱对归档数据又不够便宜。我的做法是不纠结于厂商宣传的单项指标而是把整个问题拆成三笔账来算带宽账、容量账、单位成本账。每笔账对应一类数据角色算清楚了选型思路自然就清晰了。4.1 峰值吞吐和平均IOPS别被标称值骗了第一笔账是带宽账。很多人选存储只看协议带宽标称值比如网络号称10GbE就以为能跑满1.25GB/s。实际读小文件或高并发时有效吞吐常常只有标称的五六成。训练场景要关注的不是瞬间峰值而是持续加载过程中的稳定带宽推理场景要关注的不是平均时延而是P99这类长尾分位数。简单说训练看“能不能一直保持高吞吐”推理看“最差的那些请求是不是还在可接受范围”。一个常见的坑是批处理和在线服务共用同一存储池离线导出数据时把带宽吃满在线查询的P99立刻变差。解决办法要么是分池隔离要么是给不同业务设置带宽上限。如果共存无法避免至少要在监控里区分带宽使用来源出了问题能快速定位是哪类任务在抢资源。4.2 压缩、去重、量化从源头降低存储体积第二笔账是容量账。与其不停扩容不如先给数据瘦身。文本类语料压缩率通常很高几十GB的原始文本压缩后可能只剩三分之一重复样本在数据集中比想象中多尤其是爬取类数据做个去重不仅能省容量还能缩短训练时间。模型权重也有明显的压缩空间FP32转成BF16或INT8体积可以减半甚至更多不过要提前做精度测试别等训练完才发现效果不达标。这里有个容易被低估的副作用压缩和解压会消耗CPU。如果训练流水线每次读取都要实时解压CPU反而可能成为新瓶颈。所以更合理的做法是在数据入库阶段就做压缩和格式转换读取时尽量选择不需要现场解压的格式或者用硬件和预解压缓存把开销挡在训练关键路径之外。4.3 用单位成本倒推选型而不是先看品牌第三笔账是单位成本账。不同数据角色对应的最优成本指标不一样存储大量冷数据关心的是每GB成本训练数据频繁读取关心的是每GB每秒带宽成本在线推理访问的小对象关心的是每百万次查询成本。把预算按这个口径拆开会发现很多选型问题根本不纠结。我通常会画这样一个示意表来和团队对齐预期数字按实际环境填数据角色关心指标常见量级参考原始数据/归档每GB成本低到中等即可训练数据每GB/s带宽成本优先保证带宽向量索引热层每百万次查询成本优先保证时延检查点/快照每TB可靠容量成本可靠性和容量并重另外提醒一句容量规划不要卡着上限买。索引副本、临时文件、日志、回收站这些看不见的数据很容易占到实际容量的20%以上。我习惯在预期需求基础上额外预留25%到30%的余量这部分看起来浪费但在数据突增时能救急。5. 数据生命周期与运维管理存储买完只是开始存储不是建设完就一劳永逸数据会一直增长、变化、过期。很多平台上线时跑得不错半年后却越来越慢问题不在于当初选的设备差而是数据没有按生命周期被妥善管理。真正拉开差距的往往是运维阶段做得细不细自动分层策略是否合理备份是否真的能恢复告警是否设置对了指标。我更愿意把存储运维当成一项长期投入来看下面几个环节是从实际故障里总结出来的。5.1 自动分层策略怎么定才不出乱子自动分层可以简单理解为给数据定生命周期规则。通常按最后访问时间和访问频次两个维度来划分当前训练和推理要用的数据留在高速层超过一段时间没被访问的数据自动降到容量层再长时间没动的进入归档池。具体时间窗口要根据任务节奏来定比如训练任务每周一轮就可以把“7天未访问”作为降级条件如果任务每天跑好几次窗口适当缩短。这个策略看起来简单真正实施时容易出两个问题。一是批量迁移任务会在某个时间点集中触发把网络带宽和存储IO占满导致在线服务抖动。解决方法是给迁移任务限速并把迁移窗口安排在业务低峰期。二是自动化策略有可能误伤正在使用的数据比如某个训练任务用旧数据集做验证这段时间数据没被读取但之后又要用就容易被当作冷数据降级。稳妥的做法是加白名单让核心业务数据不参与自动降级或者设一个更保守的检查周期。5.2 多副本不等于备份恢复演练才是底线存储设备上的多副本、纠删码只是防硬件故障。如果遇到误删、程序bug批量更新、恶意破坏所有副本上的数据会被同步改掉这个时候副本越多反而越“同步丢失”。所以备份和副本是两回事。对AI平台来说至少要保证关键数据原始数据集、模型检查点、重要的中间结果有独立于主存储的备份并且对备份本身做不可变保护防止被覆盖或篡改。比备份更常被忽略的是恢复演练。存档放在那儿半年没碰过真出事需要恢复时才知道备份链路早就坏了。我建议至少每个季度挑一个样本从一个随机的检查点或小规模数据集开始完整走一遍恢复流程记录恢复时间和失败点。跑过一次恢复演练之后你对整个存储体系的信任程度才会真正建立起来。5.3 盯住几个关键监控指标提前发现隐患存储监控不用贪多关键指标盯住几个就够用。GPU等待率训练任务中GPU等待数据的比例一旦持续偏高优先怀疑数据读取链路。存储带宽利用率训练数据加载期间带宽是否持续接近上限长期高于80%要考虑扩容或分层。时延分位数在线推理读写场景看P99不要只看平均值。容量水位与增长率规划是否跟得上数据增长建议在预警线以下较早介入。元数据与文件数量小文件数量膨胀是性能恶化的前兆。告警阈值也别拍脑袋定。我见过不少系统设置“平均时延超过100ms就告警”结果存储偶尔慢几秒也没人发现。相反P99分位数和白天的带宽峰值更容易暴露真实风险。监控的价值不是收到一堆通知而是能在用户感受到故障之前定位到可疑环节。把监控项和上面的数据资产清单对应起来更换存储层、调整分层策略时也能更早发现影响。6. 落地节奏与团队协作方案再好也要人用起来存储选型里有一个大家不太愿意明说的现实一大半失败的方案不是技术选型错了而是在地执行时断了链子。同样是训练平台有没有人负责数据分层有没有人在训练前做预热有没有人定期恢复备份长期下来差距会非常大。最后这部分想聊点工程和管理层面的东西技术指标只是一方面团队怎么协作、上线节奏怎么安排同样决定这套方案能不能持续跑下去。6.1 别让算法团队和运维团队各管一段存储选型看似是基础设施团队的事实际上和算法工程紧密绑定。不同框架读取数据的方式不一样有些走共享文件系统有些走对象存储接口有些依赖缓存预取不同推理服务对时延和可用性的要求也差异很大。如果算法团队只负责模型、运维团队只负责硬件两个环节脱节就会出现买了很贵的高速存储但训练脚本仍然没吃满带宽的情况。比较好的协作方式是在项目初期就一起过一遍数据流算法同学说清楚读什么东西、并发多少、连贯性要求如何运维同学说清楚可用预算、各层容量和带宽上限。把这两份信息叠加存储架构基本就定了。不要到采购完成之后才反过来要求存储适配算法那是成本最高的一条路。6.2 小团队的低成本起步路径对大部分团队来说一上来就搭完整的分布式存储集群未必划算运维成本可能比硬件成本更贵。更务实的路径是按数据量分阶段走。数据量级推荐思路核心关注点10TB以内本地大容量盘 外部备份简单可靠先跑通业务10TB-50TB容量型服务器 缓存层训练数据预取和带宽规划50TB-100TB以上分布式存储或对象存储底座数据调度、分层策略、容量治理小团队容易犯的错是想一步到位结果花大量精力维护一个当前根本用不上的复杂系统。数据量没到那个量级之前分布式存储带来的扩展性优势远不如一台大容量服务器加良好备份来得省心。真的到了需要扩展的时候再按数据角色分批迁移风险要小得多。6.3 几个值得提前避开的坑结合这些年看到的线上问题我列几个共性比较高的坑每一个都对应着真实的故障成本。用传统关系数据库存向量数据数据量小还能接受量一大无论是写入还是近邻检索都会非常吃力。检查点只存一份不管主存储多可靠至少要在独立位置再放一份否则一次误删就能让训练进度归零。训练任务直接读写归档层归档层设计目标不是高带宽边训练边读归档基本等于主动制造瓶颈。忽略小文件优化百万级小文件不是容量问题而是元数据问题入库前做大文件化处理能省掉大量后续麻烦。上线前不做全链路压测存储问题往往在并发上来后才会暴露压测至少要把数据读取、写入、备份、恢复四类场景各跑一遍。我的习惯是给每一类数据都整理一张简单的卡片写清楚容量、访问模式、峰值带宽、容忍时延、保留周期这几项然后放到团队文档里。后面讨论架构、采购、调整分层策略时所有争论都围绕这些数字展开而不是凭感觉打嘴仗。这个习惯看着笨但它能帮助团队把存储问题讲清楚也就解决了一大半。