TensorRT-LLM 部署与性能压测实战

TensorRT-LLM 部署与性能压测实战记录(Qwen2.5-7B-Instruct)

一、测试背景与目标

在完成 vLLM 框架的性能压测后,本次转向 NVIDIA 官方推理框架 TensorRT-LLM,在 ModelScope 免费实例(A10 22GB 显存)上部署 Qwen2.5-7B-Instruct 模型,并使用 Locusttrtllm-bench 两种工具进行性能测试。

核心目标

  1. 掌握 TensorRT-LLM 的安装与部署流程。
  2. 解决部署过程中的常见报错与依赖冲突。
  3. 使用 Locust 进行客户端 HTTP 层压测。
  4. 使用 trtllm-bench 获取服务端权威性能基准数据。
  5. 对比两种工具的结果差异,定位性能瓶颈。

二、环境准备与 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 长尾消失

关键结论

  1. 统一请求长度让延迟分布高度集中(P50 到 Max 仅差 11ms),消除了长尾。
  2. 扩大数据量让 GPU 持续满载,吞吐量提升 7 倍。
  3. 当前瓶颈max_num_tokens=2048 限制了实际批处理能力(16 个请求需要约 3300 tokens 空间),导致请求只能串行处理,延迟维持在 6.8 秒。

五、两种工具对比分析

工具 优势 劣势 适用场景
Locust 灵活,可模拟复杂业务逻辑(多轮对话、流式响应),支持自定义指标(TTFT) 需自行编写脚本,指标计算靠自定义 模拟真实用户行为、业务场景测试
trtllm-bench 服务端权威数据,支持 TTFT/TPOT/Goodput,数据集灵活,报告详尽 无法测试 HTTP 服务层,配置稍复杂 深度性能评测、SLO 达标分析

最佳实践:先用 trtllm-bench 测出引擎的极限性能,再用 Locust 验证部署后服务的实际表现。

六、核心发现与生产建议

6.1 核心发现

  1. TensorRT-LLM 的 PyTorch 后端不再需要引擎编译,直接加载 HuggingFace 格式模型,部署流程大幅简化。
  2. --max_batch_size 是性能的关键:设得太小会导致严重排队(64 并发下 TTFT 19 秒),设得太大可能导致 OOM。
  3. A10 显存限制了 KV Cache 大小:模型权重占 14.19GB,KV Cache 仅剩 6.19GB,max_num_tokens 被限制在 2048,这是延迟偏高的根本原因。
  4. 统一请求长度能显著改善延迟分布:从混合长度(P90 16.4s)到统一长度(P90 6.8s),长尾延迟彻底消失。

6.2 生产建议

  1. Locust 并发数:建议控制在 max_batch_size 的 1-2 倍(如 8-16),避免过度排队。
  2. 输出长度:建议控制在 100-200 tokens,延迟会显著降低。
  3. 显存优化:若需更高并发,建议启用 --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。

posted @ 2026-09-22 10:00  xzy186  阅读(3)  评论(0)    收藏  举报