✨ Ollama怎么限制显存占用?显存溢出报错完整解决办法
自己在用K80、RTX3090这类老显卡跑Ollama本地模型的时候,经常碰到CUDA out of memory报错。有时候模型加载正常,多聊几轮对话就直接闪退。网上很多教程只说换更小模型,很少分开Windows和Linux两套方案,num_gpu、num_ctx、KV缓存这些参数的作用也讲得比较简略。我把自己调试的步骤整理出来,命令可以直接复制测试。
先搞懂:显存是怎么被吃掉的
Ollama运行模型,显存开销主要来自两块:模型权重、KV缓存。
- 模型权重:就是模型本体文件,选用q4、q3这类不同量化版本,显存占用差距很明显
- KV缓存:保存每一轮对话的上下文,也是很容易被忽略的点。上下文窗口开得越大,缓存占用越高,长对话场景更容易爆显存
- 额外开销:多并发对话请求、显卡驱动本身预留的内存,也会持续占用显存空间
想要控制显存占用,不能只调单一参数,需要组合调整:加载进显卡的模型层数、上下文长度、并发数量、缓存类型一起配合。
方案一:运行命令临时指定参数(适合测试)
适合临时调试,关闭模型之后设置就失效,用来反复试参数很方便。
- num-gpu:控制加载到GPU里的模型层数。显存不够的时候降低这个数值,剩下部分交给内存运行,速度会下降,但可以顺利载入模型
- num_ctx:上下文token长度。默认一般是2048,如果不需要很长的对话,可以改成1024、512,能明显压低KV缓存占用
方案二:写 Modelfile 固化参数(长期固定配置)
每次启动手动敲参数比较麻烦,可以新建Modelfile把配置写死,之后直接调用自定义模型,参数一直生效。
新建文本文档,命名 Modelfile,填入下面内容:
保存文件后,在这个目录打开终端,执行创建命令:
后续直接运行自定义名称的模型即可:
方案三:全局环境变量,控制 Ollama 服务默认行为
这个设置会作用到全部模型,适合固定一台机器专门跑本地模型,统一限制并发和缓存策略。
填入下面内容:
保存配置,重启服务:
先右键托盘里的Ollama图标退出程序,打开CMD窗口依次执行:
这个CMD窗口保持打开,新开窗口再拉模型和对话;想要开机自动加载,需要把环境变量添加进系统变量。
- OLLAMA_NUM_PARALLEL:并发对话数量,默认可能同时处理多条请求,很容易吃满显存,设置为1,一次只跑一条对话
- OLLAMA_KV_CACHE_TYPE=q4_0:对KV缓存做量化,损失很小的输出效果,换取显存空间,对显存紧张的老显卡很实用
方案四:Swap/虚拟内存兜底(不推荐优先使用)
如果显存只差一点点,又不想下调模型层数,可以开启交换空间兜底。先说清楚短板:交换空间速度远不如显存,生成文字延迟会明显变高,适合临时应急,不适合日常频繁使用。
Linux 创建16G交换文件示例:
Windows 在 系统属性 – 高级 – 性能设置 – 高级 – 虚拟内存,手动调高页面文件大小。
排查步骤:报错之后怎么定位问题
- 执行 ollama ps,查看当前正在加载的模型,确认是不是多个模型同时占用显存,ollama stop 加上模型名称就可以卸载
- Linux用nvidia-smi,Windows打开任务管理器,查看显卡显存占用,排查有没有别的程序占用显卡资源
- 想要看完整报错详情,可以调取 Ollama 的运行日志。Windows这边不用记复杂符号,直接在资源管理器顶部地址栏进入本地应用数据目录,找到Ollama文件夹内的server.log日志;Linux我平时排查习惯用下面这条命令打印服务日志,重点看CUDA out of memory相关提示,确认是不是显存不足引发崩溃。
journalctl -u ollama –no-pager
- 短对话正常、长对话才崩溃,优先调低 num_ctx;一加载模型就报错,优先降低 num_gpu 或者换更低量化版本的模型
搭配建议,不同显存显卡参考
- 6G显存:优先7B模型q3量化,num_ctx 1024,num_gpu酌情下调
- 8G显存:7B q4模型,num_ctx 2048,并发固定为1
- 12G、16G显存:7B q4稳定运行,尝试14B模型时,需要调低层数和上下文窗口
- 24G显存(K80、4090这类):可以跑14B q4,长对话场景依旧建议控制上下文长度
参数没有统一标准,每个人显卡型号、想要的对话长度不一样。我一般会先用保守数值起步测试,慢慢往上调整,在推理速度和显存占用之间找到合适的平衡点。

















![表情[baoquan]-环球云域CloudIDC](https://cloudidc.vip/wp-content/themes/zibll/img/smilies/baoquan.gif)


暂无评论内容