TensorRT-LLM 部署与性能压测实战
TensorRT-LLM 部署与性能压测实战记录(Qwen2.5-7B-Instruct)
一、测试背景与目标
在完成 vLLM 框架的性能压测后,本次转向 NVIDIA 官方推理框架 TensorRT-LLM,在 ModelScope 免费实例(A10 22GB 显存)上部署 Qwen2.5-7B-Instruct 模型,并使用 Locust 和 trtllm-bench 两种工具进行性能测试。
核心目标:
- 掌握 TensorRT-LLM 的安装与部署流程。
- 解决部署过程中的常见报错与依赖冲突。
- 使用 Locust 进行客户端 HTTP 层压测。
- 使用 trtllm-bench 获取服务端权威性能基准数据。
- 对比两种工具的结果差异,定位性能瓶颈。
二、环境准备与 TensorRT-LLM 部署
2.1 基础环境
- 实例:ModelScope 免费实例(A10 GPU,22.18GB 显存,8核 32GB 内存)
- 预装镜像:
ubuntu22.04-cuda13.0.3-py312-torch2.13.0-1.40.0 - Python 版本:3.12
2.2 安装 TensorRT-LLM
# 创建独立虚拟环境
conda create -n tensorrt_llm python=3.12 -y
conda activate tensorrt_llm
# 安装 TensorRT-LLM
pip install tensorrt_llm
# 验证安装
python -c "import tensorrt_llm; print(tensorrt_llm.__version__)"
# 输出:1.2.1
2.3 踩坑记录与解决
| 问题 | 报错信息 | 解决方案 |
|---|---|---|
| 依赖冲突 | tensorrt-llm requires transformers==4.57.3, but you have 4.56.2 |
执行 pip install transformers==4.57.3 |
| cache_dir 参数移除 | Error: No such option '--cache_dir' |
TensorRT-LLM 1.2 版本已移除该参数,无需指定 |
| 本地路径不被 trtllm-bench 识别 | HFValidationError: Repo id must be in the form 'repo_name' |
使用 --model_path 参数单独指定本地路径 |
2.4 启动 trtllm-serve 服务
trtllm-serve /mnt/workspace/model/Qwen2.5-7B-Instruct \
--host 0.0.0.0 \
--port 8000 \
--max_batch_size 4 \
--max_seq_len 2048
启动成功后,日志显示:
INFO: Started server process [19480]
INFO: Waiting for application startup.
INFO: Application startup complete.
三、Locust 压测过程
3.1 配置 Locust 脚本
沿用 vLLM 阶段的 locustfile.py,修改 model 参数为本地路径:
stream = self.client.chat.completions.create(
model="/mnt/workspace/model/Qwen2.5-7B-Instruct",
messages=[{"role": "user", "content": "你好"}],
stream=True,
max_tokens=2000
)
3.2 压测执行与结果
locust -f locustfile.py --host http://localhost:8000/v1
64 并发测试结果(关键数据):
| 指标 | 数值 | 说明 |
|---|---|---|
| TTFT 中位数 | 19,000 ms | 严重排队,体验极差 |
| TTFT P95 | 20,000 ms | 长尾延迟高 |
| Current RPS | 3 | 吞吐量偏低 |
| # Fails | 0 | 无报错,服务稳定 |
3.3 核心发现
64 并发下 TTFT 高达 19 秒,根本原因是 --max_batch_size 4 限制了 GPU 单批次最多处理 4 个请求。64 个并发请求只能排队等待,每次放 4 个进去计算,导致大部分请求等待时间极长。
结论:Locust 并发数应控制在 max_batch_size 附近(如 4-8),否则会造成严重的排队延迟。
四、trtllm-bench 压测过程
4.1 制作基准数据集
trtllm-bench 要求数据集为 JSONL 格式,且必须包含 task_id 字段:
cat > /mnt/workspace/model/synthetic_dataset.txt << 'EOF'
{"task_id": 1, "prompt": "你好,请简单介绍一下你自己。", "output_tokens": 200}
{"task_id": 2, "prompt": "请用一句话解释量子纠缠。", "output_tokens": 200}
{"task_id": 3, "prompt": "帮我写一封道歉信。", "output_tokens": 200}
...
EOF
可以使用下面的脚本快速生成200条
import json
prompts = [
"你好,请简单介绍一下你自己。",
"请用一句话解释量子纠缠。",
"帮我写一封因为物流太慢给客户的道歉信。",
"详细解释一下Transformer架构。",
"我想买一台轻薄本,预算6000,推荐几款。",
"请介绍一下人工智能的发展历史。",
"如何学习Python编程?",
"解释一下什么是区块链技术。",
"写一篇关于环保的短文。",
"请介绍一下中国的四大发明。",
]
with open('/mnt/workspace/model/synthetic_dataset.txt', 'w', encoding='utf-8') as f:
for i in range(200):
prompt = prompts[i % len(prompts)]
data = {
"task_id": i + 1,
"prompt": prompt,
"output_tokens": 200 # 统一长度
}
f.write(json.dumps(data, ensure_ascii=False) + '\n')
print("数据集已生成,共 200 条")
4.2 执行 trtllm-bench
trtllm-bench \
--model Qwen/Qwen2.5-7B-Instruct \
--model_path /mnt/workspace/model/Qwen2.5-7B-Instruct \
throughput \
--dataset /mnt/workspace/model/synthetic_dataset.txt \
--backend pytorch \
--report_json /mnt/workspace/model/benchmark_results.json \
--concurrency 16 \
--max_batch_size 16 \
--max_seq_len 2048
4.3 压测结果对比
| 指标 | 调整前(5条,混合长度) | 调整后(200条,统一200 tokens) | 变化 |
|---|---|---|---|
| Request Throughput | 0.3053 req/s | 2.2476 req/s | 提升 7.4 倍 |
| Total Output Throughput | 65.94 tokens/s | 449.52 tokens/s | 提升 6.8 倍 |
| P50 延迟 | 6,625 ms | 6,857 ms | 持平 |
| P90 延迟 | 16,378 ms | 6,863 ms | 大幅下降 |
| Max 延迟 | 16,378 ms | 6,868 ms | 大幅下降 |
| P90 与 Max 差值 | 约 10,000 ms | 仅 5 ms | 长尾消失 |
关键结论:
- 统一请求长度让延迟分布高度集中(P50 到 Max 仅差 11ms),消除了长尾。
- 扩大数据量让 GPU 持续满载,吞吐量提升 7 倍。
- 当前瓶颈:
max_num_tokens=2048限制了实际批处理能力(16 个请求需要约 3300 tokens 空间),导致请求只能串行处理,延迟维持在 6.8 秒。
五、两种工具对比分析
| 工具 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| Locust | 灵活,可模拟复杂业务逻辑(多轮对话、流式响应),支持自定义指标(TTFT) | 需自行编写脚本,指标计算靠自定义 | 模拟真实用户行为、业务场景测试 |
| trtllm-bench | 服务端权威数据,支持 TTFT/TPOT/Goodput,数据集灵活,报告详尽 | 无法测试 HTTP 服务层,配置稍复杂 | 深度性能评测、SLO 达标分析 |
最佳实践:先用 trtllm-bench 测出引擎的极限性能,再用 Locust 验证部署后服务的实际表现。
六、核心发现与生产建议
6.1 核心发现
- TensorRT-LLM 的 PyTorch 后端不再需要引擎编译,直接加载 HuggingFace 格式模型,部署流程大幅简化。
--max_batch_size是性能的关键:设得太小会导致严重排队(64 并发下 TTFT 19 秒),设得太大可能导致 OOM。- A10 显存限制了 KV Cache 大小:模型权重占 14.19GB,KV Cache 仅剩 6.19GB,
max_num_tokens被限制在 2048,这是延迟偏高的根本原因。 - 统一请求长度能显著改善延迟分布:从混合长度(P90 16.4s)到统一长度(P90 6.8s),长尾延迟彻底消失。
6.2 生产建议
- Locust 并发数:建议控制在
max_batch_size的 1-2 倍(如 8-16),避免过度排队。 - 输出长度:建议控制在 100-200 tokens,延迟会显著降低。
- 显存优化:若需更高并发,建议启用
--quantization fp8或使用更大显存的 GPU(如 A100 40GB+)。
七、总结
本次测试完整走通了 TensorRT-LLM 从部署到压测的全流程,并对比了 Locust 和 trtllm-bench 两种工具的特点。虽然 A10 的显存限制了性能上限,但通过调整数据集和参数,我们成功将吞吐量提升了 7 倍,并消除了长尾延迟。这些实战经验为后续在生产环境中部署和调优 TensorRT-LLM 提供了重要参考。
测试环境:ModelScope 免费实例,A10 22.18GB 显存,TensorRT-LLM 1.2.1,Qwen2.5-7B-Instruct。
测试工具:Locust,trtllm-bench。
浙公网安备 33010602011771号