1643 字
8 分钟
大模型训练系统:显存、并行与数据

显存花在哪里#

一个 NN 参数的大模型,训练时的显存远不止模型权重:

  • 参数:NN 个权重;
  • 梯度:每个参数一份梯度,通常与参数同数量级;
  • 优化器状态:Adam 需要一阶矩和二阶矩,通常用 FP32 保存,约占参数量的 8 字节/参数(连同 FP32 主权重);
  • 激活值:前向传播为反向传播保留的中间结果,随批次大小和序列长度增长。

以 Llama2-70B 为例,参数、梯度、优化器状态和激活值加起来可达 1TB 以上,而单张 A100/A800 只有 80GB 显存。因此大模型训练必须同时解决“单卡装不下”和“多卡怎么协作”两个问题。

单卡优化#

混合精度#

前向和反向主要使用 FP16 或 BF16,矩阵乘更快、显存占用约为 FP32 的一半;参数更新时保留一份 FP32 的主权重(master weight),避免低精度累积误差。

FP16 的表示范围较窄,梯度很小时会下溢。常用动态损失缩放(loss scaling):先放大损失,反向得到放大后的梯度,更新前再缩回。BF16 的指数范围与 FP32 相同,通常不需要损失缩放。

算子融合与 FlashAttention#

  • 实现更高效的 kernel,提升单个算子的速度;
  • 把多个算子融合成一个大算子,减少显存读写。FlashAttention 通过分块计算注意力,避免显式存储完整的 n×nn \times n 注意力矩阵,显著降低显存并提升速度。

梯度累加#

显存装不下目标批次时,把一个大批次拆成多个 micro-batch,逐个做前向和反向并累加梯度,最后统一更新一次参数。这样等效批次变大,但每个 micro-batch 的激活在算完后即可释放。

激活重计算#

如果 batch size 降到 1 仍然放不下,就用时间换空间:前向时不保存全部激活,反向需要时重新计算一遍。该技术可节省 90% 以上的激活显存,代价是额外的计算量,显存充足时应减少使用。

分布式并行#

数据并行#

每张卡保存完整模型,输入不同的数据,反向传播后通过 all-reduce 同步梯度。数据并行实现简单、吞吐高,但每张卡都要放得下完整模型和优化器状态。PyTorch 的 DDP 是常见实现。

张量并行#

把单层的权重矩阵切分到多张卡上,例如按列切分线性层的权重,卡间通过 all-reduce 汇总部分结果。张量并行通信频繁,通常放在节点内(NVLink 带宽高)。Megatron-LM 是典型实现。

流水线并行#

把模型按层切成若干段,每段放在一张卡上,微批次依次流过各段。这样可以训练单卡放不下的深模型,但会产生流水线气泡:前面的阶段在等后面的阶段时算力空闲。增大微批次数量可以减小气泡占比。流水线并行通信量较小,适合放在节点间。

参数切片并行与 ZeRO#

数据并行的显存冗余在于每张卡都保存完整的参数、梯度和优化器状态。ZeRO(Zero Redundancy Optimizer)把这些状态切片到不同卡上:

阶段切分内容显存节省
ZeRO-1优化器状态约 4 倍
ZeRO-2优化器状态 + 梯度约 8 倍
ZeRO-3优化器状态 + 梯度 + 参数与数据并行度成正比

ZeRO-3 在计算某一层时临时收集该层参数,算完即释放,因此用通信换显存。DeepSpeed 是常用的实现框架。

混合并行#

实际训练通常组合多种策略:

  • 节点内做张量并行,节点间做流水线并行;
  • 用参数切片节省模型状态显存;
  • 用数据并行提高整体吞吐。

GPT-3、LLaMA 等模型的训练都采用多维混合并行,具体切分方式取决于集群拓扑、带宽和模型结构。

训练参数#

  • 学习率:先线性预热到最大值,再按余弦、线性或平方根倒数衰减。预热避免初期不稳定,衰减避免在最优解附近震荡;
  • 批次大小:早期用小批次提高更新频率,让损失快速下降;后期增大批次使训练更稳定。批次变化时通常要同步调整学习率;
  • 训练轮数:大数据集通常只训练 1–2 个 epoch,小数据集可适当增加;
  • 优化器:Adam 减少梯度震荡,AdamW 加入解耦权重衰减,Adafactor 通过只保存必要统计量降低显存,适合资源受限场景。

预训练数据#

来源#

来源特点代表数据集
网页规模最大,需大量清洗Common Crawl、C4
书籍高质量长文本Project Gutenberg
百科知识权威、结构规范Wikipedia
代码程序语言与逻辑The Stack
科研文献专业、前沿arXiv
社交媒体实时、口语化Reddit
平行语料多语言对齐ParaCrawl、MultiUN
多模态转文字口语化、场景化视频字幕、语音对话

配比#

数据配比追求三点:

  • 多样性:覆盖丰富特征;
  • 平衡性:避免过度依赖某一类数据;
  • 针对性:面向目标任务选择相关数据。

常用方法包括按真实世界分布配比、按数据质量配比,以及根据验证集效果动态调整配比。

清洗#

  • 过滤:用分类器或启发式规则去除有害、低质内容,可在文档级和句子级进行;
  • 去重:用 MinHash 等算法识别并删除重复或高度相似的文本,避免模型反复记忆同一内容;
  • 标准化:句子切分、拼写校正、去除噪声,把原始文本转为统一格式;
  • 审查:建立处理档案并抽样人工检查,确认数据质量。

高质量数据的增长速度慢于训练集扩张速度,因此数据合成(用算法或生成模型构造与真实数据相似的人工数据)成为补充手段。合成数据需要控制分布偏移和重复,不能完全替代真实数据。

相关阅读#

大模型训练系统:显存、并行与数据
https://biscuit0613.github.io/posts/nlp/07-02-llm-training-systems/
作者
Biscuit
发布于
2026-10-20
许可协议
CC BY-NC-SA 4.0
BERT 微调实践:情感分析
LLM 有监督微调:指令微调与数据构建