一张卡能跑多少并发:按模型与量化算显存、吞吐和卡数

模型与算力

手算显存、KV 缓存与吞吐,估算单卡能跑多少并发,反推需要几张卡,并给出量化档位与卡数取舍的排查顺序。

打算自己租卡或买卡跑模型时,最容易卡住的一步是:到底要几张卡才够。销售说的「一张卡能带几十路并发」通常不带上下文长度和量化档位的条件。这篇给一条能自己动手算的路径:权重显存怎么估、KV 缓存怎么随上下文和批大小涨、运行时还要留多少余量,最后从并发数反推卡数,并说清哪些情况下这套算法不适用。

打算自己租卡或买卡跑模型时,最容易卡住的一步不是选哪个框架,而是:到底要几张卡才够。销售嘴里那句「一张卡能带几十路并发」,通常不带上下文长度、不带量化档位、不带延迟要求,所以没法直接照搬。

这篇给一条能自己动手算的路径:权重显存怎么估、KV 缓存怎么随上下文和批大小涨、运行时还要留多少余量,最后从并发数反推卡数。算出来的数字只当规划用,真实值要靠实测校准;涉及规格与当期的数字,一律到站内页面核对。

为什么必须先估算,不能先买卡

因为卡数不是一个独立问题,它是三个输入变量的输出:模型规模加量化档位、单请求上下文长度、目标并发与延迟。这三个不定下来,卡数就没有唯一答案,谁给你的数字都是在替你假设。

  • 先写清三个输入:模型规模与量化档位、平均与峰值上下文长度、目标并发和可接受延迟
  • 把「能跑起来」和「能跑到目标并发」分开看,前者只看权重能否放下,后者才决定卡数
  • 先做一次粗算,再拿实测去修正,比直接问别人要一个卡数靠谱
  • 如果只是个人低频试用或夜间批处理,延迟要求宽松,可以直接按最小可跑配置起步,不必做完整测算

第一步:权重显存怎么估

最粗的算法是参数量乘每参数字节数。常见精度下每参数占用字节数不同,量化档位越低占用越小,但精度损失得用自己的任务验证,别只听别人说「几乎无损」。这一步只解决「放不放得下」,不解决并发。

每参数字节数
精度与量化档位决定,档位越低占得越少,代价是效果可能变差
嵌入层与输出层
这两块常被单独对待,是否量化会明显影响总占用,别默认它们跟着一起压
多卡切分副本
张量并行时权重会被切开,但通信缓冲和部分副本会带来额外占用

建议自己做一张对照表:左边写模型规格,右边写各量化档位的理论占用,再乘以一个安全系数。模型规格与可用档位到 /models 与 /compute/gpus 核对当时的数字。

这里有个容易踩的坑:MoE 类模型的激活参数和总参数不是一回事,按总参数算会明显高估。反过来,如果你的服务会同时加载多个模型做路由,那就得叠加,不能只算最大的那个。这条算法对超长上下文模型也不完全适用,因为那时瓶颈已经不在权重。

第二步:KV 缓存才是并发的大头

KV 缓存随「层数 × 头数维度 × 序列长度 × 批大小」线性增长。上下文翻倍,占用基本翻倍,这是长上下文服务最容易被低估的一项。很多人算完权重觉得一张卡能扛,一上并发就爆显存,问题都出在这里。

  • 先算 KV 再算并发,顺序别反,因为并发上去后 KV 往往超过权重本身
  • 区分预填充阶段和逐 token 生成阶段的占用差异,两者峰值不在同一个时刻
  • 确认是否开启分页式管理来减少碎片,碎片会让实际可用显存低于账面
  • 短请求且随用随释放的场景,用平均长度估更贴合,但要按峰值留安全余量
变量变大时的影响怎么处理
上下文长度KV 占用近似线性上升按峰值长度规划,别用平均值
并发批大小KV 占用近似线性上升分档测,找拐点
层数与头维度由模型结构定死换模型前先重算
请求长短混合碎片变多,有效显存下降按峰值批留余量

判断标准很简单:把「权重 + KV(平均) + 余量」压在显存七成以内,剩下三成留给峰值和碎片。如果平均长度下就已经到八成,那这套配置做长上下文服务基本没戏,要么加卡,要么限制上下文。

第三步:运行时开销与碎片要留多少

框架自身、CUDA 上下文、通信库、临时激活值都会占显存。实测经验是权重加 KV 之外再留一段固定余量,具体数值因框架和卡型而异,别照抄别人的比例,自己测一次就有数。

  1. 跑单请求基线只发一个请求,记录稳定后的显存占用,这是你的地板
  2. 逐步加并发每次加一路,记录占用,观察曲线何时开始非线性上升
  3. 记录拐点非线性上升的那一点就是实际可用的并发上限,比理论值可信
  4. 复测长上下文把上下文拉到峰值长度再跑一遍,看拐点是否前移

不适用情形:多卡张量并行时通信缓冲与单卡不同,不能直接拿单卡数字乘卡数。另外混合精度、激活重计算这些开关也会改变占用曲线,换配置就要重测。

