🧸 ELI5 · LLM 推理性能大考场

大模型到底有多快?vLLM 压测大阅兵

10 个前后咬合的卡通两格漫画,拆解 vLLM 官方 Benchmark CLI 核心评测全家桶与真实性能防坑指南。

小绿:正在吞吐生成的大模型引擎
小橙:客户端流入的 Prompt 与新请求
小蓝:KV Cache 与复用的前缀缓存
红虚线:排队拥堵/被挤退/等待首字超时

⚡ 核心主线:不仅要吃得饱,更要吐得快

一句话真相: 离线跑分只看引擎一秒能吞下多少字(吞吐量),而线上用户不仅在乎你一秒吐多少字,更在乎“等第一个字要憋多久”(首字时延 TTFT)以及“字吐出来顺不顺滑”(吐字抖动 ITL)!vLLM Benchmark CLI 就是给大模型做全身 CT 扫描的听诊器。

并发请求 TTFT 排队等待期 vLLM KV Cache PagedAttention 引擎 TPOT 持续吐字 用户端
已学完
1

离线极限吞吐 (Offline Throughput)

💡 一句话解释: 不开任何网络服务,直接把几千段文字塞给本地模型,测它到底能嚼多快!
vllm bench throughput --model NousResearch/Hermes-3-Llama-3.1-8B --dataset-name sonnet --dataset-path sonnet.txt --num-prompts 10
烦恼:不知道硬件到底多能打
GPU? 没有基准,盲猜算力

空有显卡,不知极限

办法:满汉全席一口气全塞满
P1 P2 P3 P4 4656 Total Tokens/s

批量塞满,测出理论上限

解决了什么:无需搭建网络服务,零开销快速测出单卡/多卡最高理论吞吐(Tokens/s)。
代价是什么:完全忽略了网络传输、排队拥堵和真实用户的流式交互体验。
已学完
2

在线服务压测 (Online Serving Benchmark)

💡 一句话解释: 模拟真实用户发起 HTTP 网络请求,测试在实际 API 接口下的抗压表现。
vllm bench serve --backend vllm --model Hermes-3-Llama-3.1-8B --endpoint /v1/completions --dataset-name sharegpt --num-prompts 10
烦恼:离线成绩好,上线卡成狗
单机极速 HTTP 堵死 网络序列化与调度开销

实验室测速,上线露馅

办法:真实客户端兵分多路压测
vLLM 实例 /v1/completions 真实测试

真刀真枪,测出生产水准

解决了什么:真实捕捉网络传输、路由反序列化及并发排队时的真实服务负载。
代价是什么:压测客户端自身网络和 CPU 开销可能成为新的瓶颈,需要精心配置环境。
已学完
3

首字响应时延 (TTFT: Time To First Token)

💡 一句话解释: 用户发完消息后,屏气凝神等屏幕跳出“第 1 个字”的那段等待时间。
# 关注结果中的 Mean TTFT, Median TTFT, P99 TTFT (越小越爽)
烦恼:点了发送,屏幕像死机了一样
发送 3000ms? Prefill 阶段漫长计算

第一个字难产,急死人

办法:分块预填充与 Chunked Prefill
就绪 “你” TTFT 仅 71ms,瞬时蹦出

秒回首字,交互极其爽滑

解决了什么:精准衡量从发起请求到预填充(Prefill)完成的首字耗时,决定了用户觉得“卡不卡”。
代价是什么:长上下文 Prompt 会剧烈推高 TTFT,需配合 Chunked Prefill 削峰填谷。
已学完
4

吐字抖动与流速 (TPOT vs ITL)

💡 一句话解释: TPOT 是除首字外吐每个字的平均速度,而 ITL 记录每个字之间有没有“忽然打嗝卡住”。
Mean TPOT: 7.91 ms | Mean ITL: 7.74 ms (ITL 抖动决定打字机流不流畅)
烦恼:打字忽快忽慢,狂打嗝
ITL 突刺 200ms 别的请求进场插队抢占

打字断断续续像结巴

办法:细粒度时间片均衡吐字
均匀间隔 7.7ms,顺如飞瀑

如丝般顺滑,阅读超舒适

解决了什么:通过监控 P99 ITL 揪出多请求混部时的掉帧卡顿,保证流式吐字毫无阻滞。
代价是什么:为保证 ITL 平稳,可能必须牺牲部分极致批处理并行规模。
已学完
5

