Chapter 06

数据准备:NeMo data preprocessing 流程

📌 commit 2ea3e0f从 jsonl 到 .bin/.idx 索引数据

NeMo 预训练用的是 Megatron 风格的 indexed dataset(.bin + .idx),SFT/PEFT 用 HF 风格 jsonl。本章把两条路都走一遍。

6.1indexed dataset 格式

Megatron 风格的 .bin + .idx预 tokenize + memory-mapped 的格式:

优势:

  1. 训练时只做随机 seek,不 tokenize(已经预处理过);
  2. mmap 让多卡共享同一份 OS page cache;
  3. 支持 TB 级语料而不爆内存。

6.2从 jsonl 生成 indexed dataset

# 原始 jsonl,每行 {"text": "...."}
python -m nemo.collections.nlp.data.language_modeling.megatron.preprocess_data_for_megatron \
    --input ./raw/pile_chunk_001.jsonl \
    --output-prefix ./bin/pile_chunk_001 \
    --tokenizer-library sentencepiece \
    --tokenizer-model ./tokenizer/llama_tokenizer.model \
    --append-eod \
    --workers 32 \
    --chunk-size 100000

跑完 ./bin/ 下生成 pile_chunk_001_text_document.bin.idx 两个文件。

6.3多语料混合 (blending)

训练时按权重混合多个 bin:

data:
  data_prefix:
    - 0.6
    - /data/web/web_text_document
    - 0.3
    - /data/code/code_text_document
    - 0.1
    - /data/math/math_text_document
  splits_string: 998,1,1     # 99.8% train / 0.1% valid / 0.1% test

实现:nemo.collections.nlp.data.language_modeling.megatron.gpt_dataset::GPTDataset。 权重决定采样概率,不是数据比例——同一文档可能被多次采到。

6.4SFT 数据:jsonl 直接喂

SFT 不用 indexed format,直接 jsonl:

{"input": "请翻译: hello", "output": "你好"}
{"input": "天空为什么蓝?", "output": "..."}

配置:

data:
  file_names: ./sft.jsonl
  prompt_template: "<|user|>\n{input}\n<|assistant|>\n{output}"
  max_seq_length: 4096
  micro_batch_size: 4

6.5chat 格式

多轮对话 NeMo 用 messages 列(兼容 HF):

{"messages": [
  {"role": "system", "content": "..."},
  {"role": "user", "content": "..."},
  {"role": "assistant", "content": "..."}
]}

chat template 在 tokenizer 配置或 model recipe 里指定,跟 HF 一致。

6.6常用预处理工具

工具脚本用途
preprocess_data_for_megatronnemo/collections/nlp/data/language_modeling/megatron/preprocess_data_for_megatron.pyjsonl → bin/idx
get_tokenizernemo/collections/common/tokenizers/SentencePiece / HF / TikToken 统一封装
NeMo Curator独立子项目大规模数据清洗(去重 / 过滤 / 分类)

6.7NeMo Curator:数据清洗工具

预训练数据需要的清洗(去重、过滤、分类、PII 删除)量大且重复。NeMo Curator 提供 GPU 加速的工具集:

独立仓库 NVIDIA/NeMo-Curator,跟 NeMo 主仓配合使用。

6.8常见错误

现象处理
preprocess 巨慢--workers 32
bin 文件读不出来tokenizer 跟训练时不一致;保存 tokenizer 一起
train loss 突然飙升data_prefix 比例失衡;某个语料 token 总数不够
shuffle 慢NeMo 用 deterministic shuffle,第一次会建索引

6.9这章你需要带走的