Weights,Activations&Gradients
2026/7/23大约 3 分钟
在 AI Infra SRE 的日常排障中,这三个词是最高频出现的。当你看到机器报 CUDA Out of Memory (OOM) 时,罪魁祸首必然是它们三个之一。
为了让你像素级地看清它们在显存里的样子,我们用“工厂流水线”的生动比喻把它们彻底拆明白,最后直接上交互式动态显存解剖器。
一、 用大白话拆解这三大核心概念
假设大模型是一个“猜词工厂”,它的任务是根据“床前明月”去猜下一个字是“光”。
1. 模型权重 (Weights / Parameters) —— “工厂的固定设备”
- 是什么: 模型内部千万个矩阵里存的小数(比如
0.0123、-0.456)。它们决定了输入的数据经过这个矩阵时会被放大还是缩小。 - 物理特征(静态占用): 它们是模型的本体。一旦模型加载完,它在显存里占用的空间就雷打不动、死死卡在那里。比如一个 7B(70亿参数)的模型,用 BF16(2字节)精度存储,那模型权重会永久、铁打不动地占掉 $70 \times 2 = 14 \text{ GB}$ 显存,训练不结束,这 14GB 绝对不会变多也不会变少。
2. 激活值 (Activations) —— “流水线上的半成品”
- 是什么: 数据在通过每一层矩阵计算时,算出来的中间结果。
- 物理特征(动态暴涨,OOM 的最大推手): * 前向传播(Forward)时,数据从第一层往后走,每一层算出的中间结果 $X$,PyTorch 必须把它们死死扣在显存里不准释放!因为等会儿反向传播算账时还要用它。
- 随着你喂给模型的文本长度(SeqLen)和单卡批次(Batch Size)越来越大,这些中间产物会呈几何级数疯狂暴涨。
- 它是显存里的“隐形刺客”,前向传播时显存一路狂飙,就是它在作怪。
3. 梯度 (Gradients) —— “质检员写的整改通知单”
- 是什么: 反向传播(Backward)时,系统拿着标准答案倒车回来,算出的每个参数应该调整多少的“修正量”。
- 物理特征(瞬间爆发,边算边扔): * 它的形状和模型权重一模一样(权重有多少个,梯度就有多少个)。
- 它在进入反向传播时现场临时算出来。在分布式训练(DDP/FSDP2)中,某一层的梯度刚算出来,DDP 就会立刻通过
NCCL AllReduce把它异步扔进网络里同步,算完、同步完后,属于这一层的梯度和对应的激活值就可以当场从显存里抹除(释放)。
二、 SRE 级别的硬核运维总结
弄懂了这三个词,你在机房里就能瞬间看懂故障:
- 刚启动代码就直接 OOM 炸了: 说明单卡显存连模型权重本身都装不下。
- 解法: 必须放弃 DDP,立刻升级成 FSDP2 或 DeepSpeed ZeRO-Stage 3,把模型权重切碎分给多张卡。
- 代码跑着跑着,在前向传播中途突然 OOM 炸了: 说明模型装得下,但因为算法同学给的文本太长(SeqLen 大)或者单卡吃了太多样本(MBS 大),导致激活值堆积如山把显存撑爆了。
- 解法: 让算法调小 MBS,或者强推在代码里开启 Activation Checkpointing(重计算),当场扔掉激活值换空间。
- 模型跑起来了,但 Loss 突然变成了
NaN训练崩溃: 说明在 Backward Pass(反向传播) 现场算梯度时,数字太小或太大,超出了 FP16 精度的包装极限,发生了梯度下溢/溢出。
- 解法: 帮算法把训练精度无脑切换到 BF16。
现在看着上面这个能操控的显存大盘,你对这三大“显存大佬”在机器里是怎么横跳、怎么生灭的,是不是有了完全通透的底盘认知了?
