快速上手 vLLM 性能基准测试:5 个关键指标带你从选型到调优
【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm
vLLM 是 LLM 高吞吐推理引擎,但"快不快、快在哪"不能靠感觉。本文带你用内置的vllm bench工具完成第一轮基准测试,看懂 TTFT、TPOT 等关键指标,并给出一套上线前的检查清单。
你会不会也遇到这几种情况
- 新版本不敢直接上:vLLM 迭代很快,你想确认这次升级对你的模型是提升还是回退,但手上没有可复现的数字。
- 压测结果"虚高":同样的服务,你测的吞吐比同事测的高出一截,最后发现是前缀缓存命中把结果抬高了。
- P99 延迟偶发飙高:平均延迟看着还行,但一到流量高峰就有请求明显变慢,你说不清是显存不够还是调度策略问题。
这三种情况的共同解法都一样:用统一的数据集、统一的参数跑基准,拿数字对比,而不是凭直觉。
为什么 vLLM 的性能值得你花时间验证
vLLM 的几个核心机制,直接决定了你该看哪些数字:
分页 KV cache(PagedAttention):KV cache 被切成固定大小的块按需分配,不再为每个请求预留整段显存。 这对你意味着什么:显存浪费变小,同样的卡能塞下更多并发请求,所以"最大并发数"才是衡量容量该看的量,而不是理论峰值。
连续批处理:不同请求动态拼进同一个 batch,长短请求互相填坑。 这对你意味着什么:吞吐对"流量形态"很敏感,用恒定的均匀流量测出来的结果,不能代表突发流量下的真实表现。
chunked prefill(分块预填充):长 prompt 的预填充被切成小块,和 decode 请求混排,避免一条长请求卡住整批。 这对你意味着什么:
max_num_batched_tokens这个参数同时影响 TTFT 和 ITL,是延迟调优的第一旋钮。
10 分钟跑起来:最小可用路径
不需要额外装压测框架,vLLM 自带基准工具。最短路径是三步:装包、起服务、压测。
pip install vllm vllm serve <你的模型>然后用vllm bench serve打流量。不想准备数据集时,可以用内置的随机数据集,固定长度、结果可复现:
vllm bench serve \ --model <你的模型> \ --dataset-name random \ --num-prompts 100跑完会输出一整份报告:成功请求数、总耗时、TTFT / TPOT / ITL 的均值、中位数和 P99。实测下来,把这份报告存档,就成了你后面所有调优动作的"对照组"。
如果你手头有 ShareGPT 之类的真实对话数据,把--dataset-name换成对应数据集即可;想先看数据长什么样,加上--plot-dataset-stats会生成输入/输出 token 分布图,先确认压测数据和生产流量像不像:
先看哪几个数字:按用途分组看指标
报告里指标不少,建议按"我要干什么"分三组看,别全背:
| 用途 | 关键指标 | 怎么看 |
|---|---|---|
| 选型 / 容量规划 | 输出 token 吞吐(tok/s)、请求吞吐(req/s) | 同数据集同参数下横向比,具体数值以实测为准 |
| 调优 | TTFT(P99)、TPOT / ITL | 长 prompt 场景盯 TTFT;流式体验盯 ITL |
| 排障 | preemption 计数、KV cache 可用 token 数 | 出现抢占说明显存余量不足 |
几个容易踩坑的点:
- TTFT vs TPOT 不是一回事:TTFT 是从发请求到收到第一个 token,受 prompt 长度影响大;TPOT 是首 token 之后每个 token 的平均耗时,反映稳态生成速度。用户抱怨"开头慢"查前者,抱怨"越打越卡"查后者。
- 同一台服务重复压测会虚高:上一轮跑完,前缀还留在缓存里,第二轮吞吐会被抬高。要复现干净结果,就换随机种子、重启服务,或用 sweep 模式(每次跑之间自动重置缓存)。
- P99 比均值值钱:均值正常、P99 拉胯,通常意味着有少数请求被抢占或排队了,这类问题只看平均数永远发现不了。
换个玩法:模拟真实流量和批量扫参数
按流量形态压测。vllm bench serve支持三个参数组合出不同压测形态:--request-rate(请求到达速率)、--burstiness(波动程度)、--max-concurrency(并发上限)。三种最常用的组合:
| 场景 | 参数组合 | 目的 |
|---|---|---|
| 最大吞吐 | 速率不限 + 设并发上限 | 模拟网关限流下的真实容量上限 |
| 真实基线 | 速率 5~20 + burstiness=1.0 | 自然泊松流量,做基线对比 |
| 稳定性压测 | burstiness=0.1~0.5 + 高速率 | 突发流量下看系统会不会雪崩 |
批量扫参数,别再手改配置重跑。vllm bench sweep serve可以对一组配置自动依次压测,每次运行之间重置服务缓存,结果可以直接对比——这正好解决"改一个参数要重启重测半天"的痛点。参数和输出目录的写法可以参考 官方基准文档。
上生产前必查清单
- 启动日志里的 KV cache token 总量,除以你的单请求最大长度,得到的"理论最大并发" ≥ 预期并发的 1.5 倍
- 压测期间日志没有 preemption 告警;有则提高
gpu_memory_utilization或调小max_num_seqs - 压测数据集的输入/输出长度分布,和线上真实流量在同一量级(用
--plot-dataset-stats看一眼) - 对比测试时每次之间都重置了缓存或更换了随机种子
- Prometheus 指标已接上,至少能看 preemption 计数和 token 吞吐
建议的动作:今天就用固定随机数据集跑一轮,把 TTFT P99、TPOT P99、输出吞吐三个数记下来存档;之后再改任何配置或升级版本,都重跑同一套命令做对比。有对照组,你的每一次调优才算数。
【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考