跳转到内容

对象存储、并行文件系统与本地缓存

上一章讲了检查点怎么写,这一章讲写在哪。训练集群的存储是三层结构:本地 NVMe(快、小)、并行文件系统(快、共享)、对象存储(慢、大、安全)。每一层有自己的角色,选错层是存储性能问题的第一来源。本章给一张清晰的分工表与流量模型。

层典型带宽(聚合)容量延迟角色
本地 NVMe每 node 数 GB/s每 node 4–16 TB~100 μs工作区:token 流、最近检查点、热数据
并行文件系统(Lustre/GPFS/JuiceFS)集群级 100 GB/s–1 TB/s10 PB 级~ms共享区:数据集、检查点仓库
对象存储(S3/OSS/MinIO)按带宽包无限~10–100 ms仓库:冷数据、灾备、发布

三条铁律:

一、训练的热数据(token 流)必须在本地 NVMe。对象存储的延迟(10–100 ms)与抖动是数据管道(数据加载)的天敌——每步都打对象存储的集群,GPU 利用率注定锯齿。

二、并行文件系统是"集群共享的中间层":数据集放这里,所有节点都能读;检查点仓库放这里,任何节点都能恢复。

三、对象存储做仓库与灾备:数据的最终家、检查点的异地副本、模型发布的地方——它不参与训练的热路径。

一次训练的存储流量,三种不同性质:

流量大小模式落在哪层
读 token 流每 step 数百 MB,持续顺序读、热本地 NVMe(预热过)
写检查点每 30 分钟 1 TB+突发大写并行 FS(+ 异步落对象存储)
读数据集/写日志/加载模型一次性/低频随机并行 FS / 对象存储

检查点的突发写入是存储设计的第一挑战:万卡集群每 30 分钟同时写 TB 级——并行文件系统的聚合带宽必须扛住这个突发,否则检查点的写入时间失控(挤占训练)。

一个 1000 节点(8000 卡)训练集群的典型配置:

层容量带宽说明
本地 NVMe8 PB(每 node 8 TB)每 node 3–10 GB/stoken 流 + 最近检查点
并行 FS10–50 PB聚合 0.5–1 TB/s数据集 + 检查点仓库
对象存储无限100+ GB/s(出口带宽)灾备 + 发布

规划公式:

  • token 流:1T token × 2 B = 2 TB(一个 epoch 的量)——本地 NVMe 轻松装下,但必须预热
  • 检查点:70B 模型 1.1 TB × 保留 3 份 × 每 30 分钟 = 并行的写入压力,聚合带宽按"多训练共享存储"叠加
  • 多训练共享存储是隐藏的坑:三四个训练同时写检查点,聚合需求 ×4——存储容量规划要按峰值叠加

标准流程:对象存储(仓库)→ 并行 FS(集群共享)→ 本地 NVMe(工作区):

训练开始前:
1. 数据集从对象存储拉到并行 FS(一次性,可复用)
2. token 流从并行 FS 预热到各节点本地 NVMe(按节点分片)
3. 训练只读本地 NVMe(顺序读,零远程依赖)

预热是训练启动的标准步骤(几 TB 到几十 TB 的分发要提前做);训练中途才发现数据没预热,是新手集群最常见的断粮原因。

  • 监控三层的带宽与容量:并行 FS 的聚合带宽是共享资源,多训练互相挤压是" mysteriously slow checkpoint"的头号原因
  • 检查点双写:本地(快恢复)+ 对象存储/并行 FS(安全)——上一章的结论在存储层的落地
  • 小文件问题:对象存储/并行 FS 都怕海量小文件(元数据瓶颈);token 流用大分片(数百 MB),日志按天聚合
  • 生命周期管理:旧检查点自动清理(保留策略)、冷数据下沉对象存储——并行 FS 的容量是最贵的,别让冷数据占着
  • 三层角色:本地 NVMe 是工作区(token 流 + 热检查点)、并行 FS 是共享区(数据集 + 仓库)、对象存储是仓库与灾备。
  • 训练热数据必须在本地 NVMe;对象存储不参与训练热路径。
  • 检查点的突发写入是第一挑战;多训练共享存储按峰值叠加规划。
  • 预热管道:对象存储 → 并行 FS → 本地 NVMe,训练启动的标准步骤。
  • 监控聚合带宽(多训练挤压)、大分片防小文件、生命周期管理防贵层被冷数据占用。