日常做项目,对大模型的私有化部署也有刚需,花点时间深入研究了下模型使用和GPU显卡配置的关系,做个记录。
GPU的显存大小直接决定了我们能跑多大的模型、跑多快(影响批处理大小和序列长度),以及训练过程是否稳定。
那么如何评估呢,包含以下几个考虑的因素:
1. 模型参数本身
最基础的显存占用来自于模型参数本身。这部分的计算相对直接:
VRAM_参数 ≈ 模型参数总量 × 单个参数所需字节数。
FP32: 4 字节
FP16 / BF16: 2 字节
INT8: 1 字节
INT8: 1 字节
INT4: 0.5 字节
不同的量化方案会将模型参数进行压缩。
以一个 70 亿参数的 Llama 3 8B 模型为例,若采用 FP16 加载,
7B × 2 bytes ≈ 14 GB
2.激活值(Activations)& KV Cache
这是模型前向传播时的中间计算结果。其大小与批次大小 (Batch Size)、序列长度 (Sequence Length)、模型隐藏维度 (Hidden Dimension) 和 层数 (Number of Layers) 强相关。
在模型生成文本(自回归)时,为加速计算,需要缓存过去每个 Transformer 层的 Key 和 Value 状态。这部分显存消耗巨大,会随着序列长度和批次大小线性增长。
VRAM_KV_Cache (近似) ∝ 2 × 层数 × 隐藏维度 × 序列长度 × 批次大小 × 单值字节数
当面对模型训练或SFT的场景时,还有以下两大显存消耗者需要考虑。
3.梯度 (Gradients)
其一是梯度(Gradients)。
在反向传播过程中,系统需要为每一个可训练的参数计算梯度值,以便更新模型权重。
VRAM_梯度 ≈ 可训练参数量 × 训练精度对应的字节数
通常,梯度的精度与训练时模型参数的精度保持一致,例如,若使用 FP16 进行训练,梯度也占用 FP16 的空间。
4.优化器状态(Optimizer States)
其二是优化器状态(Optimizer States),这是训练时的“显存大户”。 优化器(如 Adam, AdamW)需要为每个可训练参数维护状态信息(如动量、方差)。
更关键的是,这些状态值往往以 FP32(4字节)精度存储,即使模型主体是使用 FP16 或 BF16 进行训练。AdamW 对每个可训练参数,常需 2 × 4 = 8 字节额外存储。
全量微调 7B 模型,仅此项就可能需
7B × 8 bytes = 56 GB
使用 8-bit 优化器可大幅降低此项。
推理/训练场景下GPU显存估算
1. 推理
总推理 VRAM ≈ VRAM_参数 + VRAM_激活器 + VRAM_kv_cache + VRAM_开销
以一个Llama 3 8B (FP16) 推理为例:
模型参数:8B 参数 * 2 字节/参数 = 16 GB
激活和 KV 缓存:高度依赖于序列长度和批次大小。对于批次大小为 4,序列长度为 2048: 假设 Hidden Dim = 4096,Num Layers = 32,KV Cache (FP16):
2×32×4096×2048×4×2 bytes≈4.3 GB
开销:框架、CUDA 内核,估计为 1-2 GB
2.训练
全量微调
VRAM ≈ VRAM_params + VRAM_gradients + VRAM_optimizer + VRAM_activations + VRAM_overhead
Llama 3 8B (FP16), AdamW (FP32 状态)
1、模型参数 (FP16):80 亿参数 * 2 字节/参数 = 16 GB
2、梯度(FP16):8B 参数 * 2 字节/参数 = 16 GB优化器状态(AdamW,FP32):
2 个状态/参数 * 8B 参数 * 4 字节/状态 = 64 GB 激活值:很大程度上取决于批次大小和序列长度。可能为 10-30 GB 或更多(高度近似)。
3、额外开销:估计 1-2 GB。
4、估计总计:16 + 16 + 64 + (10 到 30) + (1 到 2) ≈ 107 - 128 GB
PEFT微调
使用LoRA等技术进行微调,通过冻结基础模型参数并仅训练小型适配器层,可以显著降低VRAM 需求。
带有 LoRA 的 Llama 3 8B(Rank=8,Alpha=16)
1、基础模型参数(冻结,例如,FP16):16 GB2、LoRA 参数(可训练,BF16):通常非常小,例如,约 1000 万到 5000 万个参数。假设 2000 万个参数 * 2 字节/参数 ≈ 40 MB(相对于基础模型可以忽略不计)。