← 返回资讯

跑大模型要多少显存?显存估算公式与选卡指南

2026-06-17

想在自己的 GPU 上跑开源大模型,第一个问题永远是”显存够不够”。但大多数教程给的数字缺乏来源,本文直接给你估算公式和对照表,让你在选卡或选实例前把显存账算清楚。

显存需求从哪里来?

推理时显存主要分为三块:

总显存 ≈ 模型权重 + KV Cache + 框架开销

三部分的性质截然不同:权重固定、KV Cache 随并发和上下文长度动态增长、框架开销几乎是常数。

我见过太多人只算了第一项就去买卡或开实例,结果上线跑到 8 并发就 OOM 崩溃——问题不在权重,而在 KV Cache 被严重低估。权重是”一次性成本”,加载完就不变;KV Cache 是”运行时成本”,请求越多、上下文越长,它涨得越快。所以选卡前一定要按你真实的并发和上下文长度去估,而不是只看模型卡片上写的”最低显存需求”(那基本只算了权重)。

第一块:模型权重占用

这是最容易算的部分,近似公式:

权重显存(GB) ≈ 参数量(十亿) × 每参数字节数
精度每参数字节说明
FP324 字节全精度,训练常用,推理几乎不用
BF16 / FP162 字节推理主流精度,精度损失可忽略
INT81 字节量化后,速度提升显著,精度基本无损
INT4 / Q40.5 字节积极量化,显存减半,轻微精度损失

这张表背后的道理是:推理阶段不需要反向传播,不需要保存梯度和优化器状态(Adam 优化器状态通常是权重本身的 2 倍以上),所以训练时必须的 FP32 精度在推理时是浪费。BF16/FP16 之所以成为推理主流,是因为大模型的权重分布对精度不敏感——你把每个参数从 4 字节压到 2 字节,模型输出的困惑度(perplexity)几乎不变,但显存直接减半。这也是为什么几乎没人在生产环境里用 FP32 跑推理,纯粹是浪费显卡。

需要提醒一点:上面的字节数是”每参数存储字节数”,不是”每参数计算字节数”。有些框架(比如 vLLM 的某些内核)在计算时会把 INT8/INT4 权重反量化回 FP16 再做矩阵乘法,这意味着量化省的是存储显存,不一定等比例省计算时间——量化模型推理更快,主要是因为显存带宽压力变小了(数据搬运量减少),而不是算力需求变小。

不同参数量 × 精度对照表

模型规模FP16(GB)INT8(GB)INT4(GB)
1B~2~1~0.5
3B~6~3~1.5
7B~14~7~3.5
13B / 14B~28~14~7
30B~60~30~15
70B~140~70~35
72B~144~72~36

注意:以上为权重部分估算,实际还需加上 KV Cache 和框架开销。

反过来用这张表更实用:如果你手上是一张 24GB 的卡(比如 4090),刨去 KV Cache 和框架开销留个 6–8GB 余量,权重能占的空间大概是 16–18GB。对照表一看,INT4 量化的 30B 模型(~15GB)勉强能塞进去,但几乎没有 KV Cache 空间了,只能跑单并发短上下文;如果换成 INT4 的 13B(~7GB),才有足够余量支撑几路并发。这就是为什么”24GB 显卡能跑 70B 模型”这种说法基本不成立——权重是能塞进去,但塞进去之后你跑不了几个并发,体验上等同于单机演示,不是能用的服务。

第二块:KV Cache

KV Cache 是推理加速的核心机制,但也是显存的”动态杀手”。

单 token KV Cache 占用近似(FP16 精度):

每 token KV 显存(Bytes) ≈ 2 × 层数 × 头数 × 头维度 × 2字节

对于 Llama-3-8B(层数 32、KV 头数 8、头维度 128):

每 token KV ≈ 2 × 32 × 8 × 128 × 2 = 131,072 字节 ≈ 0.125 MB

