☰
显存决定你能跑多大模型:计算、量化与实测指南
2026/10/9 6:48:37 网站建设 项目流程

先别急着看型号、背参数,真正决定你能跑多大模型的,是显存这件事。很多朋友问“我这台显卡能跑70B吗”,问题不在于显卡强不强,而在于显存装不装得下。这篇文章我会从头拆一遍显存计算逻辑、模型档位怎么选、Ollama和llama.cpp实际跑起来的显存占用,再附上一堆实测和踩坑记录。准备一张能看nvidia-smi的显卡,我们直接开算。

1. 显存需求怎么算:先记住这个公式

1.1 模型权重占用:精度决定字节数

所有大模型本质都是一堆权重参数,参数存进显存的时候占多少字节,主要看精度。

这里先说一个最基础的单位换算:1GB = 1024MB,1个参数如果以FP32(单精度浮点)保存,占4字节;FP16/BF16占2字节;INT8占1字节;INT4占约0.5字节。看到这里你就该明白,同一个7B模型,用FP16跑和用INT4跑,显存占用能差出4倍。

以7B模型为例:

  • FP16/BF16:14GB左右
  • INT8:7GB左右
  • INT4(GGUF Q4_K_M):3.5GB到4.5GB左右

很多人有个误区,以为7B模型就是“7GB显存”,其实7B指的是70亿参数,FP32权重就要28GB,FP16也要14GB。所以你在显卡上能不能跑,第一件事就是把“参数量 × 每参数字节数”算清楚。我一般会用这个式子先过一遍:模型权重显存 = 参数量 × 字节数。比如13B模型,FP16就是26GB,INT4大概6.5GB到8GB,量化之后才谈得上用消费级显卡去碰。

1.2 KV Cache:上下文越长越吃显存

只算权重是远远不够的,真正让你爆显存的往往是KV Cache。自回归模型在生成每个token时,会把历史token的Key和Value缓存下来,避免重复计算。这个缓存随着上下文长度线性增长,层数越多、模型越大、上下文越长,占用的显存就越夸张。

KV Cache的经验估算公式:2 × 层数 × hidden_size × 序列长度 × 精度字节数。每多一个token,都要为每一层、每一个注意力头存两份向量。举例来说,一个7B模型在4096上下文长度下,KV Cache大约要占用1GB到1.5GB;拉到32K上下文,轻松吃到6GB以上。70B模型如果上下文拉满,KV Cache几十个GB都是正常的。

这也是为什么有人能在8GB显卡上跑7B INT4,但你把上下文从4096调到16384,马上就OOM。不是模型变了,是KV Cache在偷偷膨胀。所以我做显存预算的时候,一定会给KV Cache单独留一档。

1.3 别忘了框架和CUDA上下文开销

除了模型权重和KV Cache,还有一类隐形成本:CUDA context、cuBLAS/cuDNN的算子加载、推理框架的中间缓冲区、显存碎片。这部分通常占0.5GB到2GB,视框架和驱动版本而定。Windows系统下CUDA context经常比Linux下更占空间,某些驱动版本还会额外吃几百MB。

我在实际分配显存时,一般会在“权重 + KV Cache”的基础上再加30%的余量,作为框架开销和突发峰值。这也是为什么很多教程给的推荐显存比理论值大一圈,不是算法不对,是没把平台开销算进去。你如果按14GB权重去配一张16GB卡,一旦上下文开长一点、batch大一点,立刻OOM,微信小窗都没法切出去救急。

2. 决定你显卡能跑啥的,不只是显存容量

2.1 显存容量决定“装不装得下”

显存容量是门槛,相当于行李箱的容积。模型权重多大、KV Cache多大、框架开销多大,三者加起来必须小于可用显存。之前那张表可以直接参考:

模型参数量FP16/BF16权重INT8权重INT4权重(Q4_K_M)推测最低可用显存(含KV和开销)
3B6GB3GB2GB4GB可跑INT4
7B/8B14GB7GB4GB8GB可跑INT4,16GB才舒服跑FP16
13B/14B26GB13GB8GB12GB能跑INT4,24GB才能稳定FP16
32B/34B64GB32GB18GB24GB卡可跑INT4,48GB才稳
70B/72B140GB70GB40GB48GB起步,否则只能靠内存Offload

这张表是我根据常见显存配置推的,不算严谨,但足够选型。你可以看到,用8GB显卡跑7B INT4是可行的,但显存里几乎没有富裕;用24GB显卡跑32B INT4也是可行的,但别把上下文拉太长。

2.2 显存带宽决定“吐字有多快”

容量决定能不能跑,带宽决定跑多快。大模型自回归解码时,每生成一个token,都要把模型权重从头到尾读一遍。这个读取速度受显存带宽限制,而不是单纯看算力。

我做一个粗糙的计算:假设7B FP16权重是14GB,在RTX 3060约336GB/s的显存带宽下,把所有权重读一遍大约要42ms,理论生成速度上限就是1秒约24个token。换到RTX 4090,带宽约1008GB/s,同样读14GB权重只需14ms,理论上限约70 token/s。如果换成7B INT4的4GB权重,在3060上读取只要12ms,理论速度直接翻到80 token/s以上。这就是为什么量化不仅能省显存,还能显著提速度,模型没变,但每次生成的“阅读量”变小了。

真实推理速度还会被计算延迟、KV Cache读写、线程调度、内存拷贝各种环节拖后腿,但带宽瓶颈这个方向是明确的。有些显卡算力很强但显存带宽不高,比如很多专业卡是为计算而生的,跑大模型反而会被带宽卡住。你如果看到某张显卡跑大模型速度不如预期,先查显存带宽而不是算力。

2.3 算力、驱动和软件栈决定“加速效果”

算力主要影响计算密集的部分,比如FlashAttention、批量推理、长上下文处理。现在主流推理框架都对NVIDIA的Tensor Core做了优化,FP16/BF16的矩阵乘法很快;INT8和INT4还会用到INT8 Tensor Core或专门的量化内核。反而是老一代只支持FP32的卡,跑量化模型会很别扭,速度和兼容性都差。

驱动和软件栈常常被低估。同一张显卡,在Windows下用Ollama和在Linux下用vLLM,显存占用和速度可能差出20%到30%。NVIDIA官方驱动、CUDA版本、PyTorch版本之间有一个兼容矩阵,不是版本越新越好。我遇到过很多次“代码明明没问题但显存占用异常高”,最后都是驱动或CUDA版本不配套。建议你在跑本地模型之前,先用nvidia-smi确认驱动版本,再到框架文档里对照支持范围,别一上来就盲目升级驱动。

3. 模型选择实操:从你的显存倒推参数档位

3.1 先查显卡家底:nvidia-smi和任务管理器

选模型之前,第一件事是确认自己的显存到底多大、当前被谁占用。NVIDIA显卡在Windows和Linux下都用同一个命令:

nvidia-smi

这个命令会显示显卡型号、显存总量、当前显存占用、功耗、温度、运行进程。想让它在终端里持续刷新,Linux可以用:

watch -n 1 nvidia-smi

想只输出显存信息,用:

nvidia-smi --query-gpu=name,memory.total,memory.used,memory.free --format=csv

Windows下不方便装工具的,可以直接用任务管理器,性能标签页里能看到“专用GPU内存”。对于AMD显卡,Windows任务管理器同样能看到显存用量;Linux下可以用radeontop或者nvtop(这个工具也支持NVIDIA/A卡)。实时看CPU和显卡占用率,我的经验是:跑推理时把Windows任务管理器或Linux的htop和nvidia-smi一起开,分屏看。如果GPU利用率很低但CPU满了,说明喂不上数据;如果GPU利用率高但显存没满,说明模型太小、上下文太短,没有把卡喂饱。

3.2 从显存倒推参数档位:直接抄作业

