1. 为什么“规模”骗了所有人
1.1 “规模”成了安全牌,但承载力才是硬约束
这段时间我前前后后陪跑了十几家企业客户的AI落地项目,发现一个特别扎心的现象:只要一聊技术方案,开口闭口全是“千亿参数”“万卡集群”“训练了多少T token”,好像模型不做到百亿级以上就不好意思跟人打招呼。但真到了业务上线那一步,跑起来的是什么?是一个又一个趴窝的推理服务、排队排到天荒地老的GPU任务、还有业务方天天催着要结果却只能干瞪眼的产品经理。
我越来越觉得,在2026年这个时间点上,“AI落地”这件事已经不是比谁的模型更大、谁的算力更多了,而是比谁的底盘更能扛。你上一个万亿参数模型,如果没有足够的显存规划、没有合理的并发控制、没有数据管道的吞吐支撑,它在你那的生产环境里可能连一个最普通的智能客服会话都撑不住。反过来,一个小几十亿参数的精调模型,只要把承载能力算清楚,反而能稳稳接住每天几十万次的真实调用。
这里说的“承载力”(Carrying Capacity,也有人叫业务容量),本质上就是把 AI 从“Demo 能跑”推到“生产能用”之间那道看不见的墙。它由五个维度共同决定:算力资源、数据管道、业务场景的并发模型、团队工程能力、还有预算余量。这五个维度缺一个,其他再强也白搭。
所以这篇文章我想跟你聊的,不是“怎么把模型做得更大”,而是“怎么在动手之前就把承载力测明白”。我会把我在真实项目里踩过的坑、用过的工具、算过的账都摊开来讲,包括怎么估算并发、怎么规划显存、怎么做压测、怎么识别系统瓶颈,以及那些文档里从来不会写、但你迟早会遇见的诡异故障。
1.2 从翻车现场看“承载力”到底是什么
为了让你先有个直觉,我讲一个真实发生的项目。某制造企业要部署一个基于大模型的质检助手,帮产线工人快速查工艺规范。初期方案拍板很快,采购部门一口气批了4台8卡H系列服务器,理由是大模型显存占用大,宁可多配不能少配。模型选的也是一个100B左右的开源底座,微调之后效果确实不错,内部演示效果拉满。
结果一上生产就露馅了:并发只有10个用户同时问问题,响应时间直接飙到12秒以上,而且稳定性极差,每跑两三个小时就有一次OOM,把服务进程直接打崩。排查到最后才发现,问题根本不在GPU数量上,而是KVCache算错了:100B模型在默认最大序列长度下,单并发就要吃将近60GB显存,4张卡并行推理还要考虑张量并行的冗余,实际的并发承载量只有预期的一半不到。再加上海量小文件质检报告把数据预处理管道堵得死死的,GPU有一大半时间在空转等数据,整体吞吐自然惨不忍睹。
这就是典型的有规模、没承载力。硬件规模不小,但没人在上线之前认真回答过“这套系统到底能同时服务多少人、每秒钟处理多少个请求、高峰期的抖动怎么吸收”这些基础问题。等出事了再回头补课,成本翻倍不说,业务信任也被消耗掉了。
所以这篇文章里提到的“测承载力”,核心就三件事:把资源账算明白,把瓶颈找出来,把方案设计成能扛波动的结构。下面我一个个维度拆开讲。
2. 承载力=五个维度的乘积,不是加法
2.1 算力承载力:多少卡是多少卡的活
算力承载力听着最简单,其实就是“显卡能同时跑多少路推理”,但真算起来坑极多。很多人只盯着显存总量,觉得“24GB一张卡,8张卡就是192GB,装个70B模型绰绰有余”。这个算法错得离谱。
我们先看单路推理的显存占用公式,它大约等于“模型权重 + 激活值 + KVCache + 框架运行时开销”。以7B FP16模型为例,光模型权重就是14GB,加上输入输出之间的激活值,再算上KVCache随序列长度线性增长,单路并发占用经常能到20GB以上。你以为16GB显存能塞进去,实际上序列一拉长就OOM。
这还只是单路。生产系统要考虑一个重要的换算:并发数乘单路显存。如果服务要支撑50路并发,每路峰值占用20GB,那总共就是1000GB,这时候你就知道,不是8张卡的问题,而是可能需要NG或者更复杂的多机方案。而且这里有个火上浇油的细节:张量并行下的显存占用并不是匀称的,不同层和不同头的分布差异会让某张卡先爆,其他卡还闲着。
我自己一般会先写个简单的Python脚本把这些参数都算一遍,再拿去跟实际推理框架的显存观察日志对照,两者偏差在10%以内才算把账算明白了。
def estimate_single_inference_gb(model_size_b, seq_len, batch_size=1, dtype_bytes=2): # 模型权重 weights_gb = model_size_b * 1000 * dtype_bytes / 1024 # KVCache估算,按每层两个KV矩阵、head_dim、层数折算 hidden_dim = 4096 num_layers = 32 kv_bytes_per_token = 2 * num_layers * hidden_dim * dtype_bytes kv_gb = kv_bytes_per_token * seq_len * batch_size / (1024 ** 3) # 激活值与运行时开销,粗略按权重的20% runtime_gb = weights_gb * 0.2 total_gb = weights_gb + kv_gb + runtime_gb return round(total_gb, 2) print(estimate_single_inference_gb(7, 2048)) print(estimate_single_inference_gb(7, 8192))你可能已经注意到了,序列长度对占用的影响是肉眼可见的。同样7B模型,从2048拉到8192,KVCache直接四倍起步,总显存占用蹭蹭往上涨。所以做承载力测试,第一步就是把你业务里的真实序列分布拉出来看,别拿最大值当平均值,也别拿平均值当全貌——长尾的少数超长输入,往往才是压垮显存的最后一根稻草。
2.2 数据承载力:样本质量决定天花板
算力承载力决定了系统“能不能跑起来”,数据承载力则决定了“跑起来之后到底有没有用”。这玩意通常比算力更难量化,也更容易被忽视。
我见过太多项目,模型选型阶段花了大半个月,一到数据准备就随便丢几个清洗脚本给实习生,然后美其名曰“大模型对数据质量不敏感”。真实情况恰恰相反,模型越大,对数据分布中的噪声和重复越敏感。你微调数据里如果有大量重复样本,模型会直接过拟合到那几条数据上,公共能力反而退化;如果负样本缺失,推理时它就会倾向把所有问题都回答成“可以”,因为训练数据里从来没人告诉它“不可以”长什么样。
数据承载力具体要测什么?我建议至少包括三点:数据覆盖度、标注一致性和新鲜度损耗率。覆盖度是指你的样本是否覆盖了线上可能遇到的所有意图分支,比如客服场景里投诉、退换货、物流查询、闲聊都要有;标注一致性是指同一个问题的标准答案在不同批次、不同标注人员手里是否一致,这个可以抽样本用模型自评或者人工复核;新鲜度损耗率是指业务规则变了之后,旧数据还能不能继续用,比如价格表换了、政策变了,模型还按旧数据回答,那就是事故。
有一个我屡试不爽的土办法:上线前拿200条真实线上请求去跑影子模式,把模型输出跟现有的人工答复或规则引擎输出并排摆在一起,人工打标看哪些回答是“可用的”。如果可用率低于85%,数据承载力就是不合格的,这时候与其加算力,不如回去补数据。
2.3 业务承载力:场景的真实需求曲线
业务承载力是整个五个维度里最容易被“拍脑袋”决定的。很多时候业务方只给一句话:“我们日活50万,大概有10%的人会用AI功能。”然后架构师就按50万×10%=5万DAU去算QPS,再乘个高峰系数,直接定了资源池。问题是,10%的人未必均匀分布在10个小时里,更不会每次使用只产生一个请求。
我推荐一个更靠谱的方法:把业务请求拆成“事件驱动型”和“会话型”两类来建模。事件驱动型比如“用户上传一张图片触发检测”,一次请求就是一个独立事件;会话型比如“智能客服对话”,一次会话里可能会连续请求多次,中间还带着用户思考时间和各种输入输出。两类模型的并发峰值完全不一样,会话型的天花板更高也更难预测。
拿我做过的电商智能助手来举例。业务方说峰值在线人数5万,我让他们拉了后台埋点数据,发现真正的瓶颈在晚上8点到10点的促销时段,用户集中咨询发货、优惠券、退换货,平均每人在10分钟里发14条消息,按一条消息一次AI推理算,峰值QPS就不是五百,而是要奔着几千去。如果按平均QPS去规划,系统在生鲜高峰期必挂。
所以业务承载力这件事,不能只听业务方的“日活”“月活”,必须拿到周期更细的请求分布曲线,看真实峰值、持续时长、波动系数。我把这个叫做“需求曲线测绘”,它是后续所有容量规划的地基。
2.4 工程承载力:从POC到生产的鸿沟
很多团队把“模型能跑出好答案”等同于“系统能上线”,中间足足缺了一整条工程链。这条链包括模型服务化封装、鉴权与限流、灰度发布、监控告警、日志链路追踪、回滚机制、以及最容易被忽略的提示词和版本管理。这些东西单拎出来都不难,但堆在一起就变成了“工程承载力”的试金石。
我有一个判断标准:一个团队的工程承载力是否合格,就看从POC到灰度发布需要多少天。成熟的团队可能一周内就能把一套模型封装成标准服务并接上监控;工程能力弱的团队可能把模型文件丢给后端就撒手不管,结果别人连怎么部署都不会,更别提处理并发超时、连接池耗尽这些基础问题。
这里还要特别提一下AI独有的工程债:推理服务的冷启动和热升级。大模型加载权重动辄几十GB,Pod滚动更新一次要几分钟甚至十几分钟,这个期间请求全部超时。如果不做蓝绿部署或者金丝雀发布,每次更新模型都是一次线上事故。承载力测试里必须包含“发布过程是否影响在线服务”这一项,方法很简单:在压测过程中手动触发一次滚动发布,看错误率有没有飙起来。
2.5 组织与预算承载力:最大的隐性变量
最后这个维度经常被我放在最后讲,但它在真实决策里往往是最先触顶的。组织承载力是指你的团队里有没有人能持续维护这套AI系统。模型不是上线就完事,数据要持续更新、效果要持续评测、Bad Case要持续复盘,这些工作都得有具体的人来扛。很多公司热火朝天把模型部署了,结果三个月后核心工程师被调到别的项目,系统直接进入“无人驾驶”状态,效果逐渐劣化还没人知道。
预算承载力就更微妙了。推理成本是个持续支出,不像训练成本是一次性投入。我帮客户算账时发现一个规律:很多团队对训练成本斤斤计较,对推理的持续成本完全没概念。一个7B模型在中等流量下,一天的推理电费和云资源费用轻易能顶上一周的开发人力成本;如果是100B级别的模型,单个月的推理成本甚至够再招一支小团队。所以承载力必须把“单次请求成本”和“月度总量预算”一起算进去,否则系统活着活着就被成本部门一刀切了。
我习惯把五个维度画在一张表上,每个维度按“绿黄红”三档评估,黄色以上就继续推进,一旦出现红色项,先解决红色项再谈规模。这条规则帮我避开了好几个看似前景无限、实则必翻车的项目。
| 维度 | 绿色(健康) | 黄色(有风险) | 红色(不可用) |
|---|---|---|---|
| 算力 | 单路显存余量≥30% | 余量10%-30% | 接近OOM或无余量 |
| 数据 | 覆盖度≥90%,异常标注<2% | 覆盖度70%-90% | 覆盖度<70% |
| 业务 | 有峰值曲线且余量≥50% | 只有平均QPS估算 | 完全无流量模型 |
| 工程 | 有灰度、监控、回滚 | 有监控但无灰度 | 什么都没准备 |
| 预算 | 成本模型清晰且有余量 | 成本能算但偏紧 | 无人算过持续成本 |
3. 三步测准承载力:从评估到落地的实战方法
3.1 第一步:做一份“反向容量规划”
说了这么多维度,怎么落地?我推荐从“反向容量规划”开始。所谓反向,就是先不从资源出发问“我有多少卡”,而是从业务出发问“我要扛多少请求,最少需要多少资源”。这一条路线能确保你不会过度采购,也不会在关键节点上缺资源。
具体做法分四步。第一步,拉出线上历史请求日志,按分钟统计请求量,找到真实峰值窗口。没有历史数据的全新业务,就按同类业务的行业基准值估算,但必须在POC里加一个比预估峰值高一倍的压测档位来验证。第二步,用前面那个显存估算脚本,结合你的模型参数、预期序列长度、并发路数,算出最低显存需求,再按“目标并发 = 显存总量 / 单路峰值占用”的公式反推支撑能力。第三步,把结果整理成一张环境配置参数表,包括模型服务实例数、每实例并发上限、推理超时时间、队列最大长度、熔断阈值。第四步,拿着这张表跟业务方对一遍,确认“旺季峰值能不能接受排队,最多可以排多久”,把这个写死作为SLA。
我在实际项目里发现,光是做一张这样的表,就能避免80%的后期事故。因为它逼着所有人把“大概”“可能”“差不多”落实成数字,而数字一旦落定,后面所有压测都有了对标的基准。
3.2 第二步:用带压POC验证真实瓶颈
容量规划只是纸上推演,真正验证承载力必须靠压测。这里我特别强调“带压POC”而不是“功能POC”——很多团队做的POC只是验证“模型答得对不对”,完全没有压力。正确的打开方式是让压测脚本在模型服务还在调试的早期就接入,边调边测,把性能和效果两个目标并行优化。
工具选型上,纯HTTP接口用Locust或者wrk都可以,如果你用的是OpenAI兼容协议,也可以直接用开源的负载生成器把对话补全的调用模式模拟出来。关键不是工具本身,而是压测脚本要贴近真实的用户行为:要把“思考后连续发消息”这种会话模式建模,而不是简单每秒发固定数量的请求;要加入随机的请求体大小分布,而不是清一色的短文本;要把超时和重试机制也模拟进去。这样测出来的数据才有参考价值。
另外,带压POC一定要设计一个“破局点测试”。就是我故意把并发慢慢往上拉,直到系统开始出现错误或延迟急剧恶化,然后记录这个拐点值。这个值就是系统的真实极限承载力。后续生产环境建议只用到它的60%-70%,留出缓冲来吸收抖动和突发流量。我见过有人在压测到200QPS平稳就说没问题,结果上线后实际打到了230QPS,整个集群熔断得像多米诺骨牌一样。破局点不测,等于没测。
3.3 第三步:制定分阶段的资源预留和回退方案
承载力测完不等于一劳永逸,业务在增长,模型在迭代,承载力是动态的。所以第三步,我建议做成“阶段式预留+动态回退”的结构,而不是一次性把生产资源池打满。
阶段预留指的是按“当前需求×1.5倍”作为近期目标,按“半年后预期×1.5倍”作为中期目标,提前规划扩容路径。这里的扩容路径一定要具体到“加几张卡、扩几个副本、改哪个配置项”,而不是笼统地写“支持横向扩展”。因为不是所有推理服务都能无缝横向扩展,有些依赖全局状态或者共享存储的服务,扩容是需要业务停一下或者做数据迁移的,这些都要提前验证。
动态回退则是给系统留一条保底路线:一旦新模型或者新流量导致承载力告急,有没有一套备用的降级方案?我见过最优雅的做法是“双模型策略”:主力用效果更好的大模型,入口加一个根据队列长度和响应时间自动切换的规则,压力一大就自动把流量切到一个小模型的快速通道,保住基本体验。这个方案的优雅之处在于,它不赌任何单一模型一定能扛住所有情况,而是用架构去吸收不确定性。
4. 承载力测试中的典型故障与排查经验
4.1 故障实录:GPU利用率高但吞吐上不去
我在多个项目里遇到过同一个怪现象:监控面板上GPU利用率跑到了95%以上,看着好像很饱和,但整体吞吐就是上不去,单路请求延迟也高得离谱。一开始大家以为算力不够,准备加卡,后来仔细一看Profiling数据才发现,真正的问题出在请求排队上。
推理框架默认的调度方式会尽量把到达的请求batch到一起,这本来是为了提高GPU利用率,但如果batch窗口设得太大,先到的请求就要一直等着跟后面的请求凑批,单个请求的排队延迟就会暴涨。就像食堂打饭,厨师非要等凑齐10个人才一起炒菜,锅是没闲着,但第一个来的人等到菜都凉了。这种情况下,正确的调整方向是压缩最大batch等待时间或者限制batch size,让GPU在利用率和延迟之间找到平衡点。
还有一次是CPU和GPU之间的数据传输成了瓶颈。我们有条预处理链路会把图片转成base64再送进网络,结果发现一张图光base64编码就要几百毫秒,直接把GPU的输入饿住了。这个问题最后靠把预处理移到GPU侧或者改用二进制协议解决的。这类问题的共同点就是:GPU看着很忙,但它忙在空转等数据,真实的计算效率低得可怜。排查一定要看端到端的链路耗时拆解,而不是只看单个资源指标。
4.2 故障实录:显存OOM不是显存不够
显存OOM是AI服务最常见的生产事故,大部分人的第一反应都是“显存不够,加卡”。但实际上OOM的触发原因五花八门,很多时候跟显存大小没有直接关系。
有次我们的服务在运行8小时后准时OOM,重启后又是一个周期,每8小时一次,规律得像闹钟。排查到最后发现是某个版本的推理框架在长连接场景下存在显存碎片泄漏,每个请求会残留一小块无法回收的显存,积少成多最后爆掉。解决方案不是加显存,而是固定周期执行一次优雅重启,或者升级框架版本。
还有一种OOM是因为动态shape引起的。比如输入序列长度忽长忽短,框架为了性能通常会预分配一个最大缓冲,如果你配置的最大序列长度过大,即使实际没人用那么长的输入,显存也被提前占满了。这时候反而是把最大序列长度调小一点,让缓冲更加贴近实际分布,就能腾出大量显存来增加并发路数。这也再次说明了序列长度分布统计的重要性,它是显存规划的核心输入。
4.3 故障实录:数据管道拖垮推理时延
第三个我特别想讲的故障,是数据管道成为隐性瓶颈的情况。现在很多AI服务不是单纯的“进去一句话出来一句话”,而是要先查数据库、调外部API、拼上下文、做检索增强,这些前置操作的耗时经常比模型推理本身还长。
我之前做一个文档问答系统,单次请求模型推理只要400毫秒,但用户感受到的端到端延迟有3秒多。拆开链路一看,时间主要花在向量检索的集合Scan和文档重新排序上。刚开始我用的是HNSW索引,理论上应该很快,但没注意到索引没有及时增量更新,导致索引覆盖不了新入库的文档,系统退回了暴力扫描的兜底逻辑,复杂度直接翻了几十倍。
排查这类问题我有个标准动作:在服务的入口和出口各打一条带时间戳的日志,再把中间每个环节单独计时,画一条火焰图。只要把时间量化了,哪个环节在偷走延迟,一清二楚。数据管道的吞吐也要单独压测,不能只看GPU推理的吞吐。很多时候承载力测试的结论是“GPU吞吐足够”,但真实瓶颈在数据管道,上线一冲量就全堵在管道入口了。
4.4 承载力测试的硬性指标速查表
最后把我平时用来判定的几个硬性指标整理一下,方便你直接拿来当checklist用。
| 指标 | 健康阈值 | 危险信号 |
|---|---|---|
| 单路P95延迟 | 低于业务SLA的1/3 | 接近或超过SLA上限 |
| 峰值并发下错误率 | 低于0.1% | 超过1%并持续 |
| GPU利用率 | 60%-85% | 长期>95%或长期<20% |
| 单请求推理成本 | 占月度预算的5%以内 | 增速超过业务增速 |
| 冷启动/滚动发布影响 | 发布期间错误率无变化 | 发布即超时,错误率飙升 |
| 数据新鲜度 | 增量数据实时可见 | 索引落后超过24小时 |
这些阈值不是拍脑袋定的,它们都是从“用户可感知体验”倒推出来的。你要记住一个朴素的道理:承载力测试的最终评判标准不是系统还能不能跑,而是用户在高峰期的体验是不是还能接受。只要能守住这个底线性,系统规模是不是最大、参数是不是最顶,其实都不重要。
我自己做项目的习惯是,在方案PPT里永远放一页“我们测过什么、极限在哪里、超出之后怎么办”。这页内容在汇报时往往不是主角,但真正到了出故障那天的复盘会上,它就是你最硬的护身符。承载力这件事,测了不一定满分,但不测一定裸奔。趁项目还在POC阶段多花几天把账算清、把压测做完,比上线后熬几个通宵救火划算太多了。