注意公式里用的是”KV 头数”,不是模型的注意力头总数,这是理解现代大模型显存优化的关键。Llama-3-8B 的注意力头总数是 32,但它用的是 GQA(Grouped Query Attention)架构,只有 8 个独立的 K/V 头,每 4 个 Query 头共享同一组 K/V。也就是说,如果按老式的 MHA(Multi-Head Attention,每个头都有独立 K/V)来算,KV Cache 会是现在的 4 倍。这不是巧合,而是 Llama-3、Qwen2、Mistral 这些主流开源模型从 2023 年后集体转向 GQA/MQA 的核心动机——纯粹为了压缩 KV Cache,让长上下文和高并发变得可行。所以选模型时,如果两个模型参数量接近,优先看它用的是 GQA 还是老式 MHA,前者的显存表现会好非常多。

实际意义

并发请求数上下文长度近似 KV Cache(Llama-3-8B)
14K token~0.5 GB
84K token~4 GB
324K token~16 GB
816K token~16 GB

高并发 + 长上下文场景,KV Cache 可以轻松超过权重本身的显存占用。vLLM 的 PagedAttention 技术正是为了优化 KV Cache 的显存碎片化问题而设计。

为什么会碎片化? 传统实现会为每个请求预分配”最大可能长度”的连续显存块,比如你设了 max_model_len=8192,即便某个请求只用了 200 token,也可能预留了 8192 token 的空间——请求一多,显存里全是这种”预留但没用满”的空洞,实际能承载的并发数远低于理论值。PagedAttention 借鉴操作系统虚拟内存分页的思路,把 KV Cache 切成固定大小的小块(block),按需分配、用完释放,显存利用率能从 20%–40% 提到 90% 以上。这也是为什么同样一张卡,vLLM 跑的并发数往往比原生 HuggingFace Transformers 高出几倍——不是算力更强,是显存管理更聪明。

第三块:框架开销

框架本身(PyTorch、CUDA 上下文、vLLM 运行时等)通常占用 1–3 GB,可当作固定项加入估算。这部分具体拆开是:CUDA context 本身大概 300–500MB(每张卡、每个进程都要占一份,这也是为什么同一张卡起多个推理进程比想象中费显存);PyTorch 的 caching allocator 会预留一部分显存池减少频繁申请释放的开销,通常几百 MB 到 1GB;再加上 vLLM/TensorRT-LLM 这类推理框架自己的运行时缓冲区。

真正容易被低估的是 prefill 阶段的 activation 显存。生成阶段(decode)每次只处理 1 个新 token,activation 很小;但 prefill 阶段要一次性处理整段输入 prompt(比如一次丢进去 4000 token 的长文档),中间层的激活值显存会随 batch size × 序列长度线性增长,短时间内可能冲高到 GB 级别,跑完这一次 forward 就释放。如果你的框架开销预算只按 decode 阶段的稳态显存来估,遇到长 prompt 批量请求时很容易被 activation 显存打个措手不及,报 OOM。保守做法是留 3–5GB 的浮动余量而不是 1GB。

完整估算示例

场景:用 vLLM 部署 Llama-3-70B(INT4),支持 16 路并发,上下文 4K

  • 权重:70 × 0.5 ≈ 35 GB
  • KV Cache(按 70B 模型参数比例估算):~20 GB
  • 框架开销:~2 GB
  • 合计:约 57 GB

这意味着需要两张 A100 40GB(张量并行)或一张 H100 80GB。

部署完怎么验证估算准不准? 别只看理论值就上线,跑起来后用 nvidia-smi -l 1(每秒刷新一次)盯着显存曲线,同时用压测工具(比如 vLLM 自带的 benchmark 脚本,或者简单地写个脚本并发发请求)模拟你的真实流量。你应该看到显存占用先跳到一个基线(权重 + 框架开销),然后随并发数上升逐步增长,最终稳定在一个平台期——如果稳定不下来、持续爬升直到 OOM,说明有请求没有正常释放(常见于没有正确处理超时/断连的请求,KV Cache 块一直没归还),得去查框架的请求生命周期管理,而不是简单加显存了事。

