本地部署大模型,显存不足如何优化?
很多朋友在本地跑大模型时都遇到过这个场景:明明下载好了模型,一加载就报 CUDA out of memory。
显存不足是部署大模型的头号拦路虎,但别急着放弃——下面三种方法从最简单到最深入,让你在现有硬件上也能跑起来。
1. 用量化模型,显存直接减半
量化就是把模型的权重从高精度(比如16位浮点数)压缩到低精度(4位或8位整数),显存占用会大幅下降,而生成的文本质量几乎不受影响。
- Ollama:拉取量化模型时,在模型名后加
:q4_K_M或:q8_0即可。例如拉取 Llama3.1 的4位量化版本:
ollama pull llama3.1:q4_K_M
运行和普通模型一样:
ollama run llama3.1:q4_K_M
- LM Studio:下载模型时选择带有
Q4_K_M或Q5_K_M标签的GGUF文件,加载时显存占用会少一半以上。 - llama.cpp:直接把量化后的GGUF文件丢进去,不需要额外设置。
效果:以7B模型为例,16位需要约14GB显存,4位量化只需约5GB,6GB显存的老卡也能跑。
2. 调整上下文长度和批处理大小,回收富余显存
模型推理时默认会预留较长的上下文窗口(比如4096 tokens),如果只做简单对话,可以缩短上下文并减小批处理大小。
- Ollama:运行时可指定
--num-ctx(上下文长度)和--num-batch(批处理大小):
ollama run llama3.1:q4_K_M --num-ctx 2048 --num-batch 128
上下文从4096降到2048,显存占用能减少1-2GB。
批处理默认是512,降到128对单次回答几乎无影响。
- llama.cpp:在启动命令中加
-c 2048 -b 128。 - LM Studio:在侧边栏的“Model”设置中,将“Context Length”调小(比如2048),点击“Apply”即可。
如果显存还是不够,可以把上下文进一步降到1024,但长对话内容会被较早丢弃。
3. 把部分层卸载到CPU,让显存喘口气
这个操作让模型的一部分计算在CPU上完成,算力会慢一些,但能跑大很多模型。
- Ollama(0.3.0以上版本):设置环境变量
OLLAMA_USE_CUDA_OFFLOAD并指定搬运层数:
set OLLAMA_USE_CUDA_OFFLOAD=20 # Windows
export OLLAMA_USE_CUDA_OFFLOAD=20 # Linux/macOS
然后正常 ollama run。
数字20表示把模型的前20层放到CPU,剩余部分依然在GPU。
层数根据模型总层数调整(比如7B模型有32层,放20层到CPU能省下大半显存)。
- llama.cpp:直接加
--ngl 12,表示只用GPU跑后12层:
./llama-cli -m qwen2.5-7b-q4_K_M.gguf --ngl 12 -c 2048
如果显存只剩1-2GB,可以调 --ngl 1(只用GPU跑1层),甚至 --ngl 0(全CPU),不过速度会明显下降。
- LM Studio:加载模型时,在右侧“GPU Offload”滑块中向右拖动(代表加载更多层到GPU),向左则是卸载到CPU。一般设到50%左右先试试。
注意:CPU卸载后生成速度会变慢(从几十token/s降到几token/s),但对问答场景完全够用。
避坑与高频问题
- 为什么用了量化还是爆显存? 可能是上下文设置太大,或者模型本身是70B以上的大模型,量化后也需要10GB+。先确认模型参数量,14B以下量化后一般6GB能跑。
- CPU卸载后生成时卡顿或报错? 检查CPU内存是否足够(至少要有模型量化后占用量的2倍)。还可以在Ollama中加
--num-threads 4限制CPU线程数,避免系统卡死。 - Ollama设置
OLLAMA_USE_CUDA_OFFLOAD后不生效? 升级Ollama到最新版,并确保你的显卡支持CUDA。也可以在运行前执行ollama serve重启后台进程。 - 所有方法试完还是爆显存? 最简单的终极大法:换成7B或3B量化模型,比如
phi3:3.8b-q4_K_M或tinyllama:1.1b,几乎任何显卡都能跑。
效果验证
- 运行命令前,先用
nvidia-smi查看当前显存占用。 - 加载优化后的模型,再次运行
nvidia-smi。 - 如果显存使用率低于显卡总容量的90%,且模型能正常回答,说明优化成功。
- 测试一个长问题(比如要求生成1000字回复),看看是否触发OOM错误。
如果你现在正被显存不足困扰,建议先直接套用量化模型(方法1),再视情况调小上下文或卸载层数。
三种方法可以同时使用,效果叠加。
记住:先量化,后调参数,最后卸载,这是最稳的顺序。