高效数据加载管道
Efficient Data Loading Pipeline
面向大规模预训练的分布式数据加载与文档打包策略
子问题
1.文档打包算法(best-fit vs greedy)
2.BOS 对齐保证完整上下文
3.pinned memory 与异步传输
4.多 epoch 无限迭代与断点恢复
5.row_capacity = T+1 的 next-token prediction 移位设计
6.buffer 搜索最大适配 vs 裁剪最短文档的策略选择
7.inputs/targets 共享连续内存的单次 HtoD 传输优化
各项目的解法1 solutions
Signals
横向对比
| 维度 | nanochat |
|---|---|
| 管道架构 | 三层管道:Parquet 迭代 → Best-Fit 打包 → pinned memory HtoD |
| 特征类型 | BOS 对齐 token 序列,100% 利用率零 padding |
| 并发模型 | DDP rank 交错 row_group + tokenizer 多线程编码 |
| 数据模型 | Parquet row_group 为最小读取单元,文档为打包单元 |
| 可替换性 | dataloader 独立模块,接口为 Iterator[inputs, targets, state_dict] |
| 容错策略 | state_dict 断点恢复 + 数据下载指数退避重试 |
| 打包算法 | Best-Fit(buffer 搜索最大适配)+ 裁剪最短文档填充 |
| 内存管理 | 预分配 pinned CPU + GPU buffer,单次 non_blocking copy |
最佳实践
1.Best-Fit 打包实现 100% 利用率零 padding
2.预分配 pinned memory + GPU buffer 消除每 batch 内存分配开销
3.DDP rank 交错 row_group 实现零通信开销数据分片
4.裁剪最短文档而非随机文档以最小化 token 浪费