机器上插了两三张卡,跑 Ollama 的时候你未必知道它在用哪张,甚至可能全程在 CPU 上磨。这篇不聊框架选型,只解决一件事:怎么让它用你指定的那张卡,以及怎么验证它确实用上了。
机器上插了两三张卡,跑 Ollama 的时候你未必知道它在用哪张,甚至可能全程在 CPU 上磨。这篇不聊框架选型,只解决一件事:怎么让它用你指定的那张卡,以及怎么验证它确实用上了。
下面按「先确认有没有吃到加速 → 再挑卡 → 再决定多卡分摊还是 CPU 兜底 → 最后看哪些情况压根不用折腾」的顺序走一遍。每一步都给了能自己动手验证的动作,不用信任何人的口头结论。
先确认它到底有没有用上 GPU
别急着改参数。先把当前状态摸清楚,否则你调了半天可能只是把一个本来就没生效的配置换了个写法。最省事的是看启动时打印的加载信息,里面会体现权重被卸载到了什么设备上。
- 启动日志里如果只出现 CPU 相关字样,没有任何显卡内存卸载的提示,基本就是没吃到加速;
- 用系统自带的显卡占用工具盯显存和算力曲线,模型加载阶段和出词阶段曲线应该明显抬头,一条平线说明没在用;
- 拿一个稍大的模型做对照:纯 CPU 时首字延迟和出词速度会明显更差,这个差值是最好用的分界线;
- 如果你在同机跑别的推理服务,先把它停掉再测,否则占用曲线分不清是谁的。
指定某一张卡:按顺序看三种做法
指定显卡本质上就是告诉程序「你能看见的设备只有这一张」,或者「权重只往这张设备上卸载」。两种粒度不一样,多卡机器上经常会混用。下面按从粗到细的顺序排列。
- 环境变量方式
- 启动前把可见设备的编号限定成一张卡,程序眼里就只剩这一张;编号顺序按系统枚举结果来,不是按插槽顺序。
- 启动参数方式
- 让程序只把权重卸载到指定设备上,比改环境变量更细,适合想控制单卡占用量的场景。
- 配置方式
- 服务化常驻时把设备选择写进配置文件或启动脚本,避免每次开机重新设一遍。
这里有个坑要提前说:不同版本、不同后端对同一个参数名的识别口径可能不一致,照抄网上的命令经常不生效。判断方法是改完之后回到上一节的验证动作,看曲线和日志有没有变化,没变化就说明这个参数在当前版本里没被认。
- 列出系统枚举到的设备用显卡管理工具把设备编号列出来,记下你要用的那张卡对应的编号。注意这里显示的编号才是程序认的编号。
- 只暴露这一张卡在启动命令前限定可见设备,然后启动服务。这一步的作用是排除掉其他卡被误选的可能。
- 验证占用落点加载模型的同时盯显存曲线,确认上涨的是你指定的那张卡,不是另一张。
- 需要更细时再加启动参数如果只想让部分权重上卡、剩下的留在内存,再加卸载层数的参数微调,每调一次复测一次速度。
多卡分摊与 CPU 兜底怎么取舍
显存不够的时候,把一部分层留在内存里确实能让模型跑起来,但这时候出词速度会掉到内存带宽的量级,比纯显卡慢一大截。它能帮你验证效果,不适合日常挂着用。要不要这么做,先看你的目标是「先跑通」还是「长期用」。
| 场景 | 建议做法 | 不适用的情况 |
|---|---|---|
| 单卡显存够装 | 权重全上卡,别再拆 | 显存余量掐得太死,加载别的任务就爆 |
| 单卡装不下、还有第二张卡 | 按层拆分摊到两张卡 | 模型本身权重拆不开,硬拆只增加通信开销 |
| 都不够 | 部分层留内存兜底,先验证效果 | 需要持续稳定吞吐的生产场景 |
| 一张小卡一张大卡 | 优先给大卡,小卡留给系统 | 小卡上有别的常驻服务在占用 |
多卡分摊只有在权重能被切开时才有收益,小模型硬拆反而增加卡间通信,速度可能不升反降。反过来,如果一张卡显存刚好够、另一张闲置容量大得多,优先把活给大的那张,同时别把系统余量掐到零。
这些情况下别折腾指定显卡
有些场景下「指定显卡」这件事本身就是多余的,折腾它只会让你在一个不是瓶颈的地方反复返工。判断标准很简单:如果机器上只有一张独显,或者问题出在版本匹配上,那指定设备不解决任何事。
- 整机只有一张独显:指定是多余的,重点应放在驱动与运行时版本是否匹配;
- 用容器跑:宿主机上设的环境变量可能被镜像里的默认值覆盖,要在容器启动参数里再设一遍才生效;
- 共享机器上别人也在跑:硬指定不解决资源争抢,该做的是错开时段或者另开实例;
- 你连设备编号都没确认过:先做第一节的验证动作,别盲改参数。
先证明它没用上 GPU,再决定要不要指定显卡;顺序反了,大部分时间都花在无效改动上。下一步各家的显卡适配情况和实测吞吐会随驱动、运行时版本变化,别照抄旧结论。想知道当前哪些配置组合下 GPU 加速确实生效、出词速度处在什么水平,到站内的速度实测页面看当时的数字,再决定你的机器值不值得调。→
常见问题
设置了指定显卡,日志里还是显示在用别的卡,怎么办?
先确认环境变量是在启动进程的同一条命令里生效的,而不是写在另一个终端。再看系统枚举顺序是否和你的直觉一致,编号靠前的未必是主卡。最后核对运行时版本是否支持这个参数,版本差异会导致设置被静默忽略。
多卡机器能不能让它自动挑显存最空的那张?
多数版本不做这种自动调度,默认按枚举顺序取,所谓自动往往只是取第一张。想稳定就得手动指定,或者写个脚本先读各卡显存再决定跑哪个进程,别指望框架替你选。
指定显卡之后速度还是很慢,通常是哪里出了问题?
常见三类:一是模型太大被大量卸载到内存,二是驱动与运行时版本不匹配导致没真正走加速,三是显存被别的进程占着,只好退回混合模式。按这三条依次排,基本能定位。