如何通过模型参数推算显存使用量
1️⃣ 常见浮点数类型
| 类型 | 精度位数 | 字节数 | 说明 |
|---|---|---|---|
| FP32 | 32 位 | 4 字节 | 单精度浮点数,原始训练常用 |
| FP16 | 16 位 | 2 字节 | 半精度浮点数,推理/训练常用 |
| BF16 | 16 位 | 2 字节 | 类似 FP16,但指数范围更大,更适合训练 |
| INT8 | 8 位 | 1 字节 | 量化推理用,精度下降但显存占用少 |
一些模型会用 “B” 表示十亿参数(B = billion),所以看到 7B 就可以估算显存。
例如:
- 模型:Qwen-7B
- 参数量:7B = 7,000,000,000 个参数
- 数据类型:FP16(每个参数 2 字节 = 16 bit)
7,000,000,000×2 字节=14,000,000,000 字节
(1 GB = 1024³ ≈ 1,073,741,824 字节)
显存=14,000,000,000/1,073,741,824≈13.04 GB
实际推理时还需要考虑以下几个额外开销:
- 激活(activations)/中间层输出:模型前向传播时,会为每层计算输出,保存暂存数据、缓存、以及用于 attention 的中间值。
- KV cache 或 past key/value 缓存:在生成模型里,为了上下文延续,会缓存 key/value 对,这也会占显存。
- 序列长度 (context length) 和 batch size 的影响:如果输入序列特别长,或者 batch size 大,这部分显存开销会显著增加。
- 显存对齐、库 overhead、显存碎片:框架(如 vLLM、Transformers)还可能预分配或保留部分显存以便效能优化。
- 精度和量化:如果不是纯 FP16,而是用 FP32、或者用量化(INT8/INT4)或有特殊缓存方式,显存占用会变。
- 并行/设备映射 (device_map)、显存切片 (sharding)、外部 off-load 等也会影响实际占用结构。