前缀缓存评测 (Prefix Caching Benchmark)

💡 一句话解释: 所有用户都共用同样的“系统提示词”或长背景,vLLM 把它记在小本本上,下次直接抄答案!
python3 benchmarks/benchmark_prefix_caching.py --model llama-2-7b-chat-hf --enable-prefix-caching --repeat-count 100
烦恼:同样 2000 字前言反复算
重读背景 从头再算 显卡大量算力在做无用功

同一个字,算了十遍

办法:KV Cache 随身留存,即中即用
⚡HIT 已存KV TTFT 暴降 80%!

前缀秒中,直接开吐

解决了什么:命中缓存时跳过耗时的 Prefill 阶段,吞吐成倍暴涨且显著降低首字延迟。
代价是什么:压测时多次跑相同测试会虚标成“假高分”,需切换 --seed 或重置服务以排除干扰。
已学完
6

结构化输出评测 (Structured Output Benchmark)

💡 一句话解释: 当大模型必须按照 JSON Schema、正则或语法树规范输出时,测它的约束引导到底会拖慢多少速度!
python3 benchmarks/benchmark_serving_structured_output.py --dataset json --structured-output-ratio 1.0
烦恼:戴上 JSON 紧箍咒,吐字变慢
{"name": ...} 卡死 每步都在做词表掩码过滤

规矩太多,步履蹒跚

办法:XGrammar 语法加速引擎保驾护航
XGrammar 合法JSON 保证格式 100% 正确且极速

戴着镣铐,照样跳舞

解决了什么:支持 JSON Schema、Grammar、Regex 等严格格式生成,压测评估其对吐字吞吐的影响。
代价是什么:Logits 掩码计算会消耗额外的 CPU/GPU 资源,可能轻微拉长每 token 耗时。
已学完
7

长文本问答评测 (Long Document QA)

💡 一句话解释: 给模型扔一份整本小说的超长长文本,测试显存够不够用,以及几万字读完要花多久。
vllm bench long-doc-qa --model Qwen2.5-72B --max-model-len 32768 --repeat-mode tile
烦恼:大海捞针,显存直接爆仓
32K Tokens 💥 OOM KV 膨胀吞噬所有显存

长篇大论,显卡直接吐血

办法:分块注意力调度与平铺复制
Chunk 1 Chunk 2 精准答出 分页内存管理,零浪费

分片入腹,再长也能咽下

解决了什么:系统评估万级 Token 超长上下文下的 Prefill 算力利用率与显存驻留极限。
代价是什么:长文本 Prefill 占住 GPU 期间,其他小请求的响应会被迫推迟。
已学完
8

阶梯爬坡负载 (Ramp-Up & Load Patterns)

💡 一句话解释: 别总是用均匀小碎步压测,从 1 QPS 一路狂飙爬坡到 100 QPS,看它在哪一刻彻底崩溃!
vllm bench serve --request-rate 2 --ramp-up-strategy linear --ramp-up-end-request-rate 50 --ramp-up-duration 60
烦恼:匀速压测合格,突发流量瘫痪
平常平稳 早高峰突发雪崩 突发洪峰导致雪崩式丢包

假平稳,一冲就垮

办法:阶梯线性拉升,探明承载拐点
崩溃拐点 精准找出安全承载红线

逐级加码,摸清底细

解决了什么:模拟生产早高峰流量线性增加过程,准确测试集群的饱和拐点与熔断阈值。
代价是什么:测试时间较长,且需要配置专门的客户端探针防止早衰退出。
已学完
9

投机采样加速评测 (Speculative Decoding)

💡 一句话解释: 让轻快的小助手(草稿模型)一口气瞎猜写出 5 个字,大模型只看一眼批量盖章认可!
# 评测 SPEED-Bench, Spec Bench 或 InstructCoder 投机加速比
烦恼:巨无霸大模型自己一步步推
70B 大模型 庞大权重每动一次慢如蜗牛

大块头自己推,快不起来

办法:小弟狂打草稿,大哥一秒核验
小草稿 大模型并行验 生成速度飙升 2~3 倍!

小弟先写,大哥批量盖章

