3.1 预训练流程
*BPE(Byte Pair Encoding)**的核心思想:从一个初始的基本单位集合出发(通常是字符或字节),不断合并最常见的相邻 token 对,直到达到词表大小上限。如果业务场景明确(例如医疗、金融、法律、工业制造),可以把高频且语义稳定的专业词汇优先进入词表,以减少拆分带来的序列膨胀,并提升模型对专业词的稳定表征能力。同时,预训练阶段一般不优先使用以“训练灵活性”为主的通用框架来替代高度
3.1 训练 Tokenizer
Tokenizer 的作用是把原始文本映射为离散 token 序列,再交给模型做自回归建模;它决定了:
- 文本被切分的粒度(字符级/子词级/词级的折中)
- 同样一段文本会被拆成多少个 token(影响训练/推理效率)
- 词表能否覆盖多语种、专业术语、符号格式(影响可学习性与泛化)
- 数字、标点、混合语言(中英夹杂)等边界情况是否稳定(影响推理可靠性)
一个直观示例(仅用于理解切分行为,不代表真实 tokenizer 输出):
- 输入:
你好世界 - 切分:
['你', '好', '世', '界']
真实 tokenizer 往往是子词级(subword),会让常见片段合并成更长 token,同时对罕见片段进行拆分,从而在“覆盖率”和“词表大小”之间取得平衡。
1)常见分词算法:BPE / BBPE / WordPiece
具体见LLM架构专栏有详细介绍。
**BPE(Byte Pair Encoding)**的核心思想:从一个初始的基本单位集合出发(通常是字符或字节),不断合并最常见的相邻 token 对,直到达到词表大小上限。
- 优点:实现简单、鲁棒,能在多语种/噪声数据里稳定工作
- 典型用途:通用大规模预训练
**BBPE(Byte-level BPE)**在 BPE 的基础上以“字节”为基本单位,天然覆盖任意字符集(中文、表情、罕见符号等)。
- 优点:不会出现“完全 OOV(词表外)字符”
- 代价:对中文等非拉丁语言,如果合并策略不够充分,可能导致 token 偏碎,序列更长
WordPiece的思想与 BPE 类似,但通常以“最大化似然/概率模型的子词组合”为目标来构造词表(实现与细节在不同框架略有差异)。
- 优点:在某些语料和训练范式下,子词边界更稳定
- 典型用途:早期 NLP 与部分现代模型体系
2)中文能力与“二次预训练”的背景
早期许多强模型的训练数据以英文为主,导致在中文任务上出现:
- 中文 token 拆分偏碎(序列过长)
- 中文常见词/专名覆盖不足
- 中英混合文本的边界处理不佳
随着中文数据规模与中文导向模型的出现,这个判断需要更谨慎:一些新模型已经具备很强的中文能力。但在工程实践里仍常见下面的路线:将英文表现优秀的模型,用中文语料继续预训练,期待把其已有的能力迁移到中文任务,并补齐中文语料与 tokenizer 方面的短板。
3)训练 tokenizer 的基本流程与机器选择
训练 tokenizer 的核心瓶颈通常是:
- 语料规模大(Common Crawl / 大规模网页 / 书籍 / 对话等混合)
- 需要多轮统计与合并(会产生高内存开销)
- 需要反复扫描大文件(I/O 也可能是瓶颈)
因此常见实践是:选择内存大的 CPU 机器,把大语料做流式统计或分片统计,最终汇总频次并训练词表。
4)关键细节与工程经验
4.1 数字切分:避免数值推理“格式陷阱”
数字、日期、小数、科学计数法的切分策略会影响模型对数值的“可组合性”。例如:
- 如果
9.11被切成一个整体 token,而9.9被切成9、.、9,模型在比较、对齐、复制时会出现不一致的表示习惯,容易诱发错误。 - 另一方面,如果把每个数字都拆成单字符 token,序列会变长,效率变差。
常见目标是让数字具备“稳定、可组合”的表示:
- 连续数字段尽量由更规则的子词构成
- 小数点、负号、百分号等符号边界一致
- 日期/货币/单位表达尽量不出现过多不一致模式
这类问题通常不是靠某一个公式解决,而是靠分词规则 + 语料统计 + 词表约束共同实现。
4.2 压缩率:1 个 token 对应多少个汉字
所谓“压缩率”,可以用一个简单的统计指标描述(用于评估 tokenizer 粒度):
ρ=NcharNtoken \rho = \frac{N_{\text{char}}}{N_{\text{token}}} ρ=NtokenNchar
- NcharN_{\text{char}}Nchar:统计文本中的汉字/字符数量(定义需一致,比如是否计入标点)
- NtokenN_{\text{token}}Ntoken:同一文本被 tokenizer 切分后的 token 数量
- ρ\rhoρ 越大:表示越“压缩”(token 更长),序列更短,推理更快
- ρ\rhoρ 越小:表示越“细碎”(token 更短),序列更长,推理更慢
压缩率的取舍:
- 过低(太碎):序列长度增加,注意力计算和 KV cache 成本增加,推理延迟变高
- 过高(太粗):词表会包含大量长 token,可能降低组合泛化能力;同时词表过大也会带来训练与部署成本上升
一个常见经验目标是:中文场景下 111 个 token 映射到约 1.51.51.5 个汉字左右(实际取决于语料与算法)。这不是硬指标,而是实践中“效率与泛化”较常见的平衡点。
4.3 移除脏 token 与敏感 token
在海量网页语料中,容易出现:
- 乱码片段、异常控制字符
- 非自然语言噪声(脚本碎片、极端重复、无意义拼接)
- 不希望进入模型记忆的敏感字符串
通常会在训练词表前进行:
- 语料清洗(去重、去噪、过滤低质量页面)
- 对候选 token 进行黑名单过滤(包括某些控制字符序列、明显垃圾片段等)
目标不是“完全消除风险”,而是显著降低模型在预训练阶段吸收无价值或高风险片段的概率。
4.4 领域 token:提升业务场景的压缩率与可学习性
如果业务场景明确(例如医疗、金融、法律、工业制造),可以把高频且语义稳定的专业词汇优先进入词表,以减少拆分带来的序列膨胀,并提升模型对专业词的稳定表征能力。
例如医疗文本中,如果“药品名/检验项/疾病名”频繁出现,那么把这些术语更倾向于作为整体 token,会带来:
- 更短的序列(推理更快)
- 更稳定的拷贝与引用(减少拼写与断裂)
- 更好的长上下文信息密度(同样长度容纳更多有效信息)
这类策略需要谨慎:领域 token 不宜无限加,否则词表过大、长 token 过多会破坏泛化,且增大 embedding 参数规模与训练难度。
4.5 多语覆盖:中英覆盖率与小语种策略
常见目标是:
- 中英覆盖率足够大(网页与代码、术语、缩写混杂很普遍)
- 小语种是否加入取决于业务需求与数据占比
如果小语种数据占比很低但被强行纳入,会出现:
- 词表容量被稀释
- 主语言压缩率下降
- 训练预算被低收益部分消耗
4.6 预留“词表余量”:为后续对齐与扩展留空间
实践中常会在 vocab_sizevocab\_sizevocab_size 与模型的 embedding 表规模之间预留一定余量,以支持后续阶段加入新 token 并训练其 embedding。直观原因是:后续对齐/业务适配阶段可能需要引入预训练阶段未充分覆盖的符号、特殊标记、领域新词等。
5)词表扩充:在原词表基础上补齐中文 token
很多情况下不从零训练 tokenizer,而是:
- 保留原始 tokenizer 的主体结构(兼容已有生态与权重)
- 手动或半自动扩充词表(加入常见汉字/常用片段/领域词)
- 针对新增 token 的 embedding 做额外训练(让新 token 能被模型有效利用)
典型做法是:新增大量汉字 token,以降低中文文本的过度拆分;随后使用较大规模中文语料对新增 token 的 embedding 进行训练,从而让模型快速适应中文。
这一策略的优点:
- 与原模型权重、推理系统更兼容
- 用较小成本改善中文表示与压缩率
- 对“中英混合”场景更友好
需要注意:
- 新增 token 越多,embedding 参数增长越明显
- 如果新增 token 覆盖不合理,可能造成词表冗余与学习困难
2.3.2 确定模型结构和参数
在现代 LLM 预训练中,模型结构通常采用成熟的 Transformer Decoder-only 体系,并结合一套高性能、工程化程度高的组件组合,例如:
- RoPE(旋转位置编码)
- GQA(Grouped-Query Attention)
- RMSNorm(均方根归一化)
- SwiGLU(门控前馈激活)
这套组合的目标非常务实:在保持性能的同时,让训练更稳定、推理更高效。
1)典型结构组件的作用
1.1 RoPE:更自然的相对位置建模与长上下文扩展
RoPE 将位置信息以“旋转”的方式注入到注意力的 Q,KQ,KQ,K 向量中,使得注意力能够更自然地表达相对位置信息,并在长上下文扩展中具备较好的可扩展性(实际还需要配合插值/外推策略与训练数据分布)。
1.2 GQA:在 MHA 与 MQA 之间折中
注意力中,Query 头多样性对表达能力重要,但 Key/Value 的缓存是推理的主要显存开销之一。GQA 通过“多组 Query 共享一组 KV”在性能与缓存之间取得平衡:
- 相比 MQA(所有 Query 共享 KV),表达能力更强
- 相比 MHA(每个头独立 KV),KV cache 更省
这对大模型部署、长上下文推理、吞吐优化非常关键。
1.3 RMSNorm:更简洁稳定的归一化
RMSNorm 相比 LayerNorm 通常实现更简单、开销更小,且在大规模训练中常见到良好的稳定性表现。其核心是基于均方根进行尺度归一化,而不显式减去均值。
1.4 SwiGLU:更强的门控前馈层
门控结构通过“选择性通过信息”增强表达能力。以 SwiGLU 为例,前馈层不再是单一路径的非线性变换,而是引入门控分支,使得网络能学习“哪些特征该被放大/抑制”。
2)模型规模与资源估算:显存、精度与训练策略
模型大小(例如 7B/14B/30B/70B)与训练资源(显存、并行策略、优化器与精度)强相关。下表是一个工程上的简要参考(同一规模在不同实现、序列长度、并行策略下会有差异):
| Method | Bits | 7B | 14B | 30B | 70B | xB |
|---|---|---|---|---|---|---|
| Full (fp32) | 32 | 120GB | 240GB | 600GB | 1200GB | ~18xGB |
| Full (pure_bf16) | 16 | 60GB | 120GB | 300GB | 600GB | ~8xGB |
| Freeze/LoRA/GaLore/APOLLO/BAdam | 16 | 16GB | 32GB | 64GB | 160GB | ~2xGB |
| QLoRA | 8 | 10GB | 20GB | 40GB | 80GB | ~xGB |
| QLoRA | 4 | 6GB | 12GB | 24GB | 48GB | ~x/2GB |
| QLoRA | 2 | 4GB | 8GB | 16GB | 24GB | ~x/4GB |
理解这张表的关键点:
- 精度越高(fp32 > bf16),参数与优化器状态占用越大,训练更稳但成本更高
- **PEFT/冻结策略(LoRA 等)**减少可训练参数与优化器状态,显存需求显著下降
- **量化训练(QLoRA)**进一步压缩存储与带宽,但需要额外关注数值稳定性、吞吐与实现细节
一个常见的实际决策路径是:
- 资源充足:优先 bf16 全参训练(效果与稳定性更一致)
- 资源受限:采用 PEFT 或 QLoRA(更快落地,成本更低)
- 需要极致部署:推理端再做量化与 KV cache 优化
2.3.3 训练框架选择
预训练框架的选择,直接影响:
- 训练吞吐(tokens/s)
- 大规模并行(TP/PP/DP)的可用性与稳定性
- 工程可维护性(参数可控、日志完备、复现容易)
- 大模型启动与加载速度(尤其是百亿/千亿规模)
在工程实践中,预训练通常优先选择 Megatron-LM 一类专为大规模训练优化的框架;如果模型体系与生态更贴近某个具体实现(例如 Qwen 系),则可选择相应的 Megatron patch 方案,以减少适配成本并复用社区优化。
同时,预训练阶段一般不优先使用以“训练灵活性”为主的通用框架来替代高度工程化的预训练框架,尤其是在追求极限吞吐与大规模并行稳定性时。
1)为何优先选择 Megatron-LM
1.1 训练速度快:并行策略成熟
Megatron-LM 在以下方面积累深厚:
- Tensor Parallel(张量并行)
- Pipeline Parallel(流水线并行)
- Data Parallel(数据并行)与高效通信
- 针对注意力、RoPE、MLP 等关键算子优化
对于大规模预训练,“吞吐”往往是第一生产力:同样训练预算下,吞吐越高意味着可训练 token 越多,或者可更快完成同等训练。
1.2 参数体系清晰:可控的工程入口
预训练需要大量可调参数:
- 并行配置(TP/PP/DP)
- dropout、正则、梯度裁剪
- 激活重计算(checkpointing)
- 混合精度与损失缩放
- 序列长度、打包策略、数据混合比例
- 学习率 warmup 与衰减策略等
一个结构化、可追踪的参数系统,能显著降低“训练跑起来但不可控/不可复现”的风险。对于需要多次实验迭代的团队来说,这点尤为关键。
1.3 启动与加载速度快:大规模调试成本更低
当模型规模上升到数十亿甚至上百亿参数时:
- 权重加载与分片初始化可能成为瓶颈
- 训练脚本的 debug 成本显著上升
- 一个小问题可能导致整套分布式作业重启
预训练框架如果能做到快速加载与稳定启动,会显著提升整体研发效率。
2)一个实际决策案例:从“目标”倒推框架与配置
假设目标是训练一个中文增强的 7B 模型:
- 数据:中文网页 + 通用语料混合
- 需求:兼顾中英与数字格式稳定性
- 资源:多机多卡,追求高吞吐
典型选择会是:
- tokenizer:采用 BBPE 或 BPE,并对中文高频片段做适度合并与扩充
- backbone:RoPE + GQA + RMSNorm + SwiGLU 的稳定结构
- 框架:Megatron-LM(或针对特定模型生态的 Megatron patch)
- 训练精度:优先 bf16 全参;资源受限则考虑 PEFT/QLoRA 路线用于快速验证数据与策略
这样组合的核心逻辑是:把不可控因素(分布式稳定性、吞吐瓶颈、算子性能)交给成熟框架,团队把主要精力放在数据与训练策略上。
更多推荐


所有评论(0)