MindSpeed-LLM 数据预处理完整指南:预训练与SFT数据一键转换实操
【免费下载链接】MindSpeed-LLM昇腾LLM分布式训练框架项目地址: https://gitcode.com/Ascend/MindSpeed-LLM
MindSpeed-LLM(昇腾LLM分布式训练框架)通过一条preprocess_data.py命令,即可将原始文本数据一键转换为预训练和 SFT(监督微调)可用的二进制索引格式,覆盖 Alpaca、ShareGPT、多轮对话、DPO 配对等多种数据风格。本文面向新手,手把手演示从数据准备到转换输出的完整流程,帮你快速跑通昇腾环境下的模型数据管道。
🧭 为什么需要数据预处理?
大模型训练不直接吃"原始文本",而是先经过:
原始数据(json/parquet 等)→ 分词(Tokenizer)→ 模板拼接(Prompt Template)→ 二进制索引(.bin + .idx)
这一步决定了训练时的读取效率和训练效果。MindSpeed-LLM 将这一整套流程封装在入口脚本 preprocess_data.py 中,底层由 data_handler.py 提供二十余种数据处理器(Handler),你只需选择对应的处理器名称即可。
📦 准备工作:环境与数据
1️⃣ 加载昇腾环境变量(按实际安装的 Toolkit 路径修改):
source /usr/local/Ascend/ascend-toolkit/set_env.sh2️⃣ 准备两样东西:
- 原始数据集:支持
.parquet / .csv / .json / .jsonl / .txt / .arrow格式,可以是一个文件,也可以是一个目录(目录则批量处理全部文件) - 模型词表目录:如
./model_from_hf/qwen3_hf/,用于分词
官方文档提供了常见数据集的下载方式,可参考 预训练数据集处理文档 与 Alpaca风格文档。
🚀 场景一:预训练数据一键转换
预训练数据最简单——只需要一个text文本列。以 Qwen3 为例,项目内置脚本为 data_convert_qwen3_pretrain.sh:
python ./preprocess_data.py \ --input ./dataset/train-00000-of-00042-d964455e17e96d5a.parquet \ --tokenizer-name-or-path ./model_from_hf/qwen3_hf/ \ --tokenizer-type PretrainedFromHF \ --handler-name GeneralPretrainHandler \ --output-prefix ./dataset/enwiki \ --json-keys text \ --workers 4 \ --log-interval 1000关键参数解读:
| 参数 | 作用 | 新手提示 |
|---|---|---|
--handler-name | 数据处理器 | 预训练固定用GeneralPretrainHandler |
--json-keys | 提取的列名 | 默认text,多列可写多个 |
--tokenizer-type | 分词器类型 | PretrainedFromHF表示用 HF 模型目录 |
--output-prefix | 输出文件前缀 | 会生成xxx_document.bin/.idx文件 |
--workers | 并行进程数 | 数据量大时可调大加速 |
其他模型的预训练转换脚本都遵循examples/mcore/模型名/data_convert_xxx_pretrain.sh的命名规范,可参考 DeepSeek4 数据转换脚本。
🗣️ 场景二:SFT 指令微调数据转换
SFT 数据比预训练多一步:按模型对话模板拼接 prompt。以 Alpaca 风格单轮指令数据为例:
python ./preprocess_data.py \ --input ./dataset/train-00000-of-00001-a09b74b3ef9c3b56.parquet \ --tokenizer-name-or-path ./model_from_hf/qwen25_hf/ \ --output-prefix ./finetune_dataset/alpaca \ --handler-name AlpacaStyleInstructionHandler \ --tokenizer-type PretrainedFromHF \ --workers 4 \ --prompt-type qwen \ --pack --neat-pack \ --seq-length 4096新手必懂的 3 个 SFT 要点:
①--prompt-type决定对话模板
模板定义了模型"长什么样",内置选项包括qwen、qwen3、llama3、chatml、glm4、deepseek3等 30 余种,完整清单见 templates.json。请务必选择与目标模型一致的模板。
②--map-keys解决字段对不上的问题
Alpaca 风格默认列名为instruction / input / output。如果你的数据集列名不同(比如question / answer),用字段映射解决,例如 DPO 场景下的 data_convert_llama2_pairwise.sh:
--map-keys '{"prompt":"question", "query":"", "system":"system"}'③--pack --neat-pack提升训练效率
把多条短样本打包进一条 4096 长度的序列,显著减少通信开销,适合样本普遍偏短的场景,参考 Qwen2.5 打包脚本。
🔧 进阶:常见数据风格速查
| 数据风格 | handler-name | 典型场景 |
|---|---|---|
| 单轮指令(Alpaca) | AlpacaStyleInstructionHandler | 最常见的 SFT 格式 |
| 多轮对话(ShareGPT) | SharegptStyleInstructionHandler | 多轮对话数据 |
| 预训练纯文本 | GeneralPretrainHandler | 大规模语料 |
| DPO 偏好对 | AlpacaStylePairwiseHandler | 偏好对齐训练 |
| 思考链(CoT) | R1AlpacaStyleInstructionHandler | 推理模型训练 |
更多处理器的实现都集中在 data_handler.py,ShareGPT 风格数据格式详见 官方文档。
💡多轮对话训练小技巧:Qwen3 等推理模型建议加
--enable-thinking true(见 data_convert_qwen3_instruction.sh),开启思考模式的数据构建。
✅ 转换结果与常见坑
转换成功后,--output-prefix目录下会生成.bin(token 数据)和.idx(偏移索引)成对文件,训练脚本中通过--data-path直接引用即可。
新手常见 3 个坑:
--output-prefix所在目录必须已存在,否则会报错,先mkdir -p创建- 模板选错会导致训练 loss 异常:
--prompt-type必须匹配模型,不确定时对照 supported_models.md - 超长样本会被截断:超过
--seq-length的样本默认丢弃,日志中会出现Dropped lengthy example警告,属正常现象
📚 小结
MindSpeed-LLM 的数据预处理核心就一句话:选对 Handler + 配好模板 + 指定词表路径,一条命令完成转换。
- 预训练 →
GeneralPretrainHandler,最简单 - SFT →
AlpacaStyleInstructionHandler/SharegptStyleInstructionHandler+--prompt-type - 大吞吐 → 加
--pack --neat-pack打包
准备好数据后,即可进入 预训练入门 开启正式训练。祝训练顺利!🎉
【免费下载链接】MindSpeed-LLM昇腾LLM分布式训练框架项目地址: https://gitcode.com/Ascend/MindSpeed-LLM
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考