解决了什么:通过 SPEED-Bench 科学评测投机接受率,实现单请求吐字速度翻倍。
代价是什么:草稿模型占用额外显存,若接受率低于 50% 甚至可能反向拖慢速度。
下一站
10

多模态与工具评测 (Multi-Modal & BFCL)

💡 一句话解释: 当大模型要看图片、听声音、甚至自己调天气 API 查快递时,测它的全场景战斗力!
vllm bench serve --backend openai-chat --model Qwen2.5-VL-7B --dataset-name sharegpt4v
烦恼:纯文字跑分无法代表真实 AI
ABC 🖼️🎙️🛠️ 图文音频全部未测到

只考单科,难测全貌

办法:全能大联考,图文视听一网打尽
图像编码 Vision / BFCL 真实生产端到端全链路

文武双全,直通生产实战

解决了什么:结合 BFCL(工具调用)与 ShareGPT4V 真实图像输入,全面覆盖多模态 Agent 性能。
代价是什么:图像编码器(ViT)开销极大,需开启 ViT CUDA Graphs 等专项优化。

📏 性能衡量尺:四大核心指标取舍指南

在 vLLM 生产上线压测中,永远不存在“全部指标都最好”的神仙配置。不同指标间互相制约:

吞吐量 Tokens/s 首字时延 TTFT (ms) 逐字抖动 ITL (ms) 前缀命中 Cache Hit 支点:GPU 算力上限与显存带宽平衡

🚀 追求极致吞吐 (Batch 大)

大幅改善: 总处理 Token/s 翻倍

牺牲妥协: TTFT 首字显著变慢,用户等待加长

⚡ 追求秒级首字 (Chunked Prefill)

大幅改善: 首字迅速弹出,打字流畅

牺牲妥协: 极端并发下总吞吐降低 10~20%

🗂️ 开启 Prefix Caching

大幅改善: Agent 场景吞吐暴涨、成本暴降

牺牲妥协: 占用长期 KV 显存,缓存未命中时浪费管理开销

👶 零基础版:如何读懂 vLLM 的体检报告单?

当你敲完 vllm bench serve 命令后,终端会打印出一大张表格。很多初学者看得一头雾水,其实只要看懂以下几个关键行:

报告单字段 正常优秀范围 大白话通俗解释 如果数值太差怎么办?
Request Throughput 10 ~ 100+ req/s 每秒能成功处理多少个用户问题 开启张量并行(TP)或扩充 GPU 节点
Output Token Throughput 500 ~ 4000+ tok/s 显卡每秒能够疯狂吐出多少个单词 调大 max_num_seqs,用更大 Batch 跑满算力
Mean / P99 TTFT < 100ms (P99 < 300ms) 等第一个字蹦出来等了多久 开启 Chunked Prefill 削减大提示词阻塞
Mean / P99 TPOT 10 ~ 25 ms 生成正文时每个字吐出来的耗时 采用 FP8 / INT4 量化或投机采样加速
P99 ITL 抖动 接近 Mean ITL (< 20ms) 字与字之间有没有忽然卡壳 避免过大 Batch 引起的抢占与内存驱逐

提示:在评测具有相同 Prefix 的测试集时,务必注意重置缓存,否则会由于缓存命中而得出虚高的假成绩!

🗺️ 一遍过完:vLLM 官方压测指南路线

所有资料已全部通过真实网络连接核验,覆盖从入门命令行到复杂参数调优:

🚩 第一站:vLLM Benchmark CLI 官方总文档
为什么去: 学习官方命令行全家桶,掌握各种压测参数的最权威用法。
预计耗时: 15 分钟
立即前往 ↗
🚩 第二站:参数扫描自动化 (Parameter Sweeps)
为什么去: 学会用脚本自动遍历张量并行、批大小和不同量化等级的性能拐点。
预计耗时: 20 分钟
立即前往 ↗
🚩 第三站:性能追踪仪表盘 (Performance Dashboard)
为什么去: 探索 vLLM 官方发布的最新版本模型与硬件对比大盘。
预计耗时: 10 分钟
立即前往 ↗
🚩 第四站:投机采样架构指南 (Speculative Decoding)
为什么去: 掌握 EAGLE、MTP 及 Draft Model 在 vLLM 下的高阶配置与调优姿势。
预计耗时: 15 分钟
立即前往 ↗