3、性能基准测试概念:吞吐量、延迟、首Token延迟、Token生成速率、TTFT、TPOT等关键指标定义与计算方式

在vLLM的调优实践中,性能基准测试是衡量系统能力、定位瓶颈、验证优化效果的基础工程手段。如果指标定义不清晰、计算口径不统一,后续的调优工作将失去可比较的锚点。本章将系统梳理LLM推理服务中最核心的性能指标,包括吞吐量(Throughput)、延迟(Latency)、首Token延迟(TTFT)、单Token生成时间(TPOT)以及Token生成速率等,明确其数学定义、测量方法、适用场景与常见误区,为后续章节的基准测试工具使用和参数调优奠定严谨的度量基础。

LLM推理性能指标全景图 单请求生命周期时间轴 t (ms) 排队等待 Prefill Decode(逐Token生成) 结束 TTFT TPOT = (总Decode时间)/(输出Token数-1) 总延迟 核心指标定义 TTFT (Time To First Token) 从请求发出到收到首个输出Token的时间 包含网络传输 + 排队 + Prefill计算时间 TPOT (Time Per Output Token) 每个输出Token的平均生成时间 TPOT = (总延迟 - TTFT) / (输出Token数 - 1) 吞吐量 (Throughput) 单位时间处理的请求数或Token数 req/s 或 tokens/s Token生成速率 (Token/s) 每秒生成的Token数量,与TPOT互为倒数 计算关系与测量要点 并发请求数 (C) 负载压力 吞吐量 (T) T = C / 平均完成时间 延迟 (Latency) P50 / P95 / P99 SLO 约束 如 P95 TTFT < 500ms 测量工具: • vLLM benchmark_serving.py • 自定义脚本记录时间戳 • 注意预热(Warmup)与稳态测量 ⚠ 指标之间相互制约,需联合分析

3.1 核心指标定义与数学表达

3.1.1 延迟(Latency)与首Token延迟(TTFT)

延迟是用户可感知的最直接指标,定义为从客户端发送请求到收到完整响应所经过的总时间。在LLM推理场景中,延迟需要进一步拆解为两个关键阶段:首Token延迟(TTFT, Time To First Token)和Token间延迟(TPOT, Time Per Output Token)。TTFT衡量的是从请求发出到模型输出第一个Token的时间,它包含了网络传输、请求排队、输入预处理(Prefill)以及首Token生成的全部耗时。TTFT直接决定了用户等待"第一个字"的体验,在交互式应用中(如聊天机器人、实时翻译),TTFT通常要求控制在500ms以内。

从数学角度看,TTFT的计算公式为:

TTFT = T_first_token - T_request_sent

其中,T_request_sent是客户端发出请求的时刻,T_first_token是客户端收到第一个输出Token的时刻。在实际测量中,需要注意网络传输时间的影响,如果客户端与服务端不在同一网络环境,应使用服务端日志中的时间戳来计算,以排除网络波动干扰。

3.1.2 Token生成速率与TPOT

TPOT(Time Per Output Token)是衡量模型生成阶段效率的核心指标,它表示生成每个输出Token所需的平均时间。TPOT的计算方式为:

TPOT = (T_complete - T_first_token) / (N_output_tokens - 1)

其中,T_complete是收到完整响应的时刻,N_output_tokens是输出Token的总数。分母使用(N-1)是因为第一个Token的生成时间已计入TTFT,后续每个Token的生成间隔才是Decode阶段的真实耗时。Token生成速率(Tokens/s)与TPOT互为倒数关系:

Token生成速率 = 1 / TPOT

例如,若TPOT为50ms,则每秒可生成20个Token。在实际部署中,TPOT受模型大小、硬件算力、KV Cache命中率、并发负载等多重因素影响,是调优时最需要关注的指标之一。

3.1.3 吞吐量(Throughput)

吞吐量衡量系统在单位时间内处理的请求数量或生成的Token总量,通常以requests/s或tokens/s为单位。在vLLM的基准测试中,吞吐量有两种常见口径:

  • 请求级吞吐量:单位时间完成的请求数,适用于衡量服务端的并发处理能力。
  • Token级吞吐量:单位时间生成的Token总数,更直接反映模型的计算效率。

