大模型Batch与并发数是一回事吗:请求队列、连续批处理和显存边界
用三个假设请求的调度时间线区分并发数、Batch与队列,理解连续批处理、token预算以及吞吐和延迟的取舍。
图解产业阿军编辑 · AI 辅助整理与编辑核查
不是。并发数通常描述某个统计边界内同时尚未完成的请求数;Batch描述一次计算或调度组织起来的工作。客户端同时发出100条请求,不代表GPU正在把100条请求放进同一批执行,其中一些可能还在排队。
比较服务参数时,必须先问清“在哪里数”“数的是什么”“按哪段时间统计”。离开这三个条件,一个更大的数字未必代表更高性能。
从请求入口走到计算批次
可以把简化流程写成:客户端提交→服务接收与排队→调度器选取工作→执行→返回结果。真实服务还可能有网关、分词和多个队列,这张图只用于分清层次。
| 名称 | 本文采用的含义 | 容易混淆的地方 |
|---|---|---|
| 客户端并发 | 已发出、尚未完成的请求数 | 不是正在GPU上执行的数量 |
| 等待队列 | 已进入该队列、等待获得执行机会的请求 | 不一定覆盖网关等全部等待位置 |
| Batch | 本次组织起来执行的序列或token工作 | 必须说明按序列数还是token数计量 |
| 调度 | 决定本轮处理谁、处理多少 | 不等于提高客户端线程数 |
“一次提交1000条”还可能只是离线任务列表的长度。它既不是同一时刻的并发,也不规定引擎必须一次处理完。
三个长短不同的请求怎样排队
以下为原创假设模型,不对应某台GPU或某次压测。假设A、B同时到达,分别需要2轮和4轮生成;C在第1轮结束后到达,需要1轮。每轮最多容纳2条序列,每条每轮生成1个token。为突出调度差异,暂不计预填充、传输和调度开销,各轮也不换算成毫秒。
| 轮次 | 固定成员、整批结束后接新请求 | 可在轮次边界补入请求的连续批处理 |
|---|---|---|
| 第1轮 | A、B;结束后C到达并等待 | A、B;结束后C到达并等待 |
| 第2轮 | A、B;A完成,C仍等待 | A、B;A完成,C等待本轮结束 |
| 第3轮 | B;空位暂不补入C | B、C;C完成 |
| 第4轮 | B完成 | B完成 |
| 第5轮 | C执行并完成 | 已无剩余请求 |
在C刚到达、A尚未完成时,未完成请求是3条,但执行批里只有2条。这直接说明并发数与Batch可以不同。连续批处理让已完成请求退出、等待请求有机会进入后续迭代,不要求每个请求从头到尾绑定同一组伙伴。
这个例子只证明“补位规则改变了C等待的轮数”。不能据此宣称实际服务加速20%,因为真实批次的耗时会随工作量变化,C还需要处理输入。输入处理与逐步生成的区别,可结合Prefill与Decode指南阅读。
传统动态批处理还可能短暂等待,以便把更多到达请求组成一批;这与逐轮调整生成请求成员不是同一个概念。Triton的动态批处理说明提供了队列等待配置,但不能把它的参数直接套到另一套LLM引擎。
序列上限、token预算和显存分别管什么
以vLLM为例,max_num_seqs约束单次迭代处理的序列数量,max_num_batched_tokens约束单次迭代处理的token数量。后者不是“所有会话允许保存的历史token总数”。开启分块预填充时,长输入可分块与解码工作共同调度,预算分配会影响首token等待和后续输出间隔。具体行为应核对安装版本的vLLM优化文档。
作一个独立的算术假设:某轮token预算为12,3条解码序列各占1个token,剩余预算便是9。即使序列数量还没到上限,一段长输入也不能因此无限塞进这一轮。这个简化账本不包括推测解码等额外机制。
显存又是另一层限制。vLLM文档说明,KV Cache空间不足时可能发生抢占与重新计算,影响端到端延迟。提高调度上限不会创造缓存空间。理解这一点,可先区分KV Cache与模型权重:模型能装下,不等于更多长会话也能一起装下。
吞吐上去了,为什么用户仍觉得慢
吞吐衡量单位时间完成多少工作;延迟衡量一项工作经历多久。生成服务还应拆开看:首token时间、相邻输出token间隔,以及整条回答完成时间。输入与输出token吞吐也要注明口径,不能混成一个“速度”。可用带宽、延迟与吞吐指南补齐这些指标的关系。
增加并发可能提供更多可合批工作,也可能主要增加排队。只看平均吞吐,容易漏掉少数请求等待很久的问题。建议用同一组请求长度分布,逐档调整一个参数,并保留以下核对表:
- 负载一致吗: 模型、输入长度、输出限制、到达方式及缓存条件是否相同?
- 等待在哪里: 分别记录客户端、网关和引擎队列中能观察到的等待。
- 体验达标吗: 同时看首token、输出间隔和完整响应的中位数及高分位值。
- 资源受限吗: 查看缓存使用、抢占或重算记录,不能只看GPU利用率。
- 结果完整吗: 报告吞吐时同时列出失败、超时和完成数量。
先确定交互服务能接受的等待,再寻找该约束内的吞吐;离线任务则可以采用不同目标。记录框架版本和具体工作负载,才能判断某个配置适合哪里,而不是寻找脱离条件的“最佳Batch”。
文中算例用于解释原理,具体参数请按引用资料与产品条件核对。发现问题,可将文章链接与依据发送至 support@packscena.com。
继续阅读产业指南
- 大模型量化 INT4 和 INT8 有什么区别?从显存、速度到精度看
围绕“大模型INT4和INT8量化区别”解释机制、关键参数、适用边界和核对步骤;用假设案例帮助读者避免把单一指标当成结论。
- 大模型Temperature与Seed怎么理解:随机性与复现边界
解析大语言模型中Temperature与Seed的核心机制、适用场景与复现边界,理清降低温度与固定种子的真实作用与局限。
- 端侧 AI 和云端 AI 怎么选?从离线、隐私到持续运行比较
端侧AI不自动等于离线或零上传。沿数据路径比较本地、云端和混合架构,核对日志、回退、设备温度、能耗与持续运行表现。
- 模型上下文上限与输出上限有什么区别:长输入不等于长回答
解析大语言模型上下文上限与单次输出上限的技术差异,梳理输入与输出 Token 约束机制、规格阅读步骤及工程权衡,帮助读者准确读懂技术文档。
- 向量数据库和关键词搜索怎么选?从精确术语到语义召回看检索
围绕“向量搜索和关键词搜索区别”解释机制、关键参数、适用边界和核对步骤;用假设案例帮助读者避免把单一指标当成结论。
- 长上下文和 RAG 怎么选?先分清一次性阅读与持续知识更新
围绕“长上下文和RAG区别”解释机制、关键参数、适用边界和核对步骤;用假设案例帮助读者避免把单一指标当成结论。
- AI 训练与推理有什么区别?从参数更新到算力需求
训练更新模型参数,推理使用模型完成任务。理解前向、反向、预填充与解码,分别核对显存、吞吐和首Token延迟。
- AI Agent 和工作流有什么区别?按任务确定性选择实现方式
工作流沿预定义路径执行,Agent让模型动态决定部分步骤。用订单查询场景比较可控性、工具权限、终止条件、成功率与成本。
- BF16和FP16都是16位,为什么表现不同:数值范围、精度与混合精度分开看
从指数位和小数位解释BF16与FP16的区别,用假设计算区分溢出与舍入,再按硬件、算子和训练流程核对混合精度配置。
- Embedding 和 Rerank 有什么区别?理解 RAG 检索的召回与排序
围绕“Embedding和Rerank区别”解释机制、关键参数、适用边界和核对步骤;用假设案例帮助读者避免把单一指标当成结论。
- MoE总参数和激活参数有什么区别?为什么显存不能只按激活量算
深入解析MoE混合专家模型中总参数与激活参数的区别,阐明动态路由机制与显存占用结构,说明为何部署显存不能仅按激活量计算。
- RAG 和微调怎么选?先分清知识更新与模型行为问题
RAG检索资料,微调改变模型参数。用知识更新和输出格式两个场景区分适用问题,并检查权限、引用、检索遗漏及组合方案。