Chapter 08

数据流水线:Nanoset 与 token packing

📌 commit 2411b02预 tokenize + memory-mapped + 多语料 blend

预训练数据加载是性能关键。nanotron 有自家 Nanoset 格式(类似 Megatron 的 indexed dataset)+ 直接吃 HF dataset 两条路。

8.1两种数据加载方式

HF dataset 直读Nanoset (preprocessed)
预处理预 tokenize + mmap
启动时间慢(第一次 tokenize)
规模≤ 数十 GBTB 级也可
多源 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,保证:

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这章你需要带走的