显存使用率多少算正常?判断标准与异常占用排查思路

模型与算力

讲清显存使用率什么区间算正常、哪些是模型本身占用、哪些是缓存和碎片,并给一套异常占用的排查顺序。

显卡跑得好好的,nvidia-smi 一看显存占了八成多,到底该不该慌?显存使用率没有统一的「正常值」,取决于模型大小、量化档位、上下文长度和并发数。这篇给你一套判断口径和排查顺序:先分清固定占用和浮动占用,再按进程、缓存、碎片、泄漏四层往下查,最后说清什么情况下高占用其实完全正常。

显卡跑得好好的,nvidia-smi 一看显存占了八成多,到底该不该慌?这事没有统一的答案。显存使用率不存在一个放之四海皆准的「正常值」,它取决于模型大小、量化档位、上下文长度和并发数。同一张卡跑不同配置,正常占用区间能差出一大截,脱离负载谈百分比基本没有意义。

这篇给你一套可落地的判断口径:先把固定占用和浮动占用分开,量出你这台机器的基线,再按进程、缓存、碎片、泄漏四层往下查,最后说清哪些高占用其实完全正常、不用乱动。想把结论落到自己机器上,可以先到站内的部署测算页面按你的模型和量化档位算一遍,心里有个数再对照监控。

先破一个误区:不存在统一的「正常显存使用率」

很多人问「多少算正常」,潜台词是想要一个阈值,比如超过多少就报警。但阈值是跟着负载走的:同一张卡跑小模型短上下文,占用可能很低;换上大模型、长上下文、量化档位又低,占用直接顶到高位,这并不代表出问题。所以别盯百分比,盯信号。

  • 是否还有余量:峰值时显存没被吃满、还能再进来一路请求,这就是健康;
  • 是否随时间单调上涨:空闲时段占用应该回落或持平,一路爬升才可疑;
  • 是否和吞吐对得上:请求数涨、占用跟着涨是正常的,请求停了占用还涨就不正常;
  • 固定与浮动要分开:模型权重和运行时是固定底,KV 缓存和请求是浮动量,混在一起看最容易误判。

先量出你这台机器的基线,再谈正不正常

没有基线就没有异常。同型号的卡、同样的模型,在不同机器上因为驱动、框架版本、预留池配置不同,占用也不一样。所以第一步不是查问题,而是给自己这台机器记几个基准数,之后所有「看着变高」都拿它对照,而不是凭感觉。

  1. 空载记一次只加载模型、不接任何请求,等几秒稳定后记下显存占用。这就是权重加运行时的固定底,也是后面所有判断的起点。
  2. 单请求记一次发一条正常长度的请求跑完,记录峰值。峰值减掉空载底,得到单条请求的浮动量。
  3. 加并发再记一次把并发逐步往上加,观察显存增量和吞吐是否同步。每路并发的增量记下来,并发上限心里就有数了。
  4. 写进运维记录把这三个数连同模型、量化档位、上下文长度一起记下来,放在随手能查到的地方。下次报警直接对照,不用重新测。

这几个数会随框架和配置变,所以定期复测一次比较稳妥。具体模型的显存占用测算和不同量化档位的差异,可以到站内的部署测算页面按当时的配置核对数字。

使用率偏高时,按这四层顺序排查

排查要有顺序,别一上来就怀疑泄漏。按下面的层次往下走,绝大多数「显存异常」在前两层就能解释清楚,真正需要深挖的很少。下面这张表把每层的典型特征和动作列在一起,照着做就行。

排查层典型特征先做什么
进程层空载占用就偏高,或换了模型没变化看有哪些进程在占卡,清掉僵尸进程和没退干净的服务
缓存与显存池空闲后占用不回落,但请求一进来还能跑这是框架设计行为,不是泄漏,确认预留池配置是否过大
碎片层利用率高但可用余量小,长跑之后变差请求长度忽长忽短时明显,重启一次能缓解就是碎片
泄漏层空闲后占用仍单调上涨,重启也很快回到高位压测前后对比占用曲线,能稳定复现才值得深挖

第三层的碎片和第四层的泄漏最容易混。区分方法很简单:重启后占用回落且能稳定维持,多半是碎片,考虑固定请求长度、定期重启;重启后很快又爬到高位、且和请求数严格同步上涨,才往泄漏方向查。缓存与显存池的典型行为是「占着不还但能复用」,框架主动保留是为了下次分配更快,这是预期内的。

这些情况占用高是正常的,别乱动

有些高占用就是设计如此,看到就重启反而打断了正常服务。判断标准是看负载和占用是否匹配:长上下文、高并发、大预留池这几种情况,占用高是取舍的结果,不是故障。

  • 长上下文场景:KV 缓存本来就会吃掉一大块,上下文越长越明显,属于正常开销;
  • 并发拉满的批处理:为了吞吐故意把显存用满,牺牲一点余量换吞吐,是预期内的取舍;
  • 预留池配得大:权重本身不大但预留池大,比例看着高,实际还留着可用余量;
  • 要警惕的反例:没有请求时占用仍持续爬升、重启后立刻回到高位、同一负载下占用比之前明显更高。

换句话说,正常与否要看「和什么比」。和空载比、和昨天的同负载比、和吞吐曲线比,都比单看一个百分比靠谱。如果确实需要压低占用,量化、分片、offload 是几条主要路径,具体怎么选、各自的代价是什么,站内有一份显存优化的清单可以对照着看。

把监控做成习惯:看什么、多久看一次

排查是一次性的,监控是长期的。与其等出问题再查,不如把几个关键曲线盯住。短周期看瞬时值和温度,防止突发打满;长周期看占用曲线的形状,有没有台阶式上涨、有没有和请求数脱钩,这些形状比单点数值更能说明问题。

出现异常时,先做一次干净重启再复现。能稳定复现的才值得深挖,不能复现的多半是上一次运行残留或缓存没释放。把「请求数—显存占用」两条线画在一张图上,是最省事的判断办法:两条线同步涨是正常,请求停了占用还涨就有问题。平时想快速确认机器状态,可以用站内的测速工具跑一轮,结合监控一起看。

下一步先量出自己这台机器的基线,再对照站内的部署测算页面核对当前配置的预期占用,心里有数之后报警才有意义。

常见问题

显存占到 90% 以上是不是就要出事?

不一定。关键看有没有请求在排队、有没有 OOM 报错、占用是不是稳定在一个高位。稳定高位说明你把余量用上了,是好事;但如果同时伴随请求变慢、偶发 OOM,说明余量不够,要么降并发要么降上下文。

怎么快速区分是显存泄漏还是框架缓存?

看空闲态。停掉所有请求等几分钟,占用回落说明是缓存,属于正常;占用一直不降、并且随累计请求数单调上涨,才更像泄漏。另一个办法是重启服务后跑同样的压测,两次曲线形状差很多就值得查。

同一张卡,为什么换个模型占用差这么多?

权重体积、量化档位、上下文长度、注意力实现方式都会影响。想横向比,先对齐这四个变量,再拿站内部署测算页面按同一口径算一遍,不然比出来的数没有参考价值。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。