吞吐量定义:训练吞吐量、推理吞吐量与端到端吞吐量

吞吐量这个词,说白了就是「单位时间内能干多少活」。

但在深度学习里,它其实分三种场景。我刚开始调参那会儿,经常把训练和推理的吞吐量混为一谈,结果被老板怼了一顿。嗯,今天咱们就把这三个概念彻底掰扯清楚。

1. 训练吞吐量(samples/sec)

训练吞吐量,指的是模型在训练时,每秒能处理多少个样本。

公式很简单:

训练吞吐量 = 总样本数 / 总训练时间(秒)

但这里有个坑——你用的是「有效样本数」还是「总样本数」?

我个人习惯用「有效样本数」,也就是去掉数据加载、预处理、梯度同步这些开销之后,真正参与前向和反向传播的样本数。为什么?因为这样算出来的吞吐量,才能真实反映 GPU 的计算效率。

关键点:训练吞吐量受 Batch Size 影响极大。Batch 越大,GPU 利用率越高,吞吐量也越高。但 Batch 太大,模型收敛会变差——这就是调参的平衡艺术。

我在项目中遇到过一件事:某次训练一个 7B 参数的模型,Batch Size 从 32 调到 128,吞吐量翻了 3 倍。但模型收敛速度反而慢了,因为梯度更新次数变少了。后来我折中到 64,效果最好。

2. 推理吞吐量(inferences/sec)

推理吞吐量,就是模型上线后,每秒能处理多少个推理请求。

公式:

推理吞吐量 = 总推理次数 / 总推理时间(秒)

这里要注意,推理吞吐量通常比训练吞吐量高一个数量级。为什么?因为推理不需要反向传播,也不需要梯度计算。

你想想看,训练时一个样本要经过前向 + 反向 + 参数更新,推理时只需要前向一次。所以同样的硬件,推理吞吐量往往是训练吞吐量的 3-5 倍。

我的经验:推理吞吐量优化,核心在于减少单次推理的延迟。常用的手段包括:模型量化(FP16 -> INT8)、算子融合、KV Cache 优化等。

我曾经踩过一个坑:某次上线一个对话模型,推理吞吐量只有 50 inferences/sec,远低于预期。查了半天,发现是 Batch Size 设成了 1。改成动态 Batch 后,吞吐量直接飙到 200+。

3. 端到端吞吐量

端到端吞吐量,是用户最关心的指标。它衡量的是「从输入到输出」整个流程的吞吐能力。

公式:

端到端吞吐量 = 总请求数 / 总响应时间(秒)

这个指标包含了:数据预处理、模型推理、后处理、网络传输等所有环节。

说白了,端到端吞吐量才是用户真正感受到的「快」或「慢」。模型推理再快,如果数据加载慢、网络延迟高,用户照样骂娘。

注意:端到端吞吐量往往比推理吞吐量低 20%-50%。瓶颈通常不在模型本身,而在 I/O 和预处理环节。

我记得有一次做视频理解模型的部署,模型推理只用了 30ms,但视频解码花了 200ms。端到端吞吐量惨不忍睹。后来我把解码和推理做成流水线并行,才把吞吐量提上来。

三种吞吐量的对比

指标 关注点 典型值(A100) 优化方向
训练吞吐量 GPU 计算效率 100-500 samples/sec Batch Size、梯度累积、混合精度
推理吞吐量 模型响应速度 500-2000 inferences/sec 量化、算子融合、KV Cache
端到端吞吐量 用户体验 200-800 requests/sec 流水线、异步 I/O、缓存

核心逻辑图

下面这张图,展示了三种吞吐量之间的关系:

吞吐量三层结构 训练吞吐量(samples/sec) 前向 + 反向 + 参数更新 → 每秒处理样本数 优化:Batch Size、梯度累积、混合精度训练 推理吞吐量(inferences/sec) 仅前向 → 每秒推理次数 优化:量化、算子融合、KV Cache 端到端吞吐量(requests/sec) 预处理 + 推理 + 后处理 + 网络传输 优化:流水线、异步 I/O、缓存策略

一句话总结:训练吞吐量看 GPU 效率,推理吞吐量看模型响应,端到端吞吐量看用户体验。三者层层递进,缺一不可。

我个人建议,调参时先盯训练吞吐量,确保 GPU 利用率打满。上线前再测推理吞吐量和端到端吞吐量,找到真正的瓶颈在哪里。

嗯,这三个概念搞清楚了,后面的 Batch Size 调参才有意义。否则你调了半天,连自己在优化哪个吞吐量都不知道,那就尴尬了。

避坑指南:我曾经在汇报时,把训练吞吐量和推理吞吐量混着说,被技术总监当场指出。从那以后,我每次写报告都会明确标注「这是训练阶段」还是「推理阶段」的数据。

想要更多资料,联系可可