查完显存,下面就是对照选型。我根据主流显卡和真实跑过的模型,整理了一张“作业表”:

可用显存推荐模型档位说明
4GB1.5B-3B INT4只能跑小模型,聊天够用,写代码别太期待
8GB7B/8B INT4,3B FP16Qwen2.5-7B INT4可跑,上下文别超4K
12GB7B/8B INT4或INT8,14B INT4Qwen2.5-14B INT4要控制在8K上下文内
16GB7B/8B FP16或INT8,14B INT4很稳家用卡最甜点,跑14B INT4体验很好
24GB32B INT4,14B FP1632B Q4_K_M正好塞进24GB,上下文短一些
48GB70B INT4单卡或双卡,A6000/专业卡/双P40都可以

比如你手头是RTX 3060 12GB,我实测过Qwen2.5-7B-Instruct的GGUF Q4_K_M,上下文设4096,显存占用大概在6GB到7GB之间,速度能到40 token/s左右。如果你把模型换成Qwen2.5-14B Q4_K_M,显存会涨到10GB左右,速度掉到25 token/s上下,还能接受,但再多开两个网页就可能卡顿。要是换成DeepSeek-R1-Distill-Qwen-14B这种长思维链模型,上下文很容易拉长,12GB就会开始紧张,建议把上下文压到3072或2048。

如果你有24GB显存(比如RTX 4090、RTX 3090、Tesla P40),可以直接冲击Qwen2.5-32B的INT4版本。我实测过32B Q4_K_M大约需要18GB权重显存,加上KV Cache和框架开销,24GB卡刚好能装下,上下文建议控制在4096到8192之间,速度大概15到25 token/s。再往上冲70B INT4就非常勉强了,除非你用llama.cpp把一部分层Offload到内存,那速度会掉到一个字一个字崩出来的程度。

3.3 量化档位怎么选:Q4_K_M、Q5_K_M、Q8_0的取舍

选好模型后要选量化格式。GGUF量化命名里的K代表K-quant算法,Q4_K_M是4bit量化里的均衡档位,Q5_K_M是5bit,Q8_0是8bit。我自己的经验是:

  • Q4_K_M:日常首选,显存占用小,速度最快,绝大多数场景质量损失不明显。
  • Q5_K_M:显存比Q4多20%左右,数学、代码等逻辑任务上会比Q4稳一点。
  • Q8_0:接近原始精度,显存占用接近FP16的一半,速度比FP16快,适合你显存有富余且追求质量的情况。
  • 纯FP16/BF16:显存足够时质量最好,但对家用卡来说不划算,除非你卡上显存明显溢出。

你可能会看到各种“智商”测试图对比量化等级,实际用下来,日常聊天Q4和Q8的差别很小,但在复杂推理题上,Q4偶尔会答错而Q8能答对。我的建议是:先跑Q4_K_M,如果发现模型明显瞎编,再升到Q5或Q8,别一上来就追求最高精度。

4. 实操记录:Ollama和llama.cpp跑起来的细节

4.1 Ollama:最省心的本地推理方案

Ollama是目前最无脑的本地大模型方案,它自动帮你做量化下载、显存分配、上下文管理。命令也简单:

ollama run qwen2.5:7b

拉取模型时,Ollama会默认选择适合当前硬件的量化版本,通常是Q4_K_M。运行后想确认它有没有正确调用显卡,用:

ollama ps

这个命令会显示当前加载的模型、显存占用、GPU利用率。如果显示GPU字段为0,或显存占用很低,那要检查是不是只用了CPU。Windows下可以设置环境变量:

set OLLAMA_NUM_GPU=1 set OLLAMA_MAX_LOADED_MODELS=1 set OLLAMA_CONTEXT_LENGTH=4096

OLLAMA_NUM_GPU=1表示允许使用GPU;OLLAMA_MAX_LOADED_MODELS=1保证同时只加载一个模型,避免多个模型把显存占满;OLLAMA_CONTEXT_LENGTH=4096可以用来限制上下文长度,显存不够时这个非常重要。

