ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

大模型落地先测“承载力”:算清显存、并发与压测

大模型落地先测“承载力”:算清显存、并发与压测 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_size1, dtype_bytes2): # 模型权重 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拉到8192KVCache直接四倍起步总显存占用蹭蹭往上涨。所以做承载力测试第一步就是把你业务里的真实序列分布拉出来看别拿最大值当平均值也别拿平均值当全貌——长尾的少数超长输入往往才是压垮显存的最后一根稻草。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独有的工程债推理服务的冷启动和热升级。大模型加载权重动辄几十GBPod滚动更新一次要几分钟甚至十几分钟这个期间请求全部超时。如果不做蓝绿部署或者金丝雀发布每次更新模型都是一次线上事故。承载力测试里必须包含“发布过程是否影响在线服务”这一项方法很简单在压测过程中手动触发一次滚动发布看错误率有没有飙起来。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阶段多花几天把账算清、把压测做完比上线后熬几个通宵救火划算太多了。
返回列表