Chapter 08
数据流水线:Nanoset 与 token packing
预训练数据加载是性能关键。nanotron 有自家 Nanoset 格式(类似 Megatron 的 indexed dataset)+ 直接吃 HF dataset 两条路。
8.1两种数据加载方式
| HF dataset 直读 | Nanoset (preprocessed) | |
|---|---|---|
| 预处理 | 无 | 预 tokenize + mmap |
| 启动时间 | 慢(第一次 tokenize) | 快 |
| 规模 | ≤ 数十 GB | TB 级也可 |
| 多源 blend | 支持 | 支持(带 weight) |
8.2HF dataset 直读(简单场景)
data_stages:
- name: simple
start_training_step: 1
data:
dataset:
hf_dataset_or_datasets: stas/openwebtext-10k
hf_dataset_splits: train
text_column_name: text
num_loading_workers: 4
seed: 42
8.3Nanoset:预处理 + mmap
大语料用这条路。预处理脚本看 tools/preprocess_data.py:
python tools/preprocess_data.py \
--input ./raw/pile_chunk_001.jsonl \
--output-prefix ./nanoset_data/pile_001 \
--tokenizer-name-or-path meta-llama/Llama-3-8B \
--workers 32 \
--append-eod
产物 ./nanoset_data/pile_001_text.bin + .idx,跟 Megatron indexed dataset 兼容。
训练时引用
data_stages:
- name: stage_pretrain
start_training_step: 1
data:
dataset:
dataset_folder: ./nanoset_data
# 自动扫描 .bin/.idx 文件
num_loading_workers: 8
8.4多源 blend
data_stages:
- name: pretrain_mix
start_training_step: 1
data:
dataset:
dataset_folder:
- path: ./web_data
weight: 0.7
- path: ./code_data
weight: 0.25
- path: ./math_data
weight: 0.05
num_loading_workers: 8
8.5token packing
nanotron 默认对预训练数据做 packing:把多个文档拼到 max_seq_len,文档之间加 EOS 分隔。
注意:预训练 packing 通常不严格 mask 跨文档 attention(OPT 论文做法),因为只是为了塞满序列。如果想严格 mask 用 use_doc_eod_attn_mask=True(部分版本)。
8.6data sampler / shuffle
nanotron 用 BlendableDataset + 确定性 shuffle,保证:
- 不同 DP rank 看不同 sample;
- seed 固定时完全可复现;
- resume 后从同一 sample 接着读。
8.7实战经验
| 场景 | 推荐 |
|---|---|
| 验证 / 小模型 | HF dataset 直读 |
| ≥ 10B token 预训练 | Nanoset |
| 多源混合 | 多 dataset_folder + weight |
| 分阶段切换 | multi data_stages |
8.8常见踩坑
| 现象 | 处理 |
|---|---|
| 第一次启动巨慢 | HF dataset 在 tokenize;增 num_proc 或预处理成 Nanoset |
| 多 rank 看同样数据 | seed 没设;查 sampler 是 BlendableDataset |
| data 不够用 | nanotron 会重复采样,对 PT 是正常的 |
| 权重失衡 | 检查 weight 和;weight 决定采样概率而非实际数据量 |
8.9这章你需要带走的
- 两种数据路径:HF dataset 直读 vs Nanoset 预处理;
- 大规模用 Nanoset,跟 Megatron indexed 格式兼容;
- 多源 blend 用 dataset_folder + weight;
- multi data_stages 实现分阶段切换数据。