真实踩坑:CUDA OOM 报错怎么排查。 vLLM 部署后如果看到类似 torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 256.00 MiB 或者 vLLM 自己报的 ValueError: No available memory for the cache blocks,先别急着加卡,按这个顺序排查:

  1. 先看 gpu_memory_utilization 参数:vLLM 默认会尝试占满你设定比例(默认 0.9)的显存来分配 KV Cache 块,如果这台机器上还跑着别的进程占了显存,vLLM 启动时探测到的”可用显存”是错的,会导致后续分配失败。解决办法是先用 nvidia-smi 确认这张卡真实空闲多少,再手动调低这个参数到实际能用的比例。
  2. 再看 max_model_len:如果你把它设成了模型支持的最大值(比如 Llama-3 的 8192 甚至更长),vLLM 会按这个长度预估 KV Cache 需求,值越大能同时支撑的并发请求数越少。如果你的业务场景用不到这么长的上下文,主动调小这个值,能直接换回更多并发容量。
  3. 看是不是 prefill 阶段的长 prompt 撞上了:如果 OOM 只在处理特别长的输入(比如上传的长文档)时出现,稳态运行没问题,大概率是前面说的 activation 显存峰值问题,可以通过降低 max_num_batched_tokens 限制单批次处理的 token 总量来缓解。
  4. 最后才是加卡或换更大显存的卡:前三步都调过还是不够,才说明是真实容量不足,这时候该老老实实按估算公式重新选型,而不是头痛医头地不断调参数。

消费卡 vs 专业卡对比

卡型分类代表型号显存范围特点适用场景
消费卡(高端)RTX 3090 / 409024 GB价格相对亲民,无 ECC个人实验、7B–13B 小模型
消费卡(主流)RTX 3080 / 408010–16 GB量化后可跑 7B本地开发测试
专业卡(入门)A10G / L424 GBECC 内存,生产稳定小批量生产推理
专业卡(主力)A100 / H10040–80 GBNVLink、HBM,高带宽生产级高并发,70B+
专业卡(新品)H20 / H20080–141 GB超大显存 HBM3e超大模型单卡部署

关键差异

  • ECC 内存:消费卡没有 ECC(错误纠正),长时间运行下内存错误风险更高,不建议用于对准确性要求高的生产场景
  • 显存带宽:专业卡的 HBM 带宽通常是 GDDR 的 3–5 倍,对推理吞吐量影响显著
  • 多卡互联:NVLink 支持高速多卡张量并行,消费卡通过 PCIe 互联带宽受限

关于二手消费卡的提醒:4090/3090 二手市场上不少是”矿卡”(挖矿长期满载运行过),显存颗粒老化风险更高,长时间高负载推理时更容易出现显存 ECC 错误或稳定性问题(虽然消费卡本身没有 ECC 校验,但硬件老化会直接体现为偶发花屏、驱动崩溃、甚至无提示的输出乱码)。如果你是拿来做生产服务而不是个人实验,二手卡省下的钱可能远不够抵消一次线上故障排查的时间成本。个人本地开发、离线批处理这类容错场景,二手卡的性价比确实很有吸引力。

多卡互联对实际吞吐的影响也值得算一笔账:NVLink 的带宽通常在 600GB/s 以上(A100 NVLink 3.0),而消费卡走 PCIe 4.0 x16 的带宽只有 32GB/s 左右,差了近 20 倍。这个差距在单卡能装下模型时感觉不出来,但一旦你需要跨卡张量并行(比如两张 4090 拼 48GB 去跑一个 24GB 装不下的模型),每一层前向传播都要做一次跨卡通信,PCIe 带宽瓶颈会让多卡消费卡组合的实际吞吐远低于”两张卡显存相加”给你的直觉预期。这也是为什么专业卡贵得不只是显存容量,互联带宽才是撑起大规模并行推理的关键差异点。

