详解本地 LLM 显存分配模型:显示驱动、运行时、临时缓冲区、模型权重和 KV 缓存竞争同一块显存,提供实际可用显存计算公式和不同参数量的显存占用参考。
我一直在看到同一个本地 LLM 容量估算的错误:
"模型文件比我的 GPU 小,所以应该能装得下。"
这只是第一步检查。24 GB 的 GPU 并不会给你的模型提供干净的 24 GB 显存预算。显示堆栈、运行时、临时缓冲区、模型权重和 KV 缓存都在竞争同一块空间。
以下是我在下载模型或租用 GPU 之前使用的计算工作表。
最简单的权重估算公式是:
weight_memory_gib = parameters * bits_per_parameter / 8 / 1024^3
对于简单的 4-bit 估算:
这些是底线,不是承诺。真实的量化文件还可能包含 scales、metadata 和以更高精度存储的层。如果你知道精确的 checkpoint 大小,就用它来代替简单的 bits-per-parameter 估算。
对于稀疏的 mixture-of-experts 模型,也请使用总参数来计算,除非你的运行时真的会 offload 不活跃的 experts。Active parameters 描述的是每个 token 的计算量,并不能自动描述必须存储多少权重。
我通常用 90% 的可用 VRAM 来做规划:
usable_vram = physical_vram * usable_fraction
24 * 0.90 = 21.6 GiB 可用
确切的预留空间取决于操作系统、显示使用情况、驱动、运行时、图捕获、分配器行为和其他进程。重要的是停止把盒子上的数字当作完全可用来处理。
KV 缓存是上下文长度和并发变得昂贵的地方。
一个有用的规划公式是:
kv_cache_bytes =
2
* layers
* kv_heads
* head_dimension
* context_tokens
* concurrent_sequences
* bytes_per_kv_value
系数 2 用于存储 keys 和 values。
以一个假设的架构为例:
在 2048 个 token 的上下文时,KV 缓存约为 1 GiB。
将上下文提升到 32,768 个 token,它就变成了约 4 GiB。保持这个上下文并运行四个并发序列,它就变成了约 16 GiB。
这就是为什么一个模型可以在简短的本地聊天中正常工作,然后在服务器使用更大上下文窗口或处理多个请求时失败。
Grouped-query attention 在这里很重要。使用 KV heads 的数量,而不是总 attention head 数量。
我使用这个规划目标:
planning_target = (weight_memory + kv_cache) * (1 + headroom_rate)
当没有运行时测量数据时,20% 的余量率是一个合理的一阶估计。一旦有了数据,就用实际测量值替换它。
以下是一个假设的 32B 模型的示例:
一块 24 GB GPU,扣除 21.6 GiB 可用预算,还差约 5.9 GiB。4-bit 模型文件看起来够小,但实际部署却不够。
本例中的架构数值只是一个工作表。在做出硬件决策之前,请阅读实际的模型配置。
两张 24 GB 卡并不总是像一块干净的 48 GB 池那样工作。
Tensor parallelism、pipeline parallelism、层放置、复制的缓冲区、互连速度和运行时支持都很重要。容量估算告诉你这个计划是否可行,并不证明延迟或吞吐量。
在将本地模型称为可部署之前,我会记下:
如果其中任何一项缺失,我就称这个答案为底线,而不是部署计划。
我将这些公式放到了一个仅限浏览器使用的 LLM GPU 内存计算器中。它不会上传你输入的值。
我最常用的两个参考是 Hugging Face model memory estimator guide 和 Transformers KV cache guide。
哪种与运行时相关的内存成本最让你意外:上下文、并发、量化开销,还是其他?
Disclosure: I used an AI assistant to help edit the structure and wording. I checked the numerical examples against the formulas above.
For further actions, you may consider blocking this person and/or reporting abuse