随着大模型推理服务陆续上线,服务端性能不再只是 "能跑起来",而是要能回答几个关键问题:系统能承载多少并发?延迟会在哪里明显恶化?吞吐饱和点在哪里?TTFT、TPOT、RPS 是否满足 SLA?
GuideLLM 是 vLLM 官方开源的推理压测工具,专门面向大模型推理服务做负载测试。它兼容所有 OpenAI‑Compatible HTTP 后端,能够帮助团队快速完成并发扫描、稳态压测、饱和点识别,并输出完整的性能报告。
一、GuideLLM 是什么
GuideLLM 的定位很明确:给大模型推理服务做压测,而不是做模型训练。
它主要解决以下问题:
- 推理服务在不同并发下的性能表现如何
- 系统吞吐什么时候到达拐点
- TTFT、TPOT、P50/P90/P95/P99 延迟变化情况
- RPS、Token 吞吐量是否满足业务目标
- 不同后端、不同模型、不同并发策略之间如何对比
GuideLLM 支持两种核心压测模式:
表格
| 模式 | 适用场景 |
|---|---|
sweep |
从低并发逐步抬升,自动扫描系统性能拐点,适合先找饱和点 |
fixed |
固定并发持续压测,适合做稳态验证和 SLA 回归 |
在流量模型上,GuideLLM 支持:
表格
| 流量模型 | 说明 |
|---|---|
poisson |
泊松流量,更接近真实业务请求到达模式 |
constant |
恒定速率,适合做基准对比测试 |
输出方面,GuideLLM 可以生成:
表格
| 输出类型 | 用途 |
|---|---|
| CSV | 原始时序指标,方便导入 Excel 对比 |
| JSON | 结构化报告,适合程序解析和 CI 自动化 |
| HTML | 交互式报告,查看分位延迟和曲线最方便 |
| PNG | 离线性能曲线图,适合文档和汇报 |
二、安装 GuideLLM
1. PyPI 安装(推荐)
pip install guidellm[recommended] -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install guidellm[plot] -i https://pypi.tuna.tsinghua.edu.cn/simple
2. Git 源码安装
git clone https://github.com/vllm-project/guidellm.git
cd guidellm
pip install -e ".[recommended,plot]" -i https://pypi.tuna.tsinghua.edu.cn/simple
3. 验证安装
guidellm --help
guidellm version
建议 Python ≥ 3.9,推荐 3.10 / 3.11。
三、核心参数快速理解
GuideLLM 的命令结构并不复杂,重点掌握这几个参数即可:
guidellm run [OPTIONS]
表格
| 参数 | 作用 |
|---|---|
--backend |
指定推理后端,通常使用 openai_http |
--tokenizer |
指定 Tokenizer,必须和推理服务一致 |
--profile |
选择压测模式:sweep 或 fixed |
--data |
请求数据源:synthetic_text 或 jsonl |
--constraint |
设置压测停止条件 |
--output |
指定输出报告格式 |
1. Backend:连接推理服务
--backend kind=openai_http,target=http://127.0.0.1:8000/v1,model=模型名
如果服务需要鉴权,可以加上 api_key:
--backend kind=openai_http,target=http://127.0.0.1:8000/v1,model=模型名,api_key="sk-xxxx"
2. Tokenizer:必须和推理服务一致
--tokenizer kind=huggingface_auto,model=/data/models/模型目录
这是非常关键的一点:Tokenizer 不一致,token 统计就会失真,后续 TPOT、吞吐等指标都会受影响。
3. Profile:选择压测方式
sweep 适合先做容量探测:
--profile kind=sweep,sweep_size=15,strategy_type=poisson
fixed 适合固定并发压测:
--profile kind=fixed,concurrency=16,strategy_type=poisson
4. Data:合成数据或真实数据集
合成数据:
--data kind=synthetic_text,prompt_tokens=512,output_tokens=512
真实数据:
--data kind=jsonl,source=./test_dataset.jsonl
JSONL 示例:
{"prompt": "your input prompt", "output_tokens": 256}
5. Constraint:控制压测停止条件
--constraint kind=max_duration,seconds=120
--constraint kind=over_saturation
--constraint kind=max_errors,rate=0.05
常用组合是:
- 每个档位最长运行 120 秒
- 开启过饱和检测
- 错误率超过 5% 自动停止
四、实战示例:一次完整的 sweep 压测
下面这个命令适合作为标准模板使用:先通过 sweep 找到系统饱和点,再决定后续 fixed 稳态压测的并发档位。
guidellm run \
--backend kind=openai_http,target=http://127.0.0.1:8000/v1,model=DeepSeek-R1-Distill-Qwen-7B \
--tokenizer kind=huggingface_auto,model=/data/models/DeepSeek-R1-Distill-Qwen-7B \
--profile kind=sweep,sweep_size=15,strategy_type=poisson \
--data kind=synthetic_text,prompt_tokens=512,output_tokens=512 \
--constraint kind=max_duration,seconds=120 \
--constraint kind=over_saturation \
--output kind=csv,path=./guidellm_reports/DeepSeek-R1-Distill-Qwen-7B/sweep_result.csv \
--output kind=json,path=./guidellm_reports/DeepSeek-R1-Distill-Qwen-7B/sweep_result.json \
--output kind=html,path=./guidellm_reports/DeepSeek-R1-Distill-Qwen-7B/report.html \
--output kind=plot,path=./guidellm_reports/DeepSeek-R1-Distill-Qwen-7B/preview_plot.png
这条命令的含义是:
- 目标后端:
http://127.0.0.1:8000/v1 - 测试模型:
DeepSeek-R1-Distill-Qwen-7B - 压测模式:
sweep - 扫描档位:15 档
- 流量模型:泊松流量
- 输入 token:512
- 输出 token:512
- 每档最长运行:120 秒
- 自动检测饱和点
- 输出 CSV、JSON、HTML、PNG 全套报告
五、固定并发压测模板
如果已经知道目标并发,也可以直接使用 fixed 模式:
guidellm run \
--backend kind=openai_http,target=http://127.0.0.1:8000/v1,model=DeepSeek-R1-Distill-Qwen-7B \
--tokenizer kind=huggingface_auto,model=/data/models/DeepSeek-R1-Distill-Qwen-7B \
--profile kind=fixed,concurrency=16,strategy_type=poisson \
--data kind=synthetic_text,prompt_tokens=512,output_tokens=512 \
--constraint kind=max_duration,seconds=120 \
--output kind=json,path=./guidellm_reports/DeepSeek-R1-Distill-Qwen-7B/sweep_result.json \
--output kind=html,path=./guidellm_reports/DeepSeek-R1-Distill-Qwen-7B/report.html \
--output kind=plot,path=./guidellm_reports/DeepSeek-R1-Distill-Qwen-7B/preview_plot.png
六、输出报告怎么看
GuideLLM 生成的四类报告,建议这样使用:
表格
| 报告 | 怎么看 |
|---|---|
report.html |
最常用,直接查看分位延迟、吞吐曲线和饱和点 |
sweep_result.csv |
适合导入 Excel,做多轮压测对比 |
sweep_result.json |
适合脚本解析、CI 自动化 |
preview_plot.png |
适合离线汇报或文档插图 |
重点关注以下指标:
- TTFT:首 token 延迟,直接影响用户等待感
- TPOT:每输出 token 间隔,影响生成速度体验
- RPS:每秒完成请求数,反映请求级吞吐
- Token 吞吐量:反映模型实际处理能力
- P50 / P90 / P95 / P99:判断延迟尾部表现
- 饱和拐点:判断系统能力上限
七、常见问题与排错
1. Token 指标不准
这是最常见问题。
原因:Tokenizer 和推理服务不一致。
解决方式:
- 优先使用本地模型目录
- 不建议混用不同来源的 Tokenizer
- 确保
--tokenizer指向和推理服务完全一致的模型目录
2. sweep 跑得太久
sweep_size 不是越大越好。
建议:
sweep_size控制在 10--15 档max_duration不要过长- 先粗扫找到拐点,再用
fixed做精细验证
3. over_saturation 没有触发
如果一直跑到最高并发,说明当前并发还没有真正打满后端能力。
可以尝试:
- 调大
end_concurrency - 检查后端 GPU/CPU/ 内存是否真的饱和
- 确认压测客户端本身没有成为瓶颈
4. 连接 OpenAI 后端失败
检查项:
- 是否带了
/v1后缀 model名称是否和服务端部署名称完全一致- 是否需要
api_key - 目标地址是否可达
八、建议的压测流程
更推荐的压测策略不是一上来就固定并发,而是分两步:
第一步:sweep 探测饱和点
sweep → 找拐点 → 看 P95/P99 与吞吐变化
第二步:fixed 做稳态验证
fixed → 固定并发 → 做 SLA 回归
这样既能快速评估系统容量,也能更稳地做版本变更前后的性能对比。
九、总结
GuideLLM 的价值不在于把压测命令写得复杂,而在于帮助团队用统一、可复现的方式回答一个更关键的问题:大模型推理服务到底能稳稳定承受到什么程度?
一个比较好的实践是:
- 新版本上线前做一次
sweep - 找到饱和点后,用
fixed做稳态回归 - 重点看 TTFT、TPOT、RPS、Token 吞吐和 P95/P99 延迟
- 每次保留 CSV、JSON、HTML 报告,方便横向对比
对很多团队来说,GuideLLM 可以作为大模型推理服务的标准性能评估工具,把 "大概能用" 变成 "有数据证明能用"。