我用Ollama跑Qwen2.5-14B INT4时,在12GB显卡上遇到过加载成功后生成速度极慢的情况。后来发现是上下文默认拉到了32K,KV Cache直接吃爆显存,降低了上下文长度后立马恢复流畅。

4.2 llama.cpp:精细控制每一层该放哪里

如果你想精确控制到底有多少层放显卡、多少层放内存,就用llama.cpp。先下载GGUF格式的模型文件,然后跑:

llama-cli -m qwen2.5-7b-instruct-q4_k_m.gguf -ngl 99 --ctx-size 4096 -t 8

-ngl 99意思是把尽量多的层放到GPU上,99是一个“全部放进去”的写法。如果显存不够,就减小这个数字,比如-ngl 20表示只放20层到显卡,剩下的跑CPU内存,速度会变慢,但至少不会OOM。--ctx-size控制上下文长度,-t是线程数。

启动一个兼容OpenAI API的服务,可以这样:

llama-server -m qwen2.5-7b-instruct-q4_k_m.gguf -ngl 99 --port 8080

然后通过http://127.0.0.1:8080/v1/chat/completions访问,很多本地工具都能直接对接这个接口。

遇到llama.cpp报显存分配失败时,日志里通常会写“llama_kv_cache_init: failed to allocate memory for KV cache”,这就明确了是KV Cache超限。解法很简单:调小--ctx-size,或者调小-ngl,或者换更低位的量化格式。

4.3 低显存优化技巧:上下文压缩和Flash Attention

显存不够时,不要第一反应就是换更小的模型。有四个很实用的技巧:

  • 缩短上下文长度:从4096降到2048,KV Cache直接减半,这是最立竿见影的手段。
  • 开Flash Attention:llama.cpp加-fa参数,Ollama部分版本默认开启,能显著降低KV Cache内存占用和计算延迟。
  • 避免多进程同时加载模型:Windows下如果开着多个Ollama会话或者多个ComfyUI工作流,显存会被同时吃掉,跑不动时先清理后台。
  • 升级推理框架版本:新版本通常会优化内存分配,llama.cpp和Ollama都在持续优化,同样显存有时老版本爆、新版本就能跑。

另外提一句ComfyUI跑图像模型的情况,显存紧张时可以用--lowvram或--medvram启动,但其实真正的优化点是控制batch size、使用xformers或sdp attention、减少临时节点。低显存模式下速度会更慢,但总比OOM好。原理都是类似的:减少同时驻留显存的数据量,把一部分计算拆分到更细的粒度。

5. 常见问题排查实录

5.1 CUDA Out Of Memory:明明看着显存够,怎么就爆了

最常见的场景:你查了模型权重刚好比显存小,结果运行时报CUDA OOM。原因通常是三类:一是其他程序占了显存,浏览器、设计软件、另一个推理进程都在抢显存;二是你只算了权重,没算KV Cache和CUDA context;三是显存碎片化,即使总剩余量够,连续显存块不足也分配失败。

排查顺序我一般这样走:

  1. 用nvidia-smi看当前进程和显存占用,把无关进程先关掉。
  2. 调低上下文长度,比如从8192调到2048。
  3. 切换更低位的量化,例如从Q5_K_M换到Q4_K_M。
  4. 把llama.cpp的-ngl调低,让部分层跑内存,用速度换稳定。
  5. 更新推理框架到最新版,老版本的内存复用算法确实差一些。

5.2 显卡驱动异常:代码43、nvlddmkm 153、事件ID 0

很多新手在装本地模型前先栽在驱动上。最常见的是Windows设备管理器报“代码43”,意思就是Windows停了这块显卡,因为它报告了一个问题。导致代码43的原因五花八门,但大模型场景里我遇到最多的还是驱动残留或驱动版本冲突。

