存储与推理期数据服务
09 存储与推理期数据服务(综述 §2.4–2.5)
这部分偏系统层,训练数据岗了解全貌即可,但「数据分发」「RAG 数据组织」两节和数据管道直接相关。
0 一图看懂:数据从管道到模型消费的全链路
[[08 端到端管道]] 产出的数据集
↓ ① 选格式:TFRecord / MindRecord(PB 级别别用裸 CSV/JSON)
↓ ② 存起来:对象存储后端(JuiceFS / 3FS)—— 单节点放不下(CC 9.5PB)
↓ ③ 移动它:缓存(Quiver/Fluid)+ 预处理卸载(Cachew)—— 管道吞吐的隐性瓶颈
↓ ④ 组织好(RAG 场景):向量式(切块→嵌入→压缩→Faiss)或 图式(GraphRAG)
↓
训练循环 推理循环
├─ Shuffle/供给:EL2N·MoSo·Velocitune ├─ KV Cache 管理:vLLM/RAGCache/CacheGen
├─ Packing:Best-fit / 语义式拼接 ├─ 压缩:LLMLingua 系 / gisting(26×)
└─ 容错:CheckFreq / MegaScale └─ 溯源:Bileve / PRF 水印 / UPV存储(§2.4):六个子问题
1. 数据格式(§2.4.1)
训练数据格式——纯文本格式(CSV/JSON/TSV/TXT)在 PB 级规模下因无压缩(不支持二进制编码)导致存储浪费 + 训练时加载慢,所以有专门格式:
TFRecord
一句话:基于 Protobuf 的二进制行式格式——体积小、支持流式读写和分片,为「训练逐样本消费」量身定做。
细节:高效二进制序列化,行式存储,体积远小于 JSON/CSV;支持流式读写——特别适合训练这种逐样本消费的场景;多模态场景下可以把图像、标签、元数据封装进单个 tf.train.Example(不用像 COCO JSON 那样把元数据放独立 JSON);支持分片成分布式文件摊到多台服务器并行训练。
MindRecord
一句话:数据文件 + 索引文件双文件结构,索引让检索和数据集分析变快。
细节:数据文件(文件头 + 标量数据页存标签/文件名 + 块数据页存图像文本)+ 索引文件(按标量数据建索引)。
张量格式(tf.data.Dataset):统一多维数组,GPU/TPU 可分区并行,但存储开销大、可读性差,一般只在训练内用。
模型数据格式——安全性和框架绑定是关键词:
- Pickle (.pkl):Python 通用,但序列化数据和「行为」——反序列化时可执行任意代码,安全隐患;
- Safetensors(HuggingFace):一句话:只存张量 + 元数据,杜绝代码执行,mmap 加载大增——Pickle 安全问题的正解;
- .pt / .pth:.pth 存训练 checkpoint(参数+优化器状态+epoch),.pt 只存参数;
- ONNX:跨框架互操作(PyTorch/TensorFlow/Caffe2),但不存训练状态。
2. 数据分发(§2.4.2)
规模锚点:Common Crawl 9.5 PB、DeepSeek-R1 617B 参数——单节点放不下。
JuiceFS
一句话:拿对象存储(S3)当后端的分布式文件系统——横向扩展简单,成本只有传统文件系统的 ~20%。
3FS(DeepSeek)
一句话:大量 SSD + CRAQ 链式复制——读走链上任意节点、写沿链顺序执行,牺牲一点写延迟换一致性,但读几乎不受影响(对训练更重要)。
细节:CRAQ 算法保一致——数据存多个相同 chunk 组成链(Chain):读请求发到链上任意 chunk,写请求沿链顺序执行;chunk 故障时不是用异常期增量数据覆盖,而是把 chunk 移到链尾、恢复后从其他 chunk 全量拷回。另两个关键决策:发现 File Cache 大量吃内存拖累 I/O → 异步加载 + 禁用文件缓存、只用 Direct I/O;对 buffer 指针/偏移/长度做系统级对齐避免额外内存拷贝。
异构存储:ZeRO 把模型状态摊到多卡;vDNN 等进一步把数据挪到主存/NVMe SSD 缓解 GPU 显存压力(按层滑窗动态分配内存)。
3. 数据组织(§2.4.3,服务 RAG 检索)
向量式组织(五步):
① 内容组织(命题化/层级树) → ② 切块(粒度+overlap) → ③ 嵌入(BGE/STELLA/GTE)
→ ④ 向量压缩(LVQ/LeanVec/GleanVec) → ⑤ 存储引擎(Faiss/Milvus/Weaviate/LanceDB)- 内容组织:Dense X / APS 把文本精炼成独立命题级语义单元(包含表达原意所需的全部上下文的最小句子);Thread 重组成逻辑单元(前提/标题/正文/链接器/元数据);科学论文可组织成层级树(标题为根,章节为子节点,父子边表示全局-局部关系)。
- 切块(Chunking):最优块长要平衡「细粒度语义 vs 足够上下文」——太长嵌入时语义被压缩,太短处理成本高;相邻块允许 overlap 保边界信息。MoG 动态化:训练一个 MLP router 根据输入 query 决定粒度(句子/段落/章节级);MoGG 把文档转图、粒度重定义为跳数范围。
- 嵌入:BGE(双语联合训练 + 语言特定子词切分 + 适配层,跨语言检索准);STELLA(跨实例注意力聚合捕捉句间依赖;额外带对话模型处理不完整 query,降维度和延迟);GTE(双负采样对比学习,固定 batch 内加反向对比项,增强细微语义区分)。
- 向量压缩:LVQ 局部自适应量化——集中数据后逐向量缩放、局部自适应计算量化边界,适合 ~100 维(上万维效果差);LeanVec(PCA + LVQ;OOD 场景用专门优化找同时适配数据集和 query 的投影子空间);LeanVec-Sphering(把找投影矩阵变成马氏距离下的优化问题,更好保相似度结构);GleanVec(非线性路线:球面 k-means 按方向聚簇缩小搜索范围,簇内再做 LeanVec-Sphering 线性降维)。
- 存储引擎:
- Faiss —— 一句话:三种索引按数据量选——Flat 全量平铺(小数据集高精度)、IVF 聚簇倒排(缩小搜索范围)、PQ 子向量量化(精度换空间);
- Milvus(单向量实体连续存储按 row ID 直取;多向量实体列式存储);
- Weaviate(一句话:向量和结构化属性同存——电商商品可按「向量相似 + 价格/类目条件」混合查询);
- LanceDB(一句话:列式格式单行可存多模态数据 + 任意多向量,动态更新,特别适合多模态)。
图式组织(GraphRAG)
一句话:向量检索管模糊匹配,图组织管精确多跳——用 Leiden 算法把知识图谱切成社区、为每个社区生成层级摘要,命中三元组时收集相关社区摘要送模型。
细节:GraphRAG 用 Leiden 算法检测知识图谱里紧密连接的子图(社区),解决直接检索稀疏三元组导致多跳查询延迟高的问题。
4. 数据移动(§2.4.4)
Quiver(缓存)
一句话:吃透训练任务三个 IO 特征(可共享性/可替换性/可预测性)来优化缓存共享。
细节:可共享性(job 内外数据访问大量重叠)、可替换性(I/O 顺序不影响正确性,小缓存可用替换数据提升性能)、可预测性(用 mini-batch 耗时估计 job 对 I/O 的敏感度)。
Fluid(缓存)
一句话:把 TCP 拥塞控制的思想搬进缓存——协调器监测训练速度,试错式动态调缓存容量。
细节:升/降因子 + 步长调容量。
Tectonic-Shift(Meta)
一句话:闪存 + HDD 混合,按「历史 + 预测访问模式」决定谁进闪存。
细节:算 bucket 优先级决定进出闪存,CacheLib 段大小优化到 256KB。
算子卸载:数据预处理(shuffle/采样/增广)通常跑在 CPU 上、跟不上 GPU/TPU 训练速度 → Cachew 把数据集切独立子集卸载到远程 CPU 节点,自动扩缩 worker、自动选缓存位置;tf.data service 横向扩展 CPU 节点 + 协调读取缓解 straggler(四组件:dispatcher 按 OFF/DYNAMIC/静态策略分片、worker 池、client、orchestrator)。
5. 容错(§2.4.5)
- PaddleNLP 统一 checkpoint —— 一句话:权重/优化器状态统一存 safetensors,换分布式策略或机器数时一个 checkpoint 就能恢复,不用为每种配置单独存。
- CheckFreq —— 一句话:两阶段异步存储——GPU 显存能快照就快照(便宜),不行落 CPU 内存并调频率;快照与后续迭代计算流水线并行保参数一致性。
- MegaScale:HDFS 存模型状态,两阶段存储解「checkpoint 频率 vs 恢复时 HDFS 带宽瓶颈」。
6. KV Cache(§2.4.6,推理显存大头)
自回归生成下每 token 依赖前文,KV Cache 复用已算的 key-value 避免重复计算;但显存随序列长度增长。四类管理(综述分三类 + 综述 Table 1 标注它是推理阶段独有问题):
- 空间管理:vLLM / vTensor —— 一句话:把 KV 切固定大小的块非连续存放,逻辑块与物理块解耦(PagedAttention 思路)——block table 跟踪映射和填充状态,动态内存分配。
- 放置:RAGCache / CachedAttention —— 一句话:按访问频率和重算成本决定 KV 放 GPU 显存还是主存,pending job 的 KV 提前预取。细节:RAGCache 的 prefix-aware PGDSF 替换策略按访问频率/大小/重算成本排优先级;CachedAttention 借推理任务调度器观察待执行任务,执行前预取进主存、不再需要的驱逐。
- 收缩:CacheGen / MiniCache —— 一句话:把 KV 编成紧凑比特流按网络状况动态调压缩级别;MiniCache 进一步利用层间冗余(CacheGen 只管层内)。细节:CacheGen 定制张量编码器(分块编码 + 分层量化 + 算术编码)。
推理期数据服务(§2.5):四个操作
存储到计算节点之后、模型实际消费之前的预处理。
1. 数据 Shuffle / 供给
训练期对抗灾难遗忘,数据供给三路:
- 样本打分式:EL2N —— 一句话:用「预测与真值的误差范数期望」给样本打分,定期剪掉误差大的。χ(xᵢ,yᵢ) = E‖f(xᵢ) − yᵢ‖₂;扩展版用 EMA 平滑 χ̂ ← α·χ̂_nlu + (1−α)·χ̂_ema。
- 模型状态式:
- MoSo —— 一句话:看「移除样本 z 对训练 loss 的影响」——z 的梯度与全集平均梯度持续同向则重要;
- Velocitune —— 一句话:按「学习速度」动态调域采样权重——学得慢的域多喂。V_t[i] = (ℓ_t[i]−ℓ_target[i])/(ℓ_init[i]−ℓ_target[i])(ℓ_target 由 scaling law 预测);
- ODM —— 一句话:把每个数据域当一条臂、训练 loss 当奖励,多臂老虎机在线调配比;
- MOS:打分网络 + RL 按模型当前学习状态调采样概率。
- 经验策略式:合理的学习节奏安排而非改数据。
RAG 期 = 知识过滤 + 重排序(度量式 / LLM 式 re-rank)。
2. 数据压缩
- RAG 知识压缩:规则式(RECOMP、CompAct、FAVICOMP——预定义规则/模板抽关键信息去冗余)vs 软提示式(xRAG 的模态投影器 W、COCOM 整体训练——可学习参数隐式学向量,模型处理输入时动态调注意力权重)。
- Prompt 压缩(CoT/上下文学习/RAG 越复杂 prompt 越长 → 延迟、成本、超长三重问题):
- LLMLingua —— 一句话:小模型算每 token 困惑度,删「模型参数里已存知识能预测出来」的冗余 token;
- LongLLMLingua —— 一句话:双粒度(文档级先滤关键信息、token 级精修),按文档重要性分配不同压缩预算;
- LLMLingua-2 —— 一句话:把压缩重定义成 token 分类任务训专门模型,压缩忠实原文;
- gisting —— 一句话:训 LM 把 prompt 压成可缓存复用的「要点 token」,压缩率最高 26×;
- AutoCompressor:长上下文压成摘要向量,再在摘要向量上继续训练模型参数。
3. 数据 Packing
一句话总纲:短样本拼接填充提高吞吐,核心难题是「减 padding 的同时别截断、别引入跨文档噪声」。
- Best-fit Packing —— 一句话:长文档切块按长度降序,每块装进「剩余容量最小」的能容纳它的训练序列(装箱问题的 best-fit 启发式);
- 贪心式(长文档优先、短段填空隙,减 padding 也减跨文档拼接噪声);
- SPFHP(长度直方图、长到短、worst-fit 放进剩余最大的 pack、限制 packing 深度);
- NNLSHP(packing 问题转非负最小二乘,动态规划枚举组合策略 + 短序列残差低权重);
- 分桶 + VSL 课程(按长度分桶保同桶同文档防跨文档注意力问题 + 变长课程动态采样保总 token 数);
- 语义式 —— 一句话:不按长度按语义拼——随机选根文档,BFS 用 BM25/Contriever 检索相似文档拼到满长(SPLICE),语义相关文档拼成连贯上下文让模型跨文档推理。
4. 数据溯源(Provenance)
一句话总纲:只在推理阶段标记(Table 1)——回答可追溯到知识来源,是 RAG 可信度的基石。
- Bileve —— 一句话:双层信号——全局统计信号验「是否出自特定模型」+ 内嵌签名验「是否被篡改」,先验签名、签名无效再做统计检验;
- PRF 水印 —— 一句话:伪随机函数决定每个输出词的洗牌方式——生成文本与原输出统计不可区分,持钥者才能检出,保输出质量;
- UPV —— 一句话:双独立神经网络水印,检测不需要生成时的密钥——消除密钥泄漏风险。
记忆锚点
- Table 1 里最有信息量的两行:KV Cache 是推理/RAG 阶段独有的存储问题;Provenance 是推理阶段独有的服务问题。
- 训练数据岗与这章的交集主要是三处:数据格式选型(管道产出的数据放哪、什么格式喂训练集群)、数据分发(JuiceFS/3FS 这类对象存储方案)、数据移动(缓存与预处理卸载——管道吞吐的隐性瓶颈)。