量化怎么选?

量化方案显存节省精度损失推荐程度
FP16(无量化)基准显存充裕时首选
INT8(LLM.int8())~50%几乎无显存紧张时首选
GPTQ INT4~75%轻微显存极紧张,可接受轻微损失
AWQ INT4~75%比 GPTQ 略好推荐优先于 GPTQ
GGUF Q4_K_M~75%轻微llama.cpp 生态,CPU 推理必选

怎么在这几个方案里做决策,别只看表格里的”推荐程度”,看你的实际约束

  • 如果你用 vLLM/TensorRT-LLM 这类专注 GPU 服务化部署的框架,量化格式选 AWQ:它的量化校准过程比 GPTQ 更关注激活值分布(activation-aware),同等 4bit 精度下困惑度通常更低,而且主流推理框架对它的算子支持已经很成熟,推理速度不吃亏。
  • 如果你要在 Mac、笔记本、没有独立 GPU 的机器上跑,或者想用 CPU+GPU 混合推理,选 GGUF(配合 llama.cpp / Ollama):它是为纯 CPU 和消费级硬件设计的格式,量化档位选择更细(Q4_K_M、Q5_K_M、Q8_0 等),可以按你的内存和速度需求灵活权衡,这是 GPTQ/AWQ 不具备的生态优势。
  • GPTQ 现在更多是历史遗留选择——如果你要用的模型只发布了 GPTQ 版本、没有 AWQ 版本,才退而求其次用它,新项目没必要主动选它。
  • 不确定量化对你的具体任务影响多大,别凭感觉判断,花十分钟跑一遍你的真实业务样本(哪怕只有几十条),INT4 和 FP16 版本各跑一遍对比输出质量,这比看任何通用榜单都可靠——量化损失在不同任务类型上的表现差异很大,通用评测集的结论未必适用于你的场景。

常见问题

显卡显存不够能用内存凑吗?
可以,但代价极大——模型推理速度会降低 10–100 倍以上(CPU 带宽远低于 GPU HBM)。仅适合没有延迟要求的批处理场景,或实在买不到更大显存卡时的临时方案。

多卡张量并行是否线性增加显存?
是的,张量并行会将权重均匀切分到多卡,显存近似线性叠加。但多卡之间有通信开销,实际吞吐不是线性提升。

量化后的模型能用于所有任务吗?
对话、摘要、翻译、代码生成等常见任务,INT4 量化影响通常可忽略。但对数学推理、长链逻辑推理等任务,量化可能带来更明显的精度下降,建议先评测后再决策。

不想真的部署一遍,有没有办法提前验证显存够不够?
有两种低成本方式。一是直接用本文的公式手算,权重按参数量×字节数、KV Cache 按并发数×上下文长度×每 token 占用,两项加上 3–5GB 框架开销,基本能estimate 到八九不离十。二是很多推理框架支持”干跑”模式,比如 vLLM 启动时加 --enforce-eager 并观察启动日志里打印的显存分配情况,它会在真正接受请求前把权重加载和 KV Cache 池的显存需求打印出来,不用真发请求就能看到框架自己算出来的显存占用,比你手算更准,因为它把你模型的具体层结构都算进去了。

云 GPU 实例选型时,显存和价格怎么权衡?
别只看”每 GB 显存多少钱”这种单一指标,你要看的是”每 GB 显存能承载多少有效并发”。同样是 80GB 显存,H100 因为算力和带宽都更强,同等并发下响应延迟更低、单位时间能处理的请求数更多,实际的”每请求成本”可能比看起来更便宜的老卡(比如同显存的 A100)还低——尤其是长上下文、高并发场景,算力和带宽的差距会被放大。如果你的场景是低并发、对延迟不敏感的离线批处理,选性价比更高的老卡或者混合精度更激进的量化方案,反而更划算。判断标准始终是你的真实流量画像,不是显卡参数表上的数字。


延伸阅读: