
大模型性能压测利器:解析vLLM推理服务压测工具
痛点:大模型性能评估的"黑盒困境"
想象一下这样的场景:你刚刚部署了一个32B参数的DeepSeek-R1模型,信心满满地准备上线服务。但突然有人问你:"这个模型能承受多大的并发?延迟如何?每秒能处理多少tokens?"
面对这些问题,很多开发者只能凭经验猜测,或者写一些简单的脚本测试。这就像是驾驶一辆没有仪表盘的汽车——你永远不知道自己跑得有多快,油还能跑多远。
传统压测方案的局限性:
• 🚫 指标单一:只能测基本的QPS,缺乏细粒度的延迟分析
• 🚫 场景受限:难以模拟不同输入输出长度组合的真实场景
• 🚫 结果分散:测试结果缺乏统一管理和对比分析
• 🚫 可视化不足:数据埋藏在日志中,难以直观理解性能表现
解药:专业化的vLLM压测框架
基于vLLM官方benchmarks
工具,我们开发了一套完整的推理服务压测框架。这不仅仅是一个测试工具,更像是大模型性能的"全身体检设备"。
核心功能特性
六大关键指标全覆盖:
•延迟 (Latency)- 整体响应时间
•吞吐量 (Throughput)- 每秒处理的请求数和token数
•首token时间 (TTFT)- 用户感知的"反应速度"
•token间延迟 (ITL)- 生成流畅度的关键指标
•每token输出时间 (TPOT)- 生成效率的直接体现
•端到端延迟 (E2EL)- 完整请求的时间开销
智能化测试管理:
• 批量压测:配置文件驱动,自动执行多种参数组合
• 结果聚合:按时间和模型自动组织,支持历史对比
• 可视化报告:一键生成专业的性能分析图表
• 模块化架构:核心模块解耦,易于扩展和维护
推理压测可视化
架构设计:简洁而不简单
系统架构
工具采用分层模块化设计,既保证了功能的完整性,又确保了代码的可维护性:
vllm_benchmark_serving/
├── main.py # 统一入口:集成所有功能
├── config.yaml # 配置驱动:灵活的参数管理
├── src/ # 核心源码
│ ├── core/ # 压测引擎
│ ├── backends/ # 后端适配层
│ ├── datasets/ # 数据集处理
│ ├── aggregation/ # 结果聚合
│ └── visualize/ # 可视化模块
└── results/ # 智能结果管理
├── DeepSeek-R1_20250729_223711/ # 按模型+时间组织
└── aggregate_results.csv # 格式输出
└── chart/ # 可视化
├── comprehensive_dashboard.png/ # 综合仪表板
└── latency_comparison.png # 延迟对比
└── throughput_comparison.png # 吞吐量对比
└── performance_heatmap.png # 性能热力图
└── performance_report.txt # 性能报告
设计亮点:
•统一入口设计:一个main.py
集成批量测试、单次测试、结果聚合和可视化
•配置文件驱动:通过YAML配置文件定义测试参数,支持复杂的参数组合
•智能目录管理:结果按"模型名_时间戳"自动组织,避免文件混乱
•双语输出格式:CSV文件同时包含中英文列名,国际化友好
数据流程
1.配置解析→ 读取YAML配置,生成测试参数矩阵
2.批量执行→ 异步调度多个压测任务,实时收集性能指标
3.结果聚合→ 将分散的JSON结果合并成标准化CSV格式
4.可视化分析→ 自动生成多维度性能分析图表
实战演练:三步完成专业压测
让我们通过一个真实的DeepSeek-R1模型压测案例,看看这个工具的实际效果。
步骤1:环境准备
# 安装依赖
pip install -r requirements.txt
# 启动vLLM服务
vllm serve /data/model/cognitivecomputations/DeepSeek-R1-awq \
--host 0.0.0.0 \
--port 8010 \
--swap-space 16
步骤2:配置测试参数
编辑config.yaml
文件,定义测试场景:
model: "/data/model/cognitivecomputations/DeepSeek-R1-awq"
base_url:"http://localhost:8010"
tokenizer:"/data/model/cognitivecomputations/DeepSeek-R1-awq"
# 测试不同的输入输出长度组合
input_output:
- [512, 512] # 中等长度对话
- [1024, 1024] # 长文本处理
# 测试不同的并发场景
concurrency_prompts:
- [1, 10] # 串行基准测试
- [4, 40] # 中等并发压力
步骤3:一键执行压测
# 执行批量压测
python main.py batch
# 聚合测试结果
python main.py aggregate
# 生成可视化报告
python main.py visualize
结果输出
# 执行批量压测
python main.py batch
=== 开始批量压测 ===
使用配置文件: config.yaml
测试结果将保存到: results/DeepSeek-R1_20250729_223711
正在执行: python3 -m src.core.benchmark_serving --backend vllm --model /data/model/cognitivecomputations/DeepSeek-R1-awq --base-url http://localhost:8010 --tokenizer /data/model/cognitivecomputations/DeepSeek-R1-awq --dataset-name random --percentile-metrics ttft,tpot,itl,e2el --random-input-len 512 --random-output-len 512 --max-concurrency 1 --num-prompts 10 --save-result --result-filename results/DeepSeek-R1_20250729_223711/bench_io512x512_mc1_np10.json
参数组合 io=(512,512), mc=1, np=10 执行完成,结果已保存: results/DeepSeek-R1_20250729_223711/bench_io512x512_mc1_np10.json
正在执行: python3 -m src.core.benchmark_serving --backend vllm --model /data/model/cognitivecomputations/DeepSeek-R1-awq --base-url http://localhost:8010 --tokenizer /data/model/cognitivecomputations/DeepSeek-R1-awq --dataset-name random --percentile-metrics ttft,tpot,itl,e2el --random-input-len 512 --random-output-len 512 --max-concurrency 4 --num-prompts 40 --save-result --result-filename results/DeepSeek-R1_20250729_223711/bench_io512x512_mc4_np40.json
参数组合 io=(512,512), mc=4, np=40 执行完成,结果已保存: results/DeepSeek-R1_20250729_223711/bench_io512x512_mc4_np40.json
正在执行: python3 -m src.core.benchmark_serving --backend vllm --model /data/model/cognitivecomputations/DeepSeek-R1-awq --base-url http://localhost:8010 --tokenizer /data/model/cognitivecomputations/DeepSeek-R1-awq --dataset-name random --percentile-metrics ttft,tpot,itl,e2el --random-input-len 1024 --random-output-len 1024 --max-concurrency 1 --num-prompts 10 --save-result --result-filename results/DeepSeek-R1_20250729_223711/bench_io1024x1024_mc1_np10.json
参数组合 io=(1024,1024), mc=1, np=10 执行完成,结果已保存: results/DeepSeek-R1_20250729_223711/bench_io1024x1024_mc1_np10.json
正在执行: python3 -m src.core.benchmark_serving --backend vllm --model /data/model/cognitivecomputations/DeepSeek-R1-awq --base-url http://localhost:8010 --tokenizer /data/model/cognitivecomputations/DeepSeek-R1-awq --dataset-name random --percentile-metrics ttft,tpot,itl,e2el --random-input-len 1024 --random-output-len 1024 --max-concurrency 4 --num-prompts 40 --save-result --result-filename results/DeepSeek-R1_20250729_223711/bench_io1024x1024_mc4_np40.json
参数组合 io=(1024,1024), mc=4, np=40 执行完成,结果已保存: results/DeepSeek-R1_20250729_223711/bench_io1024x1024_mc4_np40.json
=== 批量压测完成 ===
结果已保存到: results/DeepSeek-R1_20250729_223711
可使用以下命令聚合结果: python main.py aggregate --dir DeepSeek-R1_20250729_223711
# 聚合测试结果
python main.py aggregate
=== 开始聚合结果 ===
使用最新的结果目录: DeepSeek-R1_20250729_223711
可用的结果目录: DeepSeek-R1_20250729_223711
找到 4 个JSON文件进行聚合
已聚合 4 个测试结果 → results/DeepSeek-R1_20250729_223711/aggregate_results_20250730.csv
CSV文件格式:第一行为英文列名,第二行为中文列名,第三行开始为数据
正在生成可视化报告...
✓ 可视化报告生成成功
# 生成可视化报告
python main.py visualize
=== 开始生成可视化报告 ===
使用最新的CSV文件: results/DeepSeek-R1_20250729_223711/aggregate_results_20250730.csv
正在生成可视化报告...
模式: advanced
输入文件: results/DeepSeek-R1_20250729_223711/aggregate_results_20250730.csv
输出目录: charts
✓ 完整版可视化报告生成成功
生成的文件:
- throughput_comparison.png (吞吐量对比)
- latency_comparison.png (延迟对比)
- performance_heatmap.png (性能热力图)
- comprehensive_dashboard.png (综合仪表板)
- performance_report.txt (性能报告)
真实测试结果分析
基于DeepSeek-R1-AWQ模型的实际测试,我们来看看压测工具产生的数据:
测试场景配置
•模型:DeepSeek-R1-AWQ (32B参数)
•测试组合:512x512 和 1024x1024 tokens
•并发配置:1并发和4并发
•总请求数:10-40个请求
关键发现
性能表现趋势:
1.输入长度影响:从512到1024 tokens,首token时间(TTFT)显著增加
2.并发效应:适度并发提升整体吞吐量,但单请求延迟有所增加
3.生成效率:每token输出时间(TPOT)在不同场景下相对稳定
实际应用价值:
• 为生产环境容量规划提供数据支撑
• 识别性能瓶颈,指导模型优化方向
• 建立性能基线,支持版本间对比分析
可视化报告展示
工具自动生成了四类专业图表:
1.吞吐量对比图- 直观展示不同配置下的处理能力
2.延迟对比图- 多维度延迟指标的对比分析
3.性能热力图- 参数组合与性能表现的关联关系
4.综合仪表板- 集成所有关键指标的全景视图
每个图表都采用双语标注,既保证了专业性,又兼顾了可读性。
技术亮点:细节中的匠心
智能结果管理
传统的压测工具往往将结果文件散落在各处,难以管理。我们的工具采用了智能的目录组织策略:
results/
├── DeepSeek-R1_20250729_223711/ # 自动按模型+时间组织
│ ├── bench_io512x512_mc1_np10.json
│ ├── bench_io1024x1024_mc4_np40.json
│ └── aggregate_results_20250730.csv
└── chart/ # 可视化
├── comprehensive_dashboard.png/ # 综合对比图
└── latency_comparison.png # 延迟对比图
└── throughput_comparison.png # 吞吐量对比图
└── performance_heatmap.png # 性能热力图
这种设计让历史测试结果一目了然,支持跨时间的性能对比分析。
throughput_comparisoncomprehensive_dashboardlatency_comparisonperformance_heatmap
使用效果:数据说话
通过在真实项目中的应用,这个压测工具展现出了显著的价值:
效率提升
•测试配置时间:从手工编写脚本的数小时,缩短到配置文件的几分钟
•结果分析时间:从人工整理数据的数十分钟,缩短到自动化的几秒钟
•可视化生成:从使用Excel制图的半小时,缩短到一键生成的瞬间
专业度提升
•指标完整性:从简单的QPS测试,扩展到六大维度的专业分析
•场景覆盖度:支持多种输入输出长度和并发配置的组合测试
•报告专业性:生成符合工业标准的性能分析报告
工作流优化
•标准化流程:建立了统一的压测流程和结果格式
•历史对比:支持不同版本、不同配置之间的性能对比
•团队协作:统一的工具和格式便于团队间的经验分享
扩展性:面向未来的设计
这个压测工具不仅解决了当前的问题,还为未来的扩展预留了空间:
后端适配
• 当前支持vLLM OpenAI兼容API
• 架构设计支持扩展到TGI、DeepSpeed-MII等其他推理框架
• 模块化的后端处理层,新增支持只需实现标准接口
数据集扩展
• 内置支持Random、ShareGPT等数据集
• 提供统一的数据集接口,易于添加自定义数据集
• 支持多模态数据的处理框架
指标扩展
• 当前的六大指标覆盖了主要的性能维度
• 预留了自定义指标的扩展接口
• 支持添加业务相关的专业指标
最佳实践:经验总结
基于实际使用经验,我们总结了一些压测最佳实践:
测试策略
1.预热测试:正式压测前先运行少量请求预热模型
2.梯度加压:从低并发开始,逐步增加观察性能变化
3.多轮验证:每个配置运行多次,取平均值减少随机误差
结果分析
1.基线建立:建立不同场景下的性能基线
2.趋势分析:关注性能指标随负载变化的趋势
3.瓶颈识别:通过多维度指标定位性能瓶颈
工具使用
1.配置管理:使用版本控制管理测试配置
2.结果归档:定期归档测试结果,建立性能历史库
3.自动化集成:将压测集成到CI/CD流程中
结语:让性能测试变得简单而专业
在大模型的世界里,性能不是一个简单的数字,而是用户体验、服务质量和商业价值的综合体现。这个vLLM推理服务压测工具,就像是给大模型装上了专业的性能监控设备——让每一个性能指标都变得可见、可测、可优化。
通过统一的工具链、标准化的流程和专业的分析报告,我们不仅解决了当前的压测需求,更为大模型的性能优化建立了科学的方法论。
项目开源地址: https://github.com/FlyAIBox/llm_benchmark.git
如果你也在为大模型的性能评估而烦恼,不妨试试这个工具。毕竟,在AI的赛道上,只有真正了解自己的性能,才能跑得更快、更稳、更远。
本文转载自萤火AI百宝箱,作者: 萤火AI百宝箱
