Inference Latency
推理延迟是模型将一个输入转换为预测结果所需的时间。内容涵盖影响因素、测量方法,以及它与吞吐量之间的权衡。
推理延迟是指经过训练的机器学习模型将一个输入(例如摄像头画面或文本提示)转换为预测结果所需的时间。通常以毫秒(ms)为单位,它决定了系统的响应速度:以每秒 30 帧运行的摄像头每 33.3 ms 输出一帧,因此,如果检测器耗时更长,就会跟不上数据流,无法支持实时推理。延迟可以只统计前向传播,也可以端到端统计从原始输入到可用输出的时间。生产系统会跟踪中位数(p50)和第 99 百分位数(p99)等百分位数,因为少数较慢的响应可能和平均值一样重要。
哪些因素会增加推理延迟#
单次预测需要经过多个阶段。预处理会解码、调整输入尺寸并进行归一化。前向传播运行网络,其开销随模型的 FLOPs、输入分辨率和数值精度而增加;运行速度则取决于处理器是 CPU、GPU还是神经处理单元 (NPU)。后处理会将原始输出转换为结果;对于检测器,这包括解码边界框并运行非极大值抑制 (NMS)。云 API会增加网络往返时间和请求在队列中的等待时间,因此边缘 AI会在采集数据的设备上运行模型。首次调用也会比后续调用更慢,因为框架会分配内存、将权重加载到缓存中,并在首次使用时选择内核。
硬件和运行时会让前向传播速度相差十倍甚至更多:Ultralytics YOLO26 nano使用 ONNX在 CPU 上处理一张 640 像素的 COCO图像,平均耗时 38.9 毫秒;使用 TensorRT在 NVIDIA T4 GPU 上则为 1.7 毫秒。Ultralytics YOLO 会将每次预测各阶段的耗时记录在结果的 speed 属性中,基准测试模式则会针对每种导出格式重复测量:
from ultralytics import YOLO
# Load the smallest YOLO26 detection model
model = YOLO("yolo26n.pt")
# Predict on one image
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# Per-image time in milliseconds for each stage of the pipeline
for stage, ms in result.speed.items():
print(f"{stage}: {ms:.1f} ms")循环会打印预处理、推理和后处理的耗时,它们的总和就是模型在当前设备上处理该图像的延迟。
准确测量延迟#
只有采用相同方法测量的延迟数据才具有可比性。要获得可靠的测量结果,应舍弃几次预热运行,计时多次运行,并报告中位数和尾部百分位数,而不是只测一次。在 GPU 上,计时器必须等待设备完成工作,例如使用 torch.cuda.synchronize(),因为内核是异步启动的,过早读取时钟会在任务完成前停止计时。输入尺寸、批次大小、精度和设备必须与部署时一致,因为模型在数据中心 GPU 上的延迟并不能说明它在手机上的延迟。FLOPs 可以在不考虑硬件的情况下估算开销,但 FLOPs 相同的模型在同一设备上的运行速度可能明显不同。
推理延迟与吞吐量#
吞吐量是系统在单位时间内处理的输入数量,例如每秒处理的图像数或 token 数,它往往与延迟此消彼长。较大的批次能让硬件利用率更高,从而提升吞吐量;但批次中的每个输入都必须等到整个批次处理完毕,因此每个请求的响应时间也会增加:
import time
import torch
import torchvision
# A ResNet-18 image classifier in inference mode on the CPU
model = torchvision.models.resnet18().eval()
for batch in [1, 2, 4, 8]:
x = torch.randn(batch, 3, 224, 224)
with torch.inference_mode():
model(x) # warmup run, not timed
times = []
for _ in range(20):
start = time.perf_counter()
model(x)
times.append(time.perf_counter() - start)
latency = sorted(times)[len(times) // 2] # median seconds per batch
print(f"batch {batch}: {latency * 1e3:5.1f} ms per batch, {batch / latency:4.0f} images/s")在笔记本电脑的 CPU 上,批次大小从 1 增至 8 后,吞吐量从每秒 168 张图像提高到 220 张,而返回一个批次所需的时间则从 6 ms 增至 36 ms。因此,驾驶辅助和语音助手等交互式系统会以批次大小 1 运行,而视频档案索引等离线任务则会积极采用批处理。LLM 服务器使用连续批处理,在运行中的批次里动态添加和移除请求,从而在不让每个用户等待整个批次处理完成的情况下保持较高吞吐量。
降低推理延迟#
通常,减少计算量带来的收益最大:使用更小的模型变体、降低输入分辨率,或通过模型剪枝减少权重。模型量化为 FP16 或 INT8 后,在配备快速低精度运算单元的硬件上,每项剩余操作的开销都会降低。将模型导出到经过优化的推理引擎,例如 TensorRT、OpenVINO 或 ONNX Runtime,可以融合层并为设备选择最快的内核。在设备本身运行模型可免去网络往返时间;通过移动网络连接时,这通常能节省几十毫秒。
延迟至关重要的场景#
- 大型语言模型(LLM):聊天服务会跟踪首个 token 的生成时间(用户会感受到响应速度)以及每个输出 token 的生成时间(决定流式输出速度)。推测解码会在一次前向传播中验证多个草拟 token,从而缩短第二项时间。
- 工业检测: 传送带上方的摄像头必须在零件到达剔除闸门前完成分类,因此延迟决定了产线的最高速度。
- 自动驾驶汽车: 感知、规划和控制共享有限的时间预算;以 100 km/h 行驶时,汽车每延迟 100 ms 就会前进 2.8 米。