吞吐量的计算公式为:

Throughput = 总请求数 / 总测试时间(或 总生成Token数 / 总测试时间)

需要注意的是,吞吐量与延迟之间存在经典的"倒U型"关系:在低并发下,延迟低但吞吐量也低;随着并发增加,吞吐量上升但延迟也随之恶化;当并发超过系统承载能力时,吞吐量反而下降(因排队和资源争抢)。因此,基准测试必须同时报告吞吐量和延迟分布,才能全面评估系统性能。

指标名称 缩写 定义 计算公式 典型优化目标
首Token延迟 TTFT 请求发出到收到首个Token的时间 T_first_token - T_request_sent P95 < 500ms(交互式)
Token间延迟 TPOT 生成每个输出Token的平均时间 (T_complete - T_first_token) / (N-1) P95 < 100ms(流式)
Token生成速率 Tokens/s 每秒生成的Token数量 1 / TPOT 越高越好
请求级吞吐量 Req/s 单位时间完成的请求数 总请求数 / 总时间 满足SLO前提下最大化
Token级吞吐量 Tokens/s 单位时间生成的Token总数 总Token数 / 总时间 满足SLO前提下最大化
端到端延迟 Latency 请求发出到完整响应的时间 T_complete - T_request_sent P95 < 2s(非流式)

3.2 指标测量方法与操作流程

3.2.1 基准测试的标准流程

为了获得可复现、可比较的性能数据,基准测试必须遵循标准化的操作流程。以下是vLLM性能测试的推荐步骤:

  1. 环境准备:固定硬件配置(GPU型号、数量)、CUDA版本、vLLM版本、模型权重版本,记录所有环境参数。
  2. 数据集构造:使用具有代表性的输入数据,包括不同长度(短、中、长)的Prompt,以及不同的输出长度配置(max_tokens参数)。
  3. 预热(Warmup):在正式测试前发送若干请求,让GPU达到稳态温度、CUDA上下文完成初始化、Page Attention的Block分配器进入稳定状态。通常预热50-100个请求。
  4. 并发压力测试:使用vLLM自带的benchmark_serving.py脚本或自定义压测工具,以固定并发数(如1、4、8、16、32、64)发送请求,持续运行足够长时间(建议至少3-5分钟)以获得稳态数据。
  5. 数据采集:记录每个请求的TTFT、TPOT、总延迟、成功/失败状态,以及服务端的GPU利用率、显存占用、KV Cache使用率。
  6. 统计输出:计算P50/P95/P99分位数、平均值、标准差,并生成吞吐量-延迟曲线。

关键操作要点:使用vLLM官方基准脚本时,建议添加--request-rate参数控制请求发送速率(而非固定并发数),这样可以更真实地模拟生产环境的流量到达模式。同时,务必设置--warmup参数跳过预热阶段的数据统计。

3.2.2 测量工具与命令示例

vLLM提供了内置的基准测试工具,位于benchmarks/benchmark_serving.py。以下是一个典型的测量命令:

# 启动vLLM服务(后台)
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-3.1-8B-Instruct \
    --gpu-memory-utilization 0.90 \
    --max-num-seqs 256 \
    --port 8000 &

# 运行基准测试(固定并发数模式)
python benchmarks/benchmark_serving.py \
    --backend vllm \
    --model meta-llama/Llama-3.1-8B-Instruct \
    --tokenizer meta-llama/Llama-3.1-8B-Instruct \
    --dataset-path ShareGPT_V3_unfiltered_cleaned_split.json \
    --num-prompts 500 \
    --concurrency 32 \
    --max-tokens 512 \
    --warmup 50 \
    --save-result results_concurrency32.json

测试完成后,脚本会输出包含TTFT、TPOT、延迟分位数、吞吐量等指标的JSON文件,并打印汇总表格。对于更细粒度的分析,可以修改脚本或使用自定义客户端记录每个请求的时间戳。

3.3 案例拆解:并发数对性能指标的影响分析

