Ollama怎么限制显存占用?显存溢出报错完整解决办法-环球云域CloudIDC

Ollama怎么限制显存占用?显存溢出报错完整解决办法

✨ Ollama怎么限制显存占用?显存溢出报错完整解决办法

自己在用K80、RTX3090这类老显卡跑Ollama本地模型的时候,经常碰到CUDA out of memory报错。有时候模型加载正常,多聊几轮对话就直接闪退。网上很多教程只说换更小模型,很少分开Windows和Linux两套方案,num_gpu、num_ctx、KV缓存这些参数的作用也讲得比较简略。我把自己调试的步骤整理出来,命令可以直接复制测试。

先搞懂:显存是怎么被吃掉的

Ollama运行模型,显存开销主要来自两块:模型权重、KV缓存。

  • 模型权重:就是模型本体文件,选用q4、q3这类不同量化版本,显存占用差距很明显
  • KV缓存:保存每一轮对话的上下文,也是很容易被忽略的点。上下文窗口开得越大,缓存占用越高,长对话场景更容易爆显存
  • 额外开销:多并发对话请求、显卡驱动本身预留的内存,也会持续占用显存空间

想要控制显存占用,不能只调单一参数,需要组合调整:加载进显卡的模型层数、上下文长度、并发数量、缓存类型一起配合。

方案一:运行命令临时指定参数(适合测试)

适合临时调试,关闭模型之后设置就失效,用来反复试参数很方便。

ollama run qwen2.5:7b-instruct-q4_K_M –num-gpu 24 –num_ctx 2048
  • num-gpu:控制加载到GPU里的模型层数。显存不够的时候降低这个数值,剩下部分交给内存运行,速度会下降,但可以顺利载入模型
  • num_ctx:上下文token长度。默认一般是2048,如果不需要很长的对话,可以改成1024、512,能明显压低KV缓存占用
💖 小提示:num-gpu 设置为 0 的时候,模型完全跑在内存里,显卡不参与运算,推理速度会慢很多,只适合临时测试。

方案二:写 Modelfile 固化参数(长期固定配置)

每次启动手动敲参数比较麻烦,可以新建Modelfile把配置写死,之后直接调用自定义模型,参数一直生效。

新建文本文档,命名 Modelfile,填入下面内容:

FROM qwen2.5:7b-instruct-q4_K_M PARAMETER num_gpu 24 PARAMETER num_ctx 2048 PARAMETER num_parallel 1

保存文件后,在这个目录打开终端,执行创建命令:

ollama create qwen2.5-7b-limit -f Modelfile

后续直接运行自定义名称的模型即可:

ollama run qwen2.5-7b-limit

方案三:全局环境变量,控制 Ollama 服务默认行为

这个设置会作用到全部模型,适合固定一台机器专门跑本地模型,统一限制并发和缓存策略。

💜 Linux 系统操作:
# 停止服务 sudo systemctl stop ollama # 编辑服务配置 sudo systemctl edit ollama

填入下面内容:

[Service] Environment=”OLLAMA_NUM_PARALLEL=1″ Environment=”OLLAMA_KV_CACHE_TYPE=q4_0″ Environment=”OLLAMA_CONTEXT_LENGTH=2048″

保存配置,重启服务:

sudo systemctl daemon-reload sudo systemctl restart ollama
💜 Windows 系统操作:

先右键托盘里的Ollama图标退出程序,打开CMD窗口依次执行:

set OLLAMA_NUM_PARALLEL=1 set OLLAMA_KV_CACHE_TYPE=q4_0 ollama serve

这个CMD窗口保持打开,新开窗口再拉模型和对话;想要开机自动加载,需要把环境变量添加进系统变量。

  • OLLAMA_NUM_PARALLEL:并发对话数量,默认可能同时处理多条请求,很容易吃满显存,设置为1,一次只跑一条对话
  • OLLAMA_KV_CACHE_TYPE=q4_0:对KV缓存做量化,损失很小的输出效果,换取显存空间,对显存紧张的老显卡很实用

方案四:Swap/虚拟内存兜底(不推荐优先使用)

如果显存只差一点点,又不想下调模型层数,可以开启交换空间兜底。先说清楚短板:交换空间速度远不如显存,生成文字延迟会明显变高,适合临时应急,不适合日常频繁使用。

Linux 创建16G交换文件示例:

sudo fallocate -l 16G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile

Windows 在 系统属性 – 高级 – 性能设置 – 高级 – 虚拟内存,手动调高页面文件大小。

排查步骤:报错之后怎么定位问题

  1. 执行 ollama ps,查看当前正在加载的模型,确认是不是多个模型同时占用显存,ollama stop 加上模型名称就可以卸载
  2. Linux用nvidia-smi,Windows打开任务管理器,查看显卡显存占用,排查有没有别的程序占用显卡资源
  3. 想要看完整报错详情,可以调取 Ollama 的运行日志。Windows这边不用记复杂符号,直接在资源管理器顶部地址栏进入本地应用数据目录,找到Ollama文件夹内的server.log日志;Linux我平时排查习惯用下面这条命令打印服务日志,重点看CUDA out of memory相关提示,确认是不是显存不足引发崩溃。
    journalctl -u ollama –no-pager
  4. 短对话正常、长对话才崩溃,优先调低 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,长对话场景依旧建议控制上下文长度

参数没有统一标准,每个人显卡型号、想要的对话长度不一样。我一般会先用保守数值起步测试,慢慢往上调整,在推理速度和显存占用之间找到合适的平衡点。

本文为个人实操记录,参数可以根据自己显卡情况微调,欢迎一起交流踩坑经验。
文章广告横幅
网络违法犯罪举报平台 广告
© 版权声明
THE END
喜欢就支持一下吧
点赞121 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容