数据预处理是大语言模型训练与微调流程中决定效果与效率的关键环节。MindSpore Transformers 提供面向 LLM 的一站式数据预处理能力,支持预训练语料、指令微调、多轮对话三类场景,通过统一接口完成文本清洗、格式标准化、分词编码、Mask 构建、序列截断 / 补齐、二进制序列化等全流程操作,可直接生成 MindRecord 或 BIN 格式供训练加载。本文系统介绍预处理架构、核心流程、关键配置与可直接运行的完整代码,严格遵循昇腾社区博客格式。

一、LLM 数据预处理定位与价值

大模型对数据格式、长度分布、掩码规则、分词一致性要求极高,预处理质量直接影响收敛速度、生成质量与稳定性。

1.1 预处理核心目标

  • 格式统一:将 JSON、JSONL、txt、对话数据转为框架可解析结构
  • 文本净化:去重、去噪、过滤低质量、超长文本
  • 分词编码:使用模型对应 Tokenizer 生成 input_ids、attention_mask
  • 长度管控:按 max_seq_length 截断、补齐,保证批次对齐
  • 掩码构建:生成 CausalLM 所需下三角掩码
  • 高效存储:输出 MindRecord/BIN 格式,提升 IO 与训练吞吐

1.2 MindSpore Transformers 预处理优势

  • 开箱即用:内置 Alpaca、ShareGPT、Wiki 等主流数据集处理脚本
  • 多场景覆盖:预训练、SFT、对话、RLHF 全场景适配
  • 高性能:多进程并行、大文件分片、内存友好
  • 昇腾协同:与训练流水线无缝对接,减少数据搬运
  • 可扩展:支持自定义清洗规则、Prompt 模板、数据集格式

二、整体架构与标准流程

预处理采用模块化流水线设计,用户只需配置路径、长度、Tokenizer 即可一键运行。

2.1 标准流水线

  1. 原始数据加载 → 2. 格式转换与对话结构化 → 3. 文本清洗过滤
  2. Prompt 模板拼接 → 5. Tokenizer 编码 → 6. 长度截断 / 补齐
  3. 构建 Mask 与标签 → 8. 保存为 MindRecord/BIN → 9. 配置文件对接训练

2.2 两类核心输出格式

  • MindRecord:适合微调、小 / 中规模数据,便于调试
  • BIN+IDX:适合大规模预训练,IO 效率更高

三、环境准备与依赖安装

# 配置昇腾源
pip config set global.index-url https://pypi.mindspore.cn/simple

# 安装核心库
pip install mindspore>=2.4.0
pip install mindspore-transformers>=0.4
pip install datasets fastchat sentencepiece tqdm pandas

# 克隆工具箱
git clone https://gitee.com/mindspore/mindformers.git
cd mindformers

四、指令微调(SFT)数据预处理实践(Alpaca)

以最常用的 Alpaca 指令数据为例,完整演示 SFT 预处理流程。

4.1 步骤 1:格式转换(对话结构化)

# 转换为统一对话格式
python tools/dataset_preprocess/llama/alpaca_converter.py \
--data_path ./data/alpaca_data.json \
--output_path ./data/alpaca_conversation.json

输出结构:{"id":"1", "conversations": [{"from":"human", "value":"..."}, {"from":"gpt", "value":"..."}]}

4.2 步骤 2:分词编码 + 生成 MindRecord

# 生成可训练格式
python tools/dataset_preprocess/llama/llama_preprocess.py \
--dataset_type qa \
--input_glob ./data/alpaca_conversation.json \
--model_file ./tokenizer.model \
--seq_length 4096 \
--output_file ./data/alpaca_4096.mindrecord

参数说明:

  • dataset_type:qa/dialogue 对应单轮 / 多轮
  • seq_length:模型最大长度
  • model_file:Tokenizer 路径

五、预训练数据预处理实践

预训练使用纯文本生成 BIN 格式,支持多源混合、大语料高效处理。

5.1 文本转 BIN 格式

python tools/dataset_preprocess/preprocess_indexed_dataset.py \
--input ./data/pretrain_text.json \
--output ./data/pretrain_bin \
--tokenizer_path ./tokenizer.model \
--max_seq_len 4096 \
--workers 8

输入格式:{"id":"0", "text":"..."}

输出:pretrain_bin.bin + pretrain_bin.idx,可直接配置到 train.yaml

5.2 训练配置加载

dataset:
  data_loader:
    type: TextDataset
    file_path: ./data/pretrain_bin

六、通用自定义预处理代码(可直接运行)

适用于自有数据集,实现清洗→分词→对齐→保存全流程。

import json
import mindspore as ms
from mindformers import AutoTokenizer

# ====================== 配置 ======================
model_name = "llama_7b"
max_seq_len = 4096
input_file = "./my_data.json"
output_file = "./my_data.mindrecord"
# ===================================================

tokenizer = AutoTokenizer.from_pretrained(model_name)
writer = ms.record.FileWriter(output_file, overwrite=True)
schema = {
    "input_ids": [ms.int32, -1],
    "attention_mask": [ms.int32, -1],
    "labels": [ms.int32, -1]
}
writer.add_schema(schema)

def process_one(sample):
    # 1. 清洗
    text = sample["text"].strip()
    if len(text) < 20:
        return None
    # 2. 编码
    tokens = tokenizer(
        text,
        max_length=max_seq_len,
        padding="max_length",
        truncation=True
    )
    # 3. 构建标签
    labels = tokens["input_ids"].copy()
    return {
        "input_ids": tokens["input_ids"],
        "attention_mask": tokens["attention_mask"],
        "labels": labels
    }

# 读取与写入
with open(input_file, "r", encoding="utf-8") as f:
    data = json.load(f)

for sample in data:
    feat = process_one(sample)
    if feat:
        writer.write_raw_data([feat])

writer.commit()
print("预处理完成,输出:", output_file)

七、关键配置与注意事项

  1. Tokenizer 必须与模型匹配,不同模型不可混用
  2. seq_length 必须与训练配置一致,否则 shape 不匹配
  3. 微调数据建议长度:2048/4096;预训练建议:4096/8192
  4. 多进程 workers 根据 CPU 核数设置,不宜超过 32
  5. 预处理前务必去重、过滤短文本、空文本、乱码行
  6. 对话数据必须统一为human/gpt轮次结构
  7. 预训练优先使用 BIN 格式,微调优先使用 MindRecord
  8. 训练前建议查看样本长度分布,避免大量截断导致信息丢失

八、总结

MindSpore Transformers 提供标准化、模块化、高性能的 LLM 数据预处理体系,覆盖预训练、SFT、多轮对话全场景,支持一键生成 MindRecord/BIN 格式,与昇腾训练流程无缝对接。通过统一的分词、长度管控、掩码构建、清洗规则,大幅降低数据层面导致的不收敛、Nan、效果差等问题。本文提供的脚本与代码可直接用于生产环境,帮助开发者快速完成从原始数据到可训练数据集的全流程搭建。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