浩天博客
显存计算器
站内搜索
直接问 AI

显存计算器

显存计算器

这个页面用来回答一个具体问题:手上这张显卡,能跑哪个尺寸的本地大模型,能开多长的上下文。填入显存容量、想要的上下文长度和并发数,下面会列出每个 Gemma 4 变体在每种量化格式下的显存占用拆解,以及装不装得下。

所有模型体积都是从 HuggingFace API 查到的真实文件字节数,不是按参数量乘以位宽估算的。这个区别很重要:同一个模型的不同量化格式,体积差异经常和直觉相反,后面会解释为什么。

模型体积是从 HuggingFace API 查到的真实文件字节数换算成 GiB,不是按参数量估算。跑 GGUF 时 E 系列的 PLE 表和 token embedding 留在系统内存,这部分已经从显存里扣掉了——所以「权重」一栏会明显小于文件体积。KV cache 按各变体的层数、KV 头数、共享层数和滑动窗口计算。整套公式拿一台 8G 笔记本上 E4B 在 8K/32K/64K/128K 四档上下文的实测显存校准过,误差在 0.15 GB 以内;其他变体属于同架构外推,判定为「勉强」时建议先把上下文调小试跑。多卡是按「显存可叠加、每卡各留一份计算缓冲」建模的,没有实机验证过,实际还要看卡间互联带宽和切分方式。

怎么读这几个数字

权重是模型参数本身要占的显存。它不等于模型文件的大小——跑 GGUF 格式时,Gemma 4 的 E 系列会把 PLE(per-layer embedding)表和 token embedding 留在系统内存里,不上显卡。E4B 的 q4_0 文件有 4.8 GiB,但真正进显存的只有 2.2 GiB 左右,因为那张 PLE 表一个人就占了 2.8B 参数。如果按文件体积去估算显存,会凭空多算 2 GB 以上,足以让一张 8G 卡被误判成跑不了 E4B——实际上它跑得很轻松。

KV cache 是推理过程中缓存的注意力键值,随上下文长度和并发数线性增长。Gemma 4 的 E 系列在这一项上格外省,原因有两个:一部分层直接共享上层的 KV 不单独占空间,另一部分层用 512 token 的滑动窗口注意力,无论上下文开多长,这些层只需要保留窗口内的那一小段。所以 E4B 从 8K 开到 128K,KV 只涨了约 1.1 GB;换成没有这些设计的同尺寸模型,涨幅会是好几倍。

运行开销包括计算缓冲区、显存碎片和推理引擎自身占用。这一项没法从模型结构精确推出来,是拿实测数据拟合的:常数项加一个随上下文线性增长的量。

误差有多大

整套公式在一台 8G 显存的笔记本上校准过,对象是 E4B 的 q4_0 量化,用 llama.cpp 的 Vulkan 后端,KV cache 量化到 q8_0。四档上下文的实测与预测对比:

上下文 预测 实测 误差
8K2.96 GiB2.90 GiB+0.06
32K4.16 GiB4.25 GiB−0.09
64K4.52 GiB4.54 GiB−0.02
128K5.26 GiB5.14 GiB+0.12

需要说清楚的是:这是一个变体、一套软件栈的校准结果。其他变体是按同一套架构公式外推的,没有逐个实测过,误差可能更大。所以判定结果分三档而不是简单的能/不能:留出足够余量才算「装得下」,余量很薄的标成「勉强」。看到「勉强」时,建议先把上下文调小一档实际跑一次,再决定要不要往上顶。

量化格式的体积陷阱

选型时最容易踩的坑,是假设「同一个模型,4 bit 量化后体积大约是参数量的一半」。Gemma 4 官方的 QAT 版本用的是 compressed-tensors 格式,配置里写的是 targets: ["Linear"]——只量化线性层,embedding 层保持 bf16 原样。对于 embedding 占比很高的模型,量化后的体积会比预期大得多。

最反直觉的一组数字:E4B 的 QAT W4A16 版本有 10.72 GiB,而参数量是它三倍的 12B Unified,同样是 QAT W4A16,只有 9.56 GiB。也就是说,如果你按「参数少的一定更小」去选,会选到一个更大更慢的模型。E 系列那张巨大的 PLE 表在 bf16 下没被压缩,直接把体积撑上去了。

换成 GGUF 的 q4_0 就没这个问题,因为它连 embedding 一起量化,E4B 降到 4.8 GiB。所以小显存机器上应该优先考虑 GGUF + llama.cpp,而不是 QAT 权重 + vLLM——后者是给显存充裕的机器准备的,它的优势在吞吐和并发,不在体积。

多卡的两个限制

把显卡数量调到大于 1 时,可用显存是各卡相加,但有两点不是简单叠加。

vLLM 的张量并行要求 KV 头数能被卡数整除。它把注意力头切开分到各张卡上,切不整除就起不来。Gemma 4 各变体的 KV 头数分别是:E2B 1 个、E4B 2 个、12B 和 26B A4B 各 8 个、31B 16 个。所以 E2B 在任何多卡配置下都用不了张量并行,E4B 最多 2 卡;而卡数取 3、5、6 这类非 2 的幂时,没有任何变体能整除。计算器会在这种情况下直接说明,而不是让对应的行凭空消失。

llama.cpp 按层切分,没有整除限制,但也不会更快。它把不同的层放到不同卡上,推理时逐层流过——同一时刻只有一张卡在算。多卡对它的意义是「装得下更大的模型」,不是「跑得更快」。想要多卡带来吞吐提升,得走 vLLM 的张量并行,并接受上面那条整除约束。

另外,每张卡都要自己的一份计算缓冲,所以运行开销是按卡数放大的,不是摊薄的。这部分我没有多卡实机可以验证,是按模型推算的,比单卡的数字更粗糙。

还需要留多少余量

「已被占用」那一栏容易被忽略。接了显示器的机器,桌面合成器和浏览器通常已经吃掉 0.3 到 1 GB,这部分要先扣掉再算模型。纯计算卡或者用核显输出显示的机器可以填 0。

另外,多模态投影(mmproj)是单独一个文件,只有需要图片输入时才加载。如果只做纯文本推理,把那个勾去掉能省下 0.9 GB 左右——在 8G 卡上这不是小数目。

相关文章

计算器只解决「装不装得下」这一个问题。装得下之后模型跑多快、上下文开大以后首 token 延迟会涨到什么程度、并发几路开始明显掉速,这些要看实际的推理引擎配置和显卡带宽,计算器给不出答案,得实测。教程系列里有对应的压测方法和参数调整记录。

向下探索