如果你显卡能识别但装不上驱动,或者装完老报错,先用DDU(Display Driver Uninstaller)在安全模式下彻底卸载旧驱动,然后重装NVIDIA官方驱动。别只点“卸载”就完事,注册表残留和旧驱动文件才是冲突的根源。顺手关掉Windows的自动驱动更新,否则系统可能给你装回一个不兼容的版本。还有一个高频场景是笔记本混合显卡,独显驱动被核显顶掉了,设备管理器里能看到独显但状态异常,这时要去BIOS里确认独显模式或检查NVIDIA控制面板的全局设置。

nvlddmkm 153这个事件,日志里写着显卡驱动超时或重置,最常见的原因是显存过热、供电不稳、超频太激进。先清理显卡灰尘,检查温度,再把显卡频率调回默认。如果你是在挖过矿或者二手卡上遇到,还要怀疑显存本身有问题。事件ID 0也很像,通常是驱动在恢复过程中反复重置,先卸载干净重装,再看硬件。

5.3 显卡利用率低:明明调用了GPU,为什么这么慢

拿Ollama跑一个3B小模型,GPU利用率可能只有10%,这是正常的,因为模型权重太小,显存带宽远没跑满,瓶颈反而在CPU调度、内存拷贝和系统单线程。想让大卡吃不饱的模型跑得更快,办法是把上下文拉长、把batch开大,或者干脆换一个更大的模型,让算力有东西可算。

另一种利用率低是硬件识别问题。比如WSL里跑CUDA,有时会掉到Windows共享GPU或虚拟GPU上;笔记本混合显卡环境下nvidia-smi显示GPU但实际跑的是核显;还有一种奇葩情况,显卡驱动装好但Ollama识别不到GPU,日志里直接走CPU推理。排查时用ollama ps看GPU占用字段,如果是0,多半是没走CUDA。还有,如果你在虚拟机或远程服务器里,显存可能被其他租户占用。公有云GPU环境遇到“无空闲显卡”,通常只能排队等待或者换区,本地则要考虑是不是被别人远程连入了。

5.4 AMD和Intel显卡能不能跑:别被CUDA绑死

NVIDIA卡享受最好的软件生态,但AMD和Intel现在也不是完全没戏。AMD这边,PyTorch有ROCm版本,专门给A卡原生跑CUDA风格代码;Ollama也有ROCm版本,安装之后能直接识别A卡。项目里的ZLUDA兼容层可以让一部分基于CUDA的程序在A卡上跑,但别指望所有程序都能无脑兼容,稳定性要一个一个试。Intel显卡则走IPEX-LLM、llama.cpp的Vulkan后端和SYCL路径,核显也能跑小模型,速度不要期待太多。

我之前在AMD 780M核显上跑过一个1.5B模型,用Vulkan后端能跑,速度大概10 token/s,虽然不算流畅,但至少证明“只有N卡才能玩”已经过时了。GPU版PyTorch在A卡上是安装ROCm对应版本,Intel要用IPEX-LLM,操作路径不同,别拿着NVIDIA的whl文件硬装。

最后再分享一个小技巧

我个人做显存预算已经形成了习惯:先nvidia-smi查可用显存,减掉1GB系统保留量,剩下的做总预算;再用模型权重估算值加上目标上下文的KV Cache;最后把这个数和总预算对比。如果剩余不足15%,就考虑降量化或缩上下文。这个流程花不了一分钟,但能避免90%的OOM。

还有一点想提醒:显存计算不是死的,别只盯着模型参数,驱动、框架版本、显存带宽、上下文长度都比纸面参数更影响实际体验。跑本地模型最舒服的状态,不是把显存塞到99%,而是让模型占用70%左右,留出一部分空间给系统调度和突发峰值。我的RTX 3060 12G跑Qwen2.5-14B INT4时,看着显存占用10G好像很危险,但实际稳定跑了一整天都没崩,因为剩下的2G刚好够CUDA上下文和临时缓冲区。反过来,有些人非要把上下文拉到16K,显存看着只占8G,下一秒就OOM。这里面的分寸,只能靠你对着自己的卡多试几次。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询