AI 数据管线¶
背景知识
所有 ML 系统都需要数据管线(data pipeline):把原始数据变成模型可消费的张量,再把模型输出变回有意义的结果。但"数据管线"远不止预处理——从原始数据的采集和整理,到训练时的高效供给,再到模型输出反哺下一轮训练,整条链路的每个环节都有独立的技术问题。
全景:端到端数据流¶
graph LR
subgraph "上游:语料工程"
A[原始数据源] --> B[采集 / 爬取]
B --> C[清洗 / 去重 / 过滤]
C --> D[质量评估与混合]
end
subgraph "中游:预处理与变换"
D --> E[Schema 映射]
E --> F[模态预处理]
F --> G[归一化 / 增强]
G --> H[Batch 化]
end
subgraph "下游:训练供给"
H --> I[DataLoader / Streaming]
I --> J[GPU 训练]
end
subgraph "反馈环"
J --> K[模型输出]
K --> L[评估 / 人类反馈]
L --> A
end
| 环节 | 核心问题 | 技术关注点 |
|---|---|---|
| 语料工程 | 原始数据 → 高质量训练语料 | 去重、过滤、混合配比、合成数据 |
| 预处理与变换 | 多源异构 → 统一张量 | Schema 对齐、模态转换、归一化、增强 |
| 训练供给 | 存储 → GPU 无断流 | I/O 流水线、格式选型、流式/物化权衡 |
| 反馈环 | 模型输出 → 新训练数据 | RLHF、合成数据、主动学习 |
语料工程:从原始数据到训练语料¶
训练数据的质量直接决定模型能力上限。语料工程的核心挑战不是"获取数据",而是从海量噪声中提炼高质量信号。
去重¶
重复数据导致模型在重复样本上过拟合、浪费算力,且劣化泛化能力1。
| 方法 | 原理 | 适用场景 | 权衡 |
|---|---|---|---|
| 精确去重 | 文档级 hash(MD5/SHA) | 完全相同的副本 | 快但漏掉近似重复 |
| MinHash + LSH | \(k\) 个哈希函数估计 Jaccard 相似度,LSH 分桶加速检索 | 近似重复(转载、轻微编辑) | 概率性,可调 false positive/negative |
| 后缀数组 | 找出共享的长子串(如 50+ token 重复片段) | 段落级抄袭、模板文本 | 内存高,适合离线批处理 |
| 语义去重 | Embedding 空间聚类,去除语义重复 | 同一事件的不同报道 | 依赖 embedding 质量,计算成本高 |
实践中通常分层组合:先精确去重(\(O(n)\)),再 MinHash 过滤近似重复(\(O(n)\)),最后可选语义去重。
质量过滤¶
| 策略 | 做法 | 权衡 |
|---|---|---|
| 基于困惑度 | 用参考 LM(如 KenLM)评分,过滤困惑度过高/过低的文档 | 简单高效;偏向"像训练数据"的文本 |
| 分类器过滤 | 训练 fastText/BERT 分类器区分高质量(如维基百科)和低质量文本 | 灵活;分类器偏差会传导到训练数据 |
| 启发式规则 | 长度/重复率/特殊字符比例/语言检测 | 无模型依赖;规则需要大量人工调参 |
| 有害内容过滤 | 毒性分类器 + PII 正则匹配 + 黑名单 URL | 安全必需;过度过滤损失多样性 |
FineWeb2 的实践表明,过滤策略的选择比数据规模更重要——15T token 经过精细过滤后效果优于未过滤的数倍数据。
数据混合¶
预训练数据来自多个领域(网页、书籍、代码、论文、对话),混合比例直接影响模型在各领域的表现。
核心权衡:代表性 vs 质量——按自然分布混合会被低质量网页淹没,过度上采样高质量源则限制多样性。
| 策略 | 做法 | 特点 |
|---|---|---|
| 启发式加权 | 手动设定比例(如代码 10%、学术 15%、网页 60%) | 简单直接,依赖经验 |
| 温度采样 | 对数据源 \(i\) 的采样概率 \(p_i \propto n_i^{1/T}\),温度 \(T\) 控制偏离自然分布的程度 | 单参数可调,易于实验 |
| 课程学习 | 训练早期侧重多样性(高温度),后期偏向高质量源(低温度) | 兼顾覆盖面和精度,调参复杂 |
合成数据¶
当真实标注数据稀缺或成本过高时,合成数据成为关键补充:
| 类型 | 做法 | 典型场景 |
|---|---|---|
| 模型蒸馏 | 强模型生成训练数据供弱模型学习 | SFT 指令数据生成、代码生成 |
| 自我博弈 | 模型与自身或对手交互产生数据 | 数学推理、代码竞赛 |
| 仿真生成 | 物理模拟器批量生成传感器数据 | 自动驾驶、具身智能 → 详见 |
| 规则扩增 | 模板填充、回译、同义改写 | 低资源语言、数据增强 |
风险:迭代训练在自身生成的数据上会逐步丧失分布多样性(model collapse)3,需要持续混入真实数据。
预处理与变换:通用阶段模型¶
将原始数据变成模型输入张量,无论场景都经历以下逻辑阶段:
| 阶段 | 做什么 | 典型操作 |
|---|---|---|
| Schema 映射 | 统一不同数据源的命名/结构 | key 重命名、字段对齐、缺失字段填充 |
| 模态预处理 | 各模态独立清洗 | 图像 resize/crop、文本 tokenization、音频 mel-spectrogram |
| 归一化 | 拉到统一尺度 | min-max、z-score、分位数截断 |
| 时序窗口 | 组织时间维度 | 历史帧堆叠、滑动窗口、序列截断/padding |
| 表示转换 | 变换到模型期望的表示空间 | embedding 查表、离散化/连续化、坐标系变换 |
| 数据增强 | 提升泛化能力 | 随机裁剪、噪声注入、mixup |
| Batch 化 | 准备好给加速器 | collation、device placement、混合精度转换 |
这些阶段在 CV(torchvision transforms)、NLP(HuggingFace tokenizers + data collator)、语音(torchaudio pipelines)中都有对应实现,只是具体操作不同。
训练时数据供给:存储到 GPU¶
训练供给的目标是让 GPU 永远不等数据。GPU FLOPS 增速远超存储带宽增速,数据供给正在成为训练瓶颈。
流式 vs 物化¶
| 方式 | 做法 | 优势 | 劣势 |
|---|---|---|---|
| 物化数据集 | 预处理后落盘,训练时直接读取 | 训练时零预处理开销、可随机访问 | 占用大量存储,修改预处理需重新生成 |
| 流式处理 | 训练时实时读取 + 预处理 | 存储效率高、支持无限大数据集 | 难以随机打乱,预处理增加延迟 |
| 混合方案 | 关键步骤(tokenization)预物化,轻量步骤(增强)运行时做 | 平衡存储和灵活性 | 管线复杂度增加 |
存储格式选型¶
格式选型直接影响 I/O 吞吐和 GPU 利用率 → 详见结构化数据格式。
关键权衡:
- 顺序扫描(预训练)→ Parquet / WebDataset(压缩率优先)
- 随机访问(微调、强化学习)→ Lance / IndexedDataset(访问延迟优先)
- GPU 直接消费 → Arrow / Feather + GPUDirect Storage(零拷贝优先)
DataLoader 流水线¶
训练时数据加载需要多级流水线来隐藏 I/O 延迟 → 详见分布式训练数据流:
关键优化点:多 worker 并行预处理、异步 prefetch、pin_memory 加速 H2D 传输。分布式场景下还需要跨节点数据分片和 shuffle 策略,避免各 GPU 看到重复样本。
数据反馈环¶
传统管线是单向的(数据 → 模型),现代 AI 系统越来越依赖模型输出反哺数据的闭环。
RLHF / RLAIF 数据环¶
强化学习对齐引入了新的数据流模式 → 详见 LLM 训练流程:
这个环路每轮产生新的训练数据(偏好对),且数据分布随模型能力变化——模型越强,需要越难的偏好对才能继续提升。数据管线需要支持在线生成 + 实时标注 + 即时训练的快速迭代。
合成数据自举¶
模型生成的数据反哺自身训练(self-improvement loop):
- 数学/代码:模型生成解题过程 → 验证器检查正确性 → 正确样本加入训练集
- 指令跟随:强模型批量生成 SFT 数据 → 过滤后训练弱模型
- 风险:model collapse3——迭代训练在自身生成的数据上逐步丧失分布多样性
生产数据飞轮¶
部署后的模型持续生成可用于改进的信号:
核心技术问题:数据漂移检测(输入分布偏移时触发重训练)、隐私合规(用户数据脱敏)、主动学习(优先标注模型最不确定的样本,最大化标注效率)。
开环 vs 闭环:管线方向的根本差异¶
上述各环节在所有 AI 系统中都存在,但管线的方向性因系统类型而异——模型输出是给人看的还是直接驱动物理执行器的,决定了管线架构的复杂度。
开环(CV / NLP):
原始数据 → [前向管线] → 模型 → 输出给人看
↓
评估指标(accuracy, BLEU, ...)
闭环(具身 / 自动驾驶 / 工业控制):
传感器 → [前向管线] → 模型 → [逆向管线] → 执行器 → 物理世界
↑ │
└──────────── 传感器再次采集 ←──────────────────────┘
| 维度 | 开环 | 闭环 |
|---|---|---|
| 管线方向 | 仅前向 | 前向 + 逆向 |
| 逆向路径 | 不存在 | 必须把模型输出变回执行器可执行的指令 |
| 变换一致性 | 无要求 | 前向和逆向必须严格对称——归一化参数、变换顺序、有状态步骤的状态管理都必须一致 |
| 错误后果 | 指标下降 | 物理损坏、安全事故 |
| 实时约束 | 无(离线训练 + 异步推理) | 管线延迟直接影响控制频率(10-100 Hz) |
| 统计量管理 | 训练时算好即可 | 统计量必须持久化并在推理时原样加载;训练/推理不一致 = 物理失控 |
双向变换一致性——闭环管线的核心难题¶
开环系统的前向管线有 bug,最多导致精度下降。闭环系统如果前向和逆向管线不对称,模型输出的物理含义被篡改——例如训练时做了 normalize(action),推理时忘了 denormalize,机器人收到的指令完全不是模型想表达的。
在管线包含有状态变换时极易出错:相对动作转换(\(a_t^{rel} = a_t^{abs} - s_t\))需要记住当前状态 \(s_t\),前向和逆向的状态管理必须精确匹配。
主要应对模式:
| 模式 | 做法 | 代表 |
|---|---|---|
| 可逆 Transform 栈 | 每个变换自带逆操作,逆向路径自动按逆序执行 | OpenPI(具身) |
| 显式双路径管线 | forward() / inverse() 分开声明,框架运行时校验 I/O 合约 |
LeRobot4(具身) |
| 端到端模型内化 | 模型直接输出原始控制量,管线不做逆向变换 | 部分端到端自动驾驶方案 |
实时约束¶
闭环系统管线延迟直接影响控制频率,延迟超过控制周期意味着执行器在"盲飞":
- 具身操控:30-100 Hz,单帧预算 10-33ms
- 自动驾驶:10-20 Hz 决策频率,感知管线 50-100ms
- 工业控制:PLC 扫描周期 1-10ms
具身智能管线因硬件碎片化最为复杂(数百种机器人 × 异构动作空间 × 碎片化通信协议)→ 详见具身智能数据管线。
场景对比¶
不同 AI 场景的数据管线面对的核心问题分布截然不同:
| 维度 | LLM 预训练 | SFT / RLHF | 多模态 | 推荐系统 | 具身智能 | 自动驾驶 |
|---|---|---|---|---|---|---|
| 数据规模 | TB-PB | GB-TB | TB(图文对) | TB(日志) | GB(稀缺) | TB(传感器) |
| 主要瓶颈 | 语料质量与去重 | 标注质量与成本 | 模态对齐 | 特征时效性 | 硬件碎片化 | 传感器标定 |
| 管线方向 | 开环 | 开环 + 反馈环 | 开环 | 开环 + 在线特征 | 闭环 | 闭环 |
| 实时要求 | 无 | 无 | 无 | 在线特征 <100ms | 10-33ms | 50-100ms |
| 数据反馈 | 弱(版本迭代) | 强(RLHF 环路) | 中 | 极强(实时反馈) | 中(仿真回灌) | 中(corner case 采集) |
| 合成数据 | 低 → 增长中 | 高(蒸馏生成) | 中 | 低 | 高(仿真主导) | 高(仿真 + 重放) |
| 典型格式 | Parquet / JSONL | JSONL / Arrow | WebDataset / Lance | 特征存储 | HDF5 / LeRobot | ROS bag / Parquet |
参考资料¶
-
Lee et al. Deduplicating Training Data Makes Language Models Better. ACL 2022. https://arxiv.org/abs/2107.06499 ↩
-
Penedo et al. The FineWeb Datasets: Decanting the Web for the Finest Text Data at Scale. 2024. https://arxiv.org/abs/2406.17557 ↩
-
Shumailov et al. AI models collapse when trained on recursively generated data. Nature 2024. https://www.nature.com/articles/s41586-024-07566-y ↩↩
-
Cadène et al. LeRobot: End-to-End Learning for Real-World Robotics in a Million Lines of Code. ICLR 2026. https://github.com/huggingface/lerobot ↩