4. 吞吐与延迟的权衡曲线

在GPU批处理系统中,吞吐量(Throughput)与延迟(Latency)并非彼此独立,而是通过批大小(Batch Size)、并发请求数、显存占用和计算资源利用率等参数紧密耦合。理解这种耦合关系,最直观的方式是绘制一条“吞吐-延迟曲线”,并从中识别三个关键区域:延迟敏感区、拐点区和饱和区。本节将围绕这条曲线展开,结合排队论与利特尔法则,给出可操作的建模与判读方法。

一、吞吐-延迟曲线的形态与三个区域

假设我们固定GPU型号、模型结构和输入序列长度,仅改变批大小 B,观察系统吞吐量 TPS(每秒处理样本数)与单请求端到端延迟 L(毫秒)的变化。典型曲线呈现如下特征:

  • 延迟敏感区(小批量区):B 很小(如 1~4),GPU计算单元利用率低,吞吐随批大小近似线性增长,而延迟增长缓慢。此时系统对延迟敏感,增加批大小能显著提升吞吐且延迟代价小。
  • 拐点区(膝点附近):吞吐增速开始放缓,延迟开始加速上升。拐点是吞吐收益与延迟代价的“性价比”最高点,通常对应GPU利用率达到70%~85%的批大小。
  • 饱和区(大批量区):继续增大批大小,吞吐几乎不再增长(受限于显存带宽、SM占用或内存墙),而延迟因排队和资源争用急剧上升。此时系统进入饱和,增加批量只增加延迟,不增加吞吐。

下图以示例数据绘制了这条曲线,并标注了三个区域与拐点位置。图中横轴为批大小,左纵轴为吞吐量,右纵轴为延迟,两条曲线共同构成权衡关系。

吞吐-延迟权衡曲线(示例数据) 批大小 B(样本数) 吞吐量 TPS(样本/秒) 延迟 L(毫秒) 延迟敏感区 拐点区 饱和区 拐点 B≈32 吞吐量 TPS 延迟 L 1 8 24 64 128 256

需要说明的是,上图数据为教学示例,用于说明曲线形态与区域划分逻辑,并非某次真实压测的实测结果。实际系统中,拐点位置会随模型、序列长度、显存带宽和并发策略变化。

二、用利特尔法则建立初步模型

利特尔法则(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. 确定测试点:选择批大小或并发数序列,例如 [1, 2, 4, 8, 16, 32, 64, 128, 256]。每个点持续压测60秒,排除前10秒预热数据。
  2. 采集指标:记录每秒完成请求数(TPS)和P99端到端延迟(ms)。同时记录GPU利用率(nvidia-smi dmon或DCGM)和显存占用。
  3. 计算拐点:对吞吐曲线求一阶差分,找到差分值下降超过50%的位置,或使用“吞吐/延迟”比值最大化点作为拐点候选。
  4. 验证饱和区:当连续两个测试点的吞吐增幅小于5%,而延迟增幅大于30%,判定进入饱和区。

以下是一个示例数据表(教学假设,非实测),展示如何从数据中识别拐点:

批大小 B 吞吐 TPS P99延迟 (ms) 吞吐/延迟比 区域判断
142241.75延迟敏感区
4158266.08延迟敏感区
82902910.00延迟敏感区
164803513.71拐点前
326205211.92拐点附近
64680887.73拐点后
1287001654.24饱和区
2567053102.27饱和区

从表中可见,吞吐/延迟比在 B=16 时达到峰值13.71,随后下降。因此拐点可判定在 B=16~32 之间。若业务对延迟敏感(如P99要求小于50ms),则 B=32 已接近上限;若追求最大吞吐且可容忍高延迟,则 B=64~128 更合适,但需注意饱和区延迟急剧恶化。

提示:拐点不是固定值。当输入序列长度从512增加到2048时,计算量增大,拐点会向更小的批大小移动;当使用FP16或INT8量化后,显存带宽压力降低,拐点可能右移。建议针对实际业务负载定期重新标定。

四、从曲线到调度策略

识别出三个区域后,可以制定差异化的调度策略:

  • 延迟敏感区:优先保证低延迟,可采用小批量、高优先级队列,甚至为关键请求预留计算资源。
  • 拐点区:作为默认工作点,动态批处理在此区间调整批大小,兼顾吞吐与延迟。
  • 饱和区:应主动限流或拒绝新请求,避免队列无限增长导致雪崩。可设置最大并发数 N_max,当排队长度超过阈值时触发背压。

结合利特尔法则,我们可以估算系统最大安全并发数:若目标P99延迟为 L_target,当前吞吐为 TPS,则最大并发 N_max ≈ TPS × L_target。例如 TPS=620,L_target=50ms,则 N_max ≈ 31。当实际并发超过此值时,延迟将突破目标,需要限流或扩容。

注意:利特尔法则假设系统处于稳定状态且请求不丢失。在突发流量或批处理时间波动较大的场景下,估算值需留出20%~30%余量。同时,GPU显存限制可能使实际 N_max 低于理论值,需结合显存占用曲线综合判断。