显存类型 | 计算公式 | 典型值(7B模型) |
---|---|---|
模型参数 | 参数数量×精度字节数/(TP×PP) |
3.5GB |
激活值 | batch×seq×hidden×(34+5seq_heads/hidden)×layers×精度/(TP×PP×DP) |
48GB |
KV Cache | 2×batch×seq×hidden×layers×精度/(TP×PP×DP) |
24GB |
优化器状态 | 可训练参数×8字节/Zero级别GPU数 |
14GB |
梯度 | 可训练参数×4字节/Zero级别GPU数 |
7GB |
临时显存 | 模型参数×0.3 |
1.05GB |
总计 | 求和上述所有 | ≈97.55GB |
存储模型权重所需的内存
# 计算公式 模型参数显存 = 参数数量 × 精度字节数 / (TP大小 × PP大小) # 示例:7B模型 FP16精度 TP=2 PP=2 7e9 × 2字节 / (2×2) = 3.5GB
精度对照表:
精度 | 字节数 | 适用场景 |
---|---|---|
FP32 | 4字节 | 高精度训练 |
FP16 | 2字节 | 混合精度训练 |
INT8 | 1字节 | 量化推理 |
INT4 | 0.5字节 | 极致压缩 |
前向传播的中间计算结果
激活复杂度系数 = 34 + (5×seq_len×heads)/hidden_dim 激活值显存 = batch×seq_len×hidden_dim×系数×layers×精度 / (TP×PP×DP)
典型值: 7B模型(batch=8, seq=1024) ≈ 48GB
自回归模型的"记忆存储"
KV Cache显存 = 2 × batch × seq_len × hidden_dim × layers ×精度 / (TP×PP×DP)
为什么×2? 需要分别存储Key和Value矩阵!
类型 | 计算公式 | 说明 |
---|---|---|
优化器状态 | 参数×8字节/Zero_GPU |
Adam需要m和v两个状态 |
梯度 | 参数×4字节/Zero_GPU |
通常FP32存储 |
Zero优化级别:
Zero1:优化器状态分片
Zero2:+梯度分片
Zero3:+模型参数分片
隐藏的内存黑洞
临时显存 ≈ 模型参数 × (0.2~0.5) # 经验系数
主要来源:
中间计算结果
内存碎片
框架开销
策略 | 缩写 | 显存降低对象 | 通信开销 |
---|---|---|---|
模型并行 | TP | 参数/激活值 | 高 |
流水线并行 | PP | 参数/梯度 | 中 |
数据并行 | DP | 激活值 | 低 |
最佳实践: 混合使用TP+PP+DP+Zero3,7B模型显存可从单卡97.5GB→每卡<24GB
混合精度训练 FP16前向+FP32主权重
→ 节省50%参数显存
梯度检查点 用时间换空间,激活值显存减少60%+
LoRA微调 仅训练低秩矩阵,7B模型可降至0.1%参数量
# LoRA显存计算 LoRA显存 = rank × (目标模块参数量) × 精度
量化训练 FP16→INT8
直接砍半参数显存
梯度累积 batch=32→累积4次batch=8
显存需求降为1/4
假设条件:
模型:7B参数
配置:FP16, batch=8, seq=1024
并行:TP=2, PP=2, DP=4
分步计算:
模型参数:7e9×2/(2×2) = 3.5GB
激活值:8×1024×4096×154×32×2/(2×2×4) ≈48GB
KV Cache:2×8×1024×4096×32×2/(2×2×4) ≈24GB
优化器:7e9×8/(2×2) =14GB
梯度:7e9×4/(2×2) =7GB
临时:3.5×0.3=1.05GB
总计:≈97.55GB 实际需要选择≥100GB显存的GPU
安全边际:计算值+20%缓冲
监控工具:nvidia-smi
+ gpustat
显存杀手:长序列>2048会指数级增长KV Cache
新硬件:H100的FP8精度可再省50%显存
避坑指南:当看到
CUDA out of memory
时,请按本文从头检查各模块显存!