规则
模型权重占用的内存约等于参数量乘以每个参数的字节数。以十亿为单位的参数量乘以每个参数的字节数,直接就是以 GB 为单位的结果:700 亿参数的模型,每个参数 1 个字节,大约 70GB。
| 参数量 | FP16(2 字节) | FP8(1 字节) | 4 位(约 0.5 字节) |
|---|---|---|---|
| 80 亿 | 16 GB | 8 GB | 约 4 GB |
| 320 亿 | 64 GB | 32 GB | 约 16 GB |
| 700 亿 | 140 GB | 70 GB | 约 35 GB |
| 1200 亿 | 240 GB | 120 GB | 约 60 GB |
| 2000 亿 | 400 GB | 200 GB | 约 100 GB |
DGX Spark 有 128GB 内存,CPU 和 GPU 共用。这是权重、缓存和其他一切加起来的总量,所以模型永远拿不到全部。
给其余部分留出空间
- KV 缓存:随上下文长度和同时服务的请求数增长。长上下文和大批量可能占用几十 GB。
- 激活值;训练时还有梯度和优化器状态,全量微调时可能是权重的好几倍。
- 操作系统和你自己的软件。
怎么看这张表
- 700 亿参数用 FP16(140GB)放不下;用 FP8(70GB)可以放下,余量中等;用 4 位(约 35GB)则很宽裕。
- 1200 亿参数用 4 位可以放下,用 FP8 勉强放下,留给缓存的空间很少。
- 2000 亿参数只有 4 位才放得下,约 100GB。这和 NVIDIA 的说法一致:单台 DGX Spark 可以用 FP4 对最高 2000 亿参数的模型做推理。
- 双节点把两台机器的 256GB 合在一起,能放更大的模型,或者用更高的精度。
对于微调
QLoRA 这类方法把基础模型保持在 4 位,只训练小的适配器,所以内存开销接近 4 位权重再加一点额外开销。这就是为什么 700 亿参数的模型用这种方法微调是可行的,而同一个模型做全量微调则不行。
这些是算术估算,不是实测。规划长时间训练之前,先做一次短测试,看模型实际占用多少内存。
常见问题
统一内存是不是意味着 128GB 都能给模型用?
不是。CPU、GPU、操作系统和你的软件共用这块内存,所以给权重和缓存留出的可用空间要明显少于 128GB。