显存花在哪里
一个 参数的大模型,训练时的显存远不止模型权重:
- 参数: 个权重;
- 梯度:每个参数一份梯度,通常与参数同数量级;
- 优化器状态:Adam 需要一阶矩和二阶矩,通常用 FP32 保存,约占参数量的 8 字节/参数(连同 FP32 主权重);
- 激活值:前向传播为反向传播保留的中间结果,随批次大小和序列长度增长。
以 Llama2-70B 为例,参数、梯度、优化器状态和激活值加起来可达 1TB 以上,而单张 A100/A800 只有 80GB 显存。因此大模型训练必须同时解决“单卡装不下”和“多卡怎么协作”两个问题。
单卡优化
混合精度
前向和反向主要使用 FP16 或 BF16,矩阵乘更快、显存占用约为 FP32 的一半;参数更新时保留一份 FP32 的主权重(master weight),避免低精度累积误差。
FP16 的表示范围较窄,梯度很小时会下溢。常用动态损失缩放(loss scaling):先放大损失,反向得到放大后的梯度,更新前再缩回。BF16 的指数范围与 FP32 相同,通常不需要损失缩放。
算子融合与 FlashAttention
- 实现更高效的 kernel,提升单个算子的速度;
- 把多个算子融合成一个大算子,减少显存读写。FlashAttention 通过分块计算注意力,避免显式存储完整的 注意力矩阵,显著降低显存并提升速度。
梯度累加
显存装不下目标批次时,把一个大批次拆成多个 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 |
| 社交媒体 | 实时、口语化 | |
| 平行语料 | 多语言对齐 | ParaCrawl、MultiUN |
| 多模态转文字 | 口语化、场景化 | 视频字幕、语音对话 |
配比
数据配比追求三点:
- 多样性:覆盖丰富特征;
- 平衡性:避免过度依赖某一类数据;
- 针对性:面向目标任务选择相关数据。
常用方法包括按真实世界分布配比、按数据质量配比,以及根据验证集效果动态调整配比。
清洗
- 过滤:用分类器或启发式规则去除有害、低质内容,可在文档级和句子级进行;
- 去重:用 MinHash 等算法识别并删除重复或高度相似的文本,避免模型反复记忆同一内容;
- 标准化:句子切分、拼写校正、去除噪声,把原始文本转为统一格式;
- 审查:建立处理档案并抽样人工检查,确认数据质量。
高质量数据的增长速度慢于训练集扩张速度,因此数据合成(用算法或生成模型构造与真实数据相似的人工数据)成为补充手段。合成数据需要控制分布偏移和重复,不能完全替代真实数据。
相关阅读
- 模型架构与预训练目标:大模型预训练:整体框架与模型架构
- 指令微调:LLM 有监督微调
- 人类偏好对齐:RLHF 与 PPO
- 推理部署中的显存优化:推理框架与部署