为了直观展示各指标之间的关系,我们设计一个标准测试案例。测试环境为单张NVIDIA A100 80GB GPU,模型为Llama-3.1-8B-Instruct(FP16精度),输入Prompt平均长度512 Token,输出长度固定为256 Token。我们分别以并发数1、8、16、32、64进行测试,记录关键指标。

并发数 吞吐量 (req/s) Token吞吐 (tokens/s) TTFT P95 (ms) TPOT P95 (ms) 端到端延迟 P95 (s)
1 1.2 307 180 45 11.7
8 8.5 2176 320 58 15.2
16 14.2 3635 550 72 18.9
32 18.6 4762 980 95 25.4
64 17.1 4378 2100 140 38.7

案例分析:从数据中可以看到,当并发数从1增加到32时,吞吐量持续上升(从1.2 req/s提升到18.6 req/s),但TTFT和TPOT也在同步恶化。TTFT P95从180ms增长到980ms,已经超过交互式应用500ms的SLO红线。当并发数达到64时,吞吐量反而下降至17.1 req/s,说明系统已进入过载状态——GPU计算资源饱和、KV Cache内存不足导致请求排队时间急剧增加,TTFT P95飙升至2.1秒。

调优决策:对于该配置,最优工作点应选择并发数16-24之间。若业务对TTFT敏感(如聊天场景),应限制最大并发数或使用vLLM的--max-num-seqs参数进行限流;若业务对吞吐量更敏感(如离线批量处理),可以接受较高的延迟,将并发数设置在32左右。此外,可以通过开启--enable-prefix-caching、调整--max-model-len或使用量化(如AWQ)来进一步优化。

风险提示:在并发数较高时,TPOT的P95与平均值差距会显著拉大(本例中P95比平均值高约30-40%),这反映了Decode阶段的不稳定性。这种抖动可能源于GPU调度延迟、显存带宽竞争或Page Attention的Block回收开销。在性能调优时,不仅要关注平均值,更要关注P95/P99分位数,确保极端情况下的用户体验。

3.4 常见误区与总结复盘

3.4.1 误区一:只测吞吐量,忽略延迟分布

许多团队在汇报性能时只给出"吞吐量达到XX tokens/s"的单一数字,这具有很大的误导性。高吞吐量可能是在极高并发下实现的,此时延迟可能已经恶化到不可接受的程度。正确的做法是同时报告吞吐量和延迟分位数,并明确SLO约束条件。例如:"在P95 TTFT < 500ms的约束下,最大吞吐量为14.2 req/s"。

3.4.2 误区二:忽略输入/输出长度的影响

LLM推理的耗时与输入长度(影响Prefill计算量)和输出长度(影响Decode步数)强相关。如果基准测试只使用单一长度的数据,结果无法代表真实业务场景。建议使用混合长度的数据集(如ShareGPT数据集),并分别统计不同长度区间下的指标。

3.4.3 误区三:未进行预热或测试时间过短

GPU在冷启动时性能较低,CUDA内核加载、显存分配、Page Attention的Block初始化都会影响前几个请求的延迟。如果测试时间过短(如仅运行30秒),数据会包含大量预热阶段的噪声。建议预热至少50个请求,正式测试持续3分钟以上,并丢弃前10%的数据点。

3.4.4 误区四:混淆TPOT与Token生成速率

TPOT的单位是"毫秒/Token",而Token生成速率的单位是"Token/秒",两者互为倒数。但在流式输出场景中,用户感知的"打字机效果"取决于Token生成速率,而非TPOT。例如,TPOT为50ms时,Token生成速率为20 Token/s,用户每50ms看到一个新Token,体验流畅;若TPOT为200ms,则每秒仅生成5个Token,用户会明显感到卡顿。

经验总结:性能基准测试的核心原则是"在SLO约束下最大化吞吐量"。建议建立标准化的测试基线(固定硬件、模型、数据集、并发梯度),每次调优后运行同一套测试,对比指标变化。同时,将TTFT、TPOT、吞吐量三个指标绘制成三维关系图,可以更直观地发现系统瓶颈——TTFT过高通常意味着排队或Prefill阶段问题,TPOT过高则指向Decode阶段或显存带宽瓶颈。