4. 吞吐与延迟的权衡曲线
在GPU批处理系统中,吞吐量(Throughput)与延迟(Latency)并非彼此独立,而是通过批大小(Batch Size)、并发请求数、显存占用和计算资源利用率等参数紧密耦合。理解这种耦合关系,最直观的方式是绘制一条“吞吐-延迟曲线”,并从中识别三个关键区域:延迟敏感区、拐点区和饱和区。本节将围绕这条曲线展开,结合排队论与利特尔法则,给出可操作的建模与判读方法。
一、吞吐-延迟曲线的形态与三个区域
假设我们固定GPU型号、模型结构和输入序列长度,仅改变批大小 B,观察系统吞吐量 TPS(每秒处理样本数)与单请求端到端延迟 L(毫秒)的变化。典型曲线呈现如下特征:
- 延迟敏感区(小批量区):
B很小(如 1~4),GPU计算单元利用率低,吞吐随批大小近似线性增长,而延迟增长缓慢。此时系统对延迟敏感,增加批大小能显著提升吞吐且延迟代价小。 - 拐点区(膝点附近):吞吐增速开始放缓,延迟开始加速上升。拐点是吞吐收益与延迟代价的“性价比”最高点,通常对应GPU利用率达到70%~85%的批大小。
- 饱和区(大批量区):继续增大批大小,吞吐几乎不再增长(受限于显存带宽、SM占用或内存墙),而延迟因排队和资源争用急剧上升。此时系统进入饱和,增加批量只增加延迟,不增加吞吐。
下图以示例数据绘制了这条曲线,并标注了三个区域与拐点位置。图中横轴为批大小,左纵轴为吞吐量,右纵轴为延迟,两条曲线共同构成权衡关系。
需要说明的是,上图数据为教学示例,用于说明曲线形态与区域划分逻辑,并非某次真实压测的实测结果。实际系统中,拐点位置会随模型、序列长度、显存带宽和并发策略变化。
二、用利特尔法则建立初步模型
利特尔法则(Little's Law)是排队论中最基础也最实用的关系式:
L = λ × W
其中 L 为系统中平均请求数(并发度),λ 为到达率(请求/秒),W 为平均逗留时间(延迟)。在GPU批处理场景中,我们可以将其改写为:
并发批数 N = 吞吐量 TPS × 单批延迟 L_batch
这里 N 表示同时驻留在GPU上的批数量,L_batch 为单批从入队到完成的时间。若系统采用动态批处理,N 受显存和调度器限制。当 N 达到上限后,继续提高到达率只会让请求在队列中等待,延迟上升而吞吐不变——这正是饱和区的排队论解释。
进一步,我们可以用M/M/1或M/D/1排队模型近似GPU批处理服务。假设请求到达服从泊松分布,服务时间近似确定(批处理时间稳定),则平均等待时间 W_q 可近似为:
W_q ≈ ρ / (2 × μ × (1 - ρ)) (M/D/1近似)
其中 ρ = λ / μ 为服务强度,μ 为服务率(批/秒)。当 ρ → 1 时,等待时间急剧上升,对应曲线进入饱和区。这解释了为什么在拐点之后,延迟会非线性增长。
三、实操:如何绘制并识别拐点
下面给出一个可复现的压测与绘图流程,用于在真实GPU服务上定位拐点。假设我们使用一个推理服务,固定输入长度512,输出长度128,逐步增加并发请求数,记录吞吐与P99延迟。
- 确定测试点:选择批大小或并发数序列,例如
[1, 2, 4, 8, 16, 32, 64, 128, 256]。每个点持续压测60秒,排除前10秒预热数据。 - 采集指标:记录每秒完成请求数(TPS)和P99端到端延迟(ms)。同时记录GPU利用率(
nvidia-smi dmon或DCGM)和显存占用。 - 计算拐点:对吞吐曲线求一阶差分,找到差分值下降超过50%的位置,或使用“吞吐/延迟”比值最大化点作为拐点候选。
- 验证饱和区:当连续两个测试点的吞吐增幅小于5%,而延迟增幅大于30%,判定进入饱和区。
以下是一个示例数据表(教学假设,非实测),展示如何从数据中识别拐点:
| 批大小 B | 吞吐 TPS | P99延迟 (ms) | 吞吐/延迟比 | 区域判断 |
|---|---|---|---|---|
| 1 | 42 | 24 | 1.75 | 延迟敏感区 |
| 4 | 158 | 26 | 6.08 | 延迟敏感区 |
| 8 | 290 | 29 | 10.00 | 延迟敏感区 |
| 16 | 480 | 35 | 13.71 | 拐点前 |
| 32 | 620 | 52 | 11.92 | 拐点附近 |
| 64 | 680 | 88 | 7.73 | 拐点后 |
| 128 | 700 | 165 | 4.24 | 饱和区 |
| 256 | 705 | 310 | 2.27 | 饱和区 |
从表中可见,吞吐/延迟比在 B=16 时达到峰值13.71,随后下降。因此拐点可判定在 B=16~32 之间。若业务对延迟敏感(如P99要求小于50ms),则 B=32 已接近上限;若追求最大吞吐且可容忍高延迟,则 B=64~128 更合适,但需注意饱和区延迟急剧恶化。
四、从曲线到调度策略
识别出三个区域后,可以制定差异化的调度策略:
- 延迟敏感区:优先保证低延迟,可采用小批量、高优先级队列,甚至为关键请求预留计算资源。
- 拐点区:作为默认工作点,动态批处理在此区间调整批大小,兼顾吞吐与延迟。
- 饱和区:应主动限流或拒绝新请求,避免队列无限增长导致雪崩。可设置最大并发数
N_max,当排队长度超过阈值时触发背压。
结合利特尔法则,我们可以估算系统最大安全并发数:若目标P99延迟为 L_target,当前吞吐为 TPS,则最大并发 N_max ≈ TPS × L_target。例如 TPS=620,L_target=50ms,则 N_max ≈ 31。当实际并发超过此值时,延迟将突破目标,需要限流或扩容。
N_max 低于理论值,需结合显存占用曲线综合判断。