第四步:从显存反推单卡并发数

可用显存等于总显存减权重减运行时余量。单请求占用等于权重分摊加它那条上下文的 KV。两者相除得到理论上限,再根据调度效率、长短请求混跑、突发排队打个折扣。折扣打多少没有标准答案,取决于你的流量形状。

上下文档位高精度档位中档量化低档量化
短上下文按实测填按实测填按实测填
中等上下文按实测填按实测填按实测填
长上下文按实测填按实测填按实测填
超长上下文基本不适用按实测填按实测填

把这张表填满,你就有了一张能拿去和同事、和供应商对话的底稿。格子里的数字不要抄网上的,自己跑一遍最靠谱。租卡规格与价格可到 /compute/gpu-rental 和 /models/deploy 对照当期的数字。

不适用情形:如果你的业务有明显波峰,用平均并发算出来的卡数会在高峰期直接排队超时。这种情况要么按峰值配,要么上排队和限流,把口子收住。

第五步:吞吐与卡数的换算

吞吐看的是每秒生成多少 token,受批大小、卡间通信、是否连续批处理影响。它和并发数不是同一个量:并发高不等于吞吐高,卡顿的时候往往并发上去了、每秒 token 反而下来了。

  1. 测单卡延迟基线记录首 token 时间和每 token 时间,测速方法见 /tools/speed-test
  2. 换算目标吞吐用目标 QPS 乘以平均输出长度,得到需要的每秒 token 数
  3. 反推卡数用单卡吞吐去除目标吞吐,向上取整,再按延迟要求留冗余
  4. 验证延迟最后一定要在目标并发下复测延迟,别只看吞吐数字
卡数不是越少越好,也不是越多越好,找的是满足延迟前提下的最小卡数。

判断标准:如果加卡之后延迟没有明显改善,说明瓶颈不在算力,可能在调度、网络或存储,这时候继续买卡是浪费。不适用情形:有明显波峰波谷的业务,按峰值配卡会长期闲置,更该考虑弹性租用或排队削峰。

量化档位怎么选:先看能不能接受,再看省不省

顺序别搞反:先用自己能接受的最高精度跑通,再往下压档位,每压一档都要在同一批真实任务上比对效果。上来就压到最低档,后面出的问题很难定位是模型还是量化导致的。

  • 看结构化输出是否还稳定,尤其是需要严格格式的接口
  • 看长上下文下是否掉点,长文任务对量化更敏感
  • 看工具调用这类需要精确判断的场景是否变差
  • 把省下的显存换算成多出的并发或少买的卡,再决定值不值

不适用情形:涉及金额、医疗、法务等对错误容忍度低的任务,不建议为了省卡硬压到低精度档位。省下的钱可能不够赔一次错误输出。

一张可执行的排查清单

  • 定场景:写清模型、量化档位、平均与峰值上下文、目标并发、可接受延迟
  • 算三段:权重显存、KV 缓存峰值、运行时余量与碎片
  • 实测校:单请求基线 → 加并发观察曲线 → 找拐点 → 反推卡数
  • 留后手:准备一档降量化的备用方案、一个排队或限流策略,以及监控显存与排队时长的指标
  • 定期复核:模型、上下文习惯和流量都会变,隔一段时间重跑一次测算

复核的时候顺手看一眼站内的价格与规格变化:相关规格与价格到 /compute 与 /price-watch 看当期数据。同样是满足需求,成本和可选项可能已经不一样了。

下一步拿你的真实模型、真实上下文和真实并发填一遍上面的表格,再到站内对照当期规格和价格,就能把卡数范围收窄到一两档。

常见问题

为什么我按权重算明明放得下,一上并发就爆显存?

因为权重只是一部分,KV 缓存和运行时余量才是并发时增长最快的。上下文越长、并发越高,KV 缓存可能超过权重本身。先按峰值上下文算 KV,再留固定余量给框架和碎片,剩下的才是真正能用的并发空间。

上下文长度翻倍,显存会正好翻倍吗?

KV 缓存部分接近线性增长,但权重和运行时余量不变,所以总占用不会严格翻倍,会略低于翻倍。真正要小心的是:长上下文请求和短请求混跑时按峰值算,容易高估平均也容易低估瞬时峰值,规划要按峰值留余量。

量化到更低档位一定更划算吗?

不一定。低档位省显存、能提并发,但如果你的任务对结构化输出、长文稳定性或工具调用敏感,效果下滑带来的返工成本可能超过省下的卡钱。做法是在同一批真实任务上对比后再决定,而不是只看显存数字。

单卡并发数和总吞吐是一回事吗?

不是。并发数是同时在处理的请求数量,吞吐是单位时间产出的 token 数。有时并发上去了,但因为调度和通信开销,单请求变慢、总吞吐反而没涨。先把延迟基线测出来,再找满足延迟前提下的最小卡数。

这套算法什么时候不适用?

几种情况:MoE 模型按总参数算会明显高估;多卡并行时通信缓冲不能按单卡线性外推;流量有明显波峰波谷时按峰值配卡会长期闲置。这些场景更适合实测加弹性租用,而不是纯手算。

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