Chapter 06
数据准备:NeMo data preprocessing 流程
NeMo 预训练用的是 Megatron 风格的 indexed dataset(.bin + .idx),SFT/PEFT 用 HF 风格 jsonl。本章把两条路都走一遍。
6.1indexed dataset 格式
Megatron 风格的 .bin + .idx 是预 tokenize + memory-mapped 的格式:
xxx.bin:所有 token id 按 uint32 顺序紧密排列;xxx.idx:每条文档的起止 offset、长度、类型信息。
优势:
- 训练时只做随机 seek,不 tokenize(已经预处理过);
- mmap 让多卡共享同一份 OS page cache;
- 支持 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_megatron | nemo/collections/nlp/data/language_modeling/megatron/preprocess_data_for_megatron.py | jsonl → bin/idx |
| get_tokenizer | nemo/collections/common/tokenizers/ | SentencePiece / HF / TikToken 统一封装 |
| NeMo Curator | 独立子项目 | 大规模数据清洗(去重 / 过滤 / 分类) |
6.7NeMo Curator:数据清洗工具
预训练数据需要的清洗(去重、过滤、分类、PII 删除)量大且重复。NeMo Curator 提供 GPU 加速的工具集:
- FuzzyDeduplication:MinHash + LSH 去重,能在 8 卡 1 小时清 1TB;
- QualityClassifier:基于 fastText 的质量过滤;
- LanguageIdentifier:fastText 语言识别;
- PIIRedaction:删除邮箱/电话等 PII。
独立仓库 NVIDIA/NeMo-Curator,跟 NeMo 主仓配合使用。
6.8常见错误
| 现象 | 处理 |
|---|---|
| preprocess 巨慢 | --workers 32 |
| bin 文件读不出来 | tokenizer 跟训练时不一致;保存 tokenizer 一起 |
| train loss 突然飙升 | data_prefix 比例失衡;某个语料 token 总数不够 |
| shuffle 慢 | NeMo 用 deterministic shuffle,第一次会建索引 |
6.9这章你需要带走的
- 预训练用 indexed (.bin/.idx),SFT 用 jsonl;
- indexed 是 mmap + 预 tokenize 格式,TB 级语料友好;
- 多语料混合用
data_prefix: [weight, path, weight, path]列表; - 预处理慢就开
--workers 32; - 大规模数据清洗用 NeMo Curator。