MindSpore 大模型预训练文本切分组件面向基座大模型预训练、续训场景,完成原始文档、网页、书籍等非结构化原始文本清洗、分词、文档切分、序列拼接 Pack,输出符合模型上下文长度的训练样本。解决原始文档长短参差不齐、长文档截断丢失语义、短文档大量 padding 浪费算力、文档边界混淆等痛点,支持 Megatron 二进制索引数据集、MindRecord 等格式输出,适配 MindSpeed‑LLM 分布式预训练流水线,在昇腾 NPU 集群实现高效的大模型预训练数据制备。

一、框架定位与核心价值

原始文本是长短不一的自由文档,而 Transformer 预训练要求输入是固定seq‑length长度 token 序列。直接粗暴截断会丢失长文本上下文,简单 padding 会造成大量算力浪费,文档之间边界不隔离会造成跨文档语义混淆。MindSpore 配套预处理组件提供完整的原始文本到训练样本全链路能力。核心价值如下:

● 完整文本处理链路:支持清洗过滤、分词、长文档切分、短文档 Pack 拼接、构建 loss 掩码,一步生成训练样本。

● 降低算力浪费:Sequence‑Pack 技术将多个短文档填充至完整序列长度,减少 padding 占比,提升有效 token 占比。

● 文档边界隔离:EOS 标记 + attention 掩码隔离不同文档,防止跨文档信息泄露。

● 多格式输出:支持 Megatron bin/index 二进制、MindRecord、jsonl,兼容 MindSpeed‑LLM 训练流水线。

● 大规模分布式友好:支持多进程并行预处理,输出分片数据集,适配多机多卡预训练。

二、总体架构与工作流

2.1 四层架构

1. 硬件层:昇腾 Ascend 910/310P NPU 集群,存储用于存放原始语料与预处理后数据集。

2. 原始语料层:原始文本源,txt、jsonl、网页爬取文档、开源语料库。

3. 文本预处理切分层:文本清洗过滤、Tokenizer 分词器、长文档滑动切分、序列 Pack 拼接、样本格式化、数据集序列化导出。

4. 业务应用层:LLM 基座预训练、模型继续预训练,对接 MindSpeed‑LLM 训练迭代。

2.2 标准执行流程

1. 原始语料清洗过滤:过滤脏字符、低质量文档、超长空行,输出干净文档列表。

2. 文档分词:调用对应模型 Tokenizer,每篇文档转为 token id 列表,文档末尾追加 EOS 结束符。

3. 长文档滑动切分:超过seq‑length的长文档使用滑动窗口切分为多个子片段,保留上下文重叠或无重叠两种模式。

4. 序列 Pack 拼接:多个短文档 token 片段,按贪心 Pack 策略填充至目标序列长度,生成完整 inputids,同时生成 attentionmask 隔离文档边界。

5. 构造预训练样本:构造 inputids、labels,因果语言模型 labels 与 inputids 保持一致。

6. 序列化落盘:输出二进制索引数据集 / MindRecord,生成索引文件,用于训练阶段随机高效读取。

三、核心组件介绍

3.1 文本清洗过滤组件

对原始原始文档做预处理过滤。

● 过滤乱码、特殊符号、重复文档、过短无效文本。

● 去除多余换行、空格,保留段落基本格式。

● 支持配置黑名单,过滤违规内容。

3.2 Tokenizer 分词适配模块

对接 MindFormers 预训练分词器。

● 支持 Llama、Qwen、DeepSeek 等主流 BPE 分词器。

● 自动添加 EOS/BOS 特殊 token;可配置文档末尾强制追加 EOS。

● 多进程并行分词,加速千万级文档处理速度。

3.3 长文档滑动切分器

处理超过模型最大序列长度的文档。

● 无重叠切分:直接按 seq‑length 截断,适合通用预训练。

● 滑动窗口带重叠切分:设置overlap_size,相邻片段保留部分 token 重叠,减少语义割裂。

● 输出若干子 token 片段,每个片段不超过最大序列长度。

3.4 Sequence‑Pack 序列拼接器

预训练核心组件,把多个短文档合并到同一个样本序列内。

● 贪心 Pack 算法:不断向当前序列追加文档片段,直到填满seq‑length。

● 文档边界隔离:每个文档结尾放置 EOS;生成 pack attention_mask,禁止不同文档之间互相 attention。

● 降低 padding token 数量,提升 GPU/NPU 有效算力利用率。

3.5 样本格式化生成器

生成因果预训练标准样本。

● input_ids:拼接完成的 token id 序列。

● labels:自回归预训练 labels 与 input_ids 保持一致。

● attention_mask:pack 场景用于隔离文档边界;普通 padding 场景用于屏蔽 pad token。

3.6 数据集序列化导出器

支持多种标准大模型数据集格式输出。

● Megatron bin/index:二进制 token 数据 + 偏移索引,大模型预训练行业通用格式,支持 mmap 内存映射随机访问。

● MindRecord:MindSpore 原生高性能格式。

● jsonl 调试格式:方便人工查看样本,仅用于小数据集调试。

四、环境安装(可直接运行)

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

# 安装基础框架
pip install "mindspore>=2.4.0"
pip install mindformers

# 克隆MindSpeed‑LLM仓库,使用配套预处理脚本
git clone https://gitee.com/ascend/MindSpeed‑LLM.git
cd MindSpeed‑LLM
pip install -e .

五、端到端实战代码(原始文本切分示例)

5.1 文档分词与长文档切分

from mindformers import AutoTokenizer

# 加载分词器
tokenizer = AutoTokenizer.from_pretrained("qwen2‑7b")
seq_length = 1024
overlap_size = 128

def split_long_doc(token_ids, max_len, overlap):
    """滑动窗口切分长文档token列表"""
    chunks = []
    start = 0
    doc_eos = tokenizer.eos_token_id
    while start < len(token_ids):
        end = start + max_len - 1
        chunk = token_ids[start:end]
        chunk.append(doc_eos)
        chunks.append(chunk)
        start = start + (max_len - overlap)
    return chunks

# 原始文档文本
raw_text = """此处为一大段原始文章文本……"""
encode_res = tokenizer(raw_text)
doc_token_ids = encode_res["input_ids"]
doc_chunks = split_long_doc(doc_token_ids, seq_length, overlap_size)

5.2 Sequence‑Pack 贪心拼接实现

def greedy_pack(chunk_list, max_seq_len, eos_id):
    packed_samples = []
    current = []
    for chunk in chunk_list:
        if len(current) + len(chunk) <= max_seq_len:
            current.extend(chunk)
        else:
            # 保存当前样本
            packed_samples.append({"input_ids": current})
            current = chunk
    if len(current) > 0:
        packed_samples.append({"input_ids": current})
    return packed_samples

# 将切分后的片段pack为完整样本
samples = greedy_pack(doc_chunks, seq_length, tokenizer.eos_token_id)
for s in samples:
    s["labels"] = s["input_ids"].copy()

5.3 调用官方预处理脚本,生成 Megatron bin/index 数据集

# 原始输入jsonl,每一行{"text":"文档内容"}
python mindformers/tools/dataset_preprocess/preprocess_indexed_dataset.py \
--input ./raw_corpus.jsonl \
--output‑prefix ./pretrain_data_1024 \
--tokenizer‑type QwenTokenizer \
--seq‑length 1024 \
--pad_or_stitch stitch \
--add_eos_token True \
--workers 8

5.4 预训练启动脚本,加载预处理完成的二进制数据集

bash msrun_launcher.sh \
"python pretrain_gpt.py \
--config configs/llm/qwen_pretrain.yaml \
--dataset‑path ./pretrain_data_1024 \
--seq‑length 1024 \
--mode train \
--device Ascend" 8

六、关键优化与注意事项

1. 长文档滑动窗口 overlap 调优
overlap 过大,样本数量爆炸;overlap=0 为无重叠切分。通用基座预训练一般设置为 seq‑length 的 10%‑20%。

2. Sequence‑Pack 必须配套正确 attention_mask
Pack 把多篇文档放入同一个序列,必须生成 mask 禁止跨文档 attention,否则模型会学习文档之间虚假关联,严重损害预训练效果。

3. EOS 追加策略
每一篇独立文档结束必须追加 EOS token;不要只在整个 pack 样本最后加一个 EOS,会破坏文档边界语义。

4. 预处理与训练 seq‑length 必须严格一致
预处理阶段使用的 seq‑length 必须和训练 yaml 配置 seq‑length 完全相同;不允许预处理 1024,训练跑 2048。

5. 多进程预处理注意内存
千万级文档预处理,开大 workers 会占用较高内存;根据机器内存调整 worker 数量,防止 OOM。

6. 区分基座预训练与 SFT 指令数据
本流程面向基座预训练原始无标注文本;SFT 指令微调不能使用这套文档 Pack 逻辑,需要使用 Prompt 模板组件处理样本。

7. 数据集 shuffle 时机
离线预处理阶段完成全局 shuffle,不要只做样本内打乱;二进制索引数据集训练阶段再做索引层 shuffle。

8. 样本校验
预处理完成后随机读取若干样本,decode 回文本人工校验,确认文档切分、EOS、pack 拼接是否符合预期。

七、典型应用场景

● LLM 基座预训练:海量网页、书籍、百科原始语料,清洗分词切分 pack,生成二进制预训练数据集,昇腾集群大规模预训练。

● 大模型继续预训练(续训):行业领域原始文档,做领域续训数据制备。

● 开源数据集格式转换:开源 txt/jsonl 语料转换为 MindSpore/MindSpeed 可直接读取的 bin/index 数据集。

● 多语种语料预处理:多语言原始文档,完成清洗、分词、切分,产出多语言基座训练样本。

● 数据质量调试:输出 jsonl 调试样本,查看切分、pack 效果,用于数据质量排查。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