外观
TensorRT-LLM
一、概念定义:NVIDIA 在 LLM 推理上的"官方旗舰"
TensorRT-LLM 是 NVIDIA 于 2023 年公开的 LLM 推理优化库,建立在 TensorRT 之上,专门为大语言模型(decoder-only Transformer)做了深度优化。它的定位可以用一句话概括:NVIDIA 自家工程师在自家 GPU 上、为自家 LLM 推理做的"压榨到极致"的栈。
理解它的位置,要把它放到 NVIDIA 推理栈的全景里:
┌─────────────────────────────────────┐
│ 应用 / 服务(OpenAI 协议、API) │
├─────────────────────────────────────┤
│ Triton LLM Backend(服务化层) │ ← 见 Triton 推理服务
├─────────────────────────────────────┤
│ TensorRT-LLM(LLM 优化层) │ ← 本页主题
│ ├─ In-Flight Batching │
│ ├─ Paged KV Cache │
│ ├─ FlashAttention / FP8 │
│ └─ 平滑量化 / GPTQ / AWQ │
├─────────────────────────────────────┤
│ TensorRT(图优化 / kernel 层) │ ← 见 TensorRT 案例
├─────────────────────────────────────┤
│ CUDA Driver / cuBLAS / cuDNN │
└─────────────────────────────────────┘TensorRT-LLM 与 vLLM 是直接竞争关系——vLLM 是开源社区旗舰,TRT-LLM 是 NVIDIA 官方旗舰。在 H100 上 TRT-LLM 通常略快(1.1–1.3×),但 vLLM 易用性、社区生态、HuggingFace 模型即开即用方面胜出。
二、核心特性
1. In-Flight Batching(同 vLLM continuous batching)
NVIDIA 把 continuous batching 重新命名为 In-Flight Batching(也叫 dynamic batching / iteration-level batching),与 vLLM 是同一思想:
- Prefill 与 Decode 混合调度:每个 step 都可以接收新请求、淘汰已完成请求。
- Chunked prefill:长 prompt 切块,与 decode 混合跑,避免长 prompt 卡死短请求。
- 优先级调度:可设请求优先级,高优请求插队。
详见 批处理与调度。
2. Paged KV Cache
TRT-LLM 也有 paged KV cache(思路同 vLLM 的 PagedAttention,但实现独立)。每张 H100 上的 tensor memory pool 是按 block 管理的,请求按需申请、物理显存紧凑。
名字背后的故事
PagedAttention 是 vLLM 论文里的命名,但分页 KV cache 的思想并非 vLLM 原创——OS 虚拟内存的类比在 2022 年的论文里就出现过。TRT-LLM 与 vLLM 是"并行重新发现同一原理"的关系,二者实现细节不同,TRT-LLM 的 paged KV cache 与 FlashAttention / FP8 集成更紧密。
3. FlashAttention 集成
TRT-LLM 默认启用 FlashAttention 2/3(Hopper 上 FA3),把 attention 的 IO 复杂度从 O(n²) 降到 O(n²/M)(M 是 SRAM 大小)。FlashAttention 详解见 核心论文 与 GPU 优化原理。
传统 attention: S = Q·K^T (n×n 矩阵写 HBM) → P = softmax(S) → O = P·V
HBM 读写: O(n²)
FlashAttention: 把 Q/K/V 切块,在 SRAM 内完成 attention,不写中间矩阵
HBM 读写: O(n²/M)4. FP8:H100 的杀手锏
H100 Hopper 架构原生支持 FP8(E4M3 / E5M2),理论吞吐是 BF16 的 2×。TRT-LLM 支持:
- FP8 权重 + FP8 激活(W8A8):极致吞吐
- FP8 权重 + BF16 激活(W8A16):精度优先
- KV cache FP8:减半 KV cache 显存,长上下文场景必备
bash
# 用 NeMo 框架量化 Llama-3 到 FP8
python examples/llama/quantize.py \
--model_dir /models/Meta-Llama-3-8B \
--dtype float16 \
--qformat fp8 \
--output_dir /models/llama3-8b-fp85. 量化支持矩阵
| 方法 | 位宽 | TRT-LLM 支持 | 备注 |
|---|---|---|---|
| SmoothQuant | INT8 | ✅ | 激活平滑后 W8A8,几乎无损 |
| GPTQ | INT4 | ✅ | 配 Marlin kernel |
| AWQ | INT4 | ✅ | 与 vLLM 一致 |
| FP8 | FP8 | ✅ | H100 推荐 |
| INT4 AWQ + FP8 KV | INT4 + FP8 | ✅ | 长上下文首选 |
| INT8 KV cache | INT8 | ✅ | 非 H100 长上下文用 |
三、Build 流程:模型 → Engine
TRT-LLM 把构建分成两步:先量化 / 转换,再 build engine。
bash
# Step 1: 转换 + 量化(NeMo 或 TRT-LLM 原生工具)
python tools/llm/llama/convert.py \
--model_dir /models/Meta-Llama-3-8B \
--output_dir /models/llama3-8b-trt-checkpoint \
--dtype float16 \
--use_smooth_quant # 或 --quantize_fp8 / --use_gptq / --use_awq
# Step 2: build engine
trtllm-build \
--checkpoint_dir /models/llama3-8b-trt-checkpoint \
--output_dir /models/llama3-8b-engine \
--gemm_plugin float16 \
--gpt_attention_plugin float16 \
--context_fmha enable \
--paged_kv_cache enable \
--remove_input_padding enable \
--use_paged_context_fmha enable \
--max_batch_size 32 \
--max_input_len 2048 \
--max_output_len 512 \
--max_num_tokens 8192 \
--builder_optimization_level 3关键 build 开关
| 开关 | 作用 | 推荐 |
|---|---|---|
--gemm_plugin | 用 TRT-LLM 自实现 GEMM(替代 TRT 默认) | float16 / bfloat16 / fp8 |
--gpt_attention_plugin | 用 FlashAttention 变体 | float16 / fp8 |
--context_fmha | prefill 阶段 FlashAttention | enable(必开) |
--use_paged_context_fmha | prefill 也用 paged KV | H100 推荐 |
--paged_kv_cache | paged KV cache | enable(必开) |
--remove_input_padding | 去除 padding,packed sequence | enable(必开) |
--max_num_tokens | 单 step 最大 token 数 | 决定 batch × seq 上限 |
--builder_optimization_level | 优化深度(0–5) | 3–5,build 时间换性能 |
Build 时间漫长
--builder_optimization_level 5 + 大模型 → build 一次几小时到几十小时。CI 必须用 engine 缓存(按模型 hash 命名),不要每次重新 build。这一点与 TensorRT 一样。
四、性能调优:实测路径
下面给一组 H100 80GB 上的基线(详见 基准测试):
| 模型 | 精度 | 并发 | 吞吐(tokens/s) | 首 token 延迟 |
|---|---|---|---|---|
| Llama-3-8B | BF16 | 32 | ~5500 | 28 ms |
| Llama-3-8B | FP8 (W8A8) | 32 | ~10000 | 28 ms |
| Llama-3-8B | INT4 AWQ + FP8 KV | 32 | ~12000 | 30 ms |
| Llama-3-70B | BF16 (2×H100 TP) | 32 | ~1700 | 75 ms |
| Llama-3-70B | FP8 (1×H100) | 32 | ~1900 | 70 ms |
| Mixtral-8x22B | FP8 (4×H100 TP) | 32 | ~2000 | 120 ms |
对比 vLLM 0.6.x(同硬件):
Llama-3-8B FP8: TRT-LLM ~10000 tokens/s vs vLLM ~8500 tokens/s (1.18×)
Llama-3-70B FP8 TP=2: TRT-LLM ~1900 tokens/s vs vLLM ~1700 tokens/s (1.12×)H100 上 TRT-LLM 略快,A100 / L40 等卡上差距收窄甚至反转。实测前不要预设结论。
五、调优实战:常见开关
1. 长上下文优化
bash
# Llama-3.1-8B-Instruct 128K 上下文
trtllm-build \
... \
--max_input_len 127000 \
--max_output_len 1000 \
--max_num_tokens 131072 \
--context_fmha enable \
--use_paged_context_fmha enable \
--paged_kv_cache enable \
--kv_cache_quant_type INT8 # 或 FP8,减半 KV cache长上下文瓶颈是 KV cache 显存。128K 上下文 Llama-3-8B 的 KV cache ~40GB,FP8 量化后 ~20GB——单卡可放下。
2. Speculative Decoding
TRT-LLM 0.10+ 支持投机解码(详见 投机解码):
bash
# EAGLE 投机解码
trtllm-build \
... \
--speculative_decoding_mode eagle \
--eagle_model_dir /models/llama3-8b-eagleEAGLE-3 在 SGLang/vLLM 上的 2–4× 加速,TRT-LLM 也类似。
3. Triton 部署
TRT-LLM 的官方部署形态是 Triton LLM Backend(详见 Triton 推理服务):
models/
└── llama3-8b/
├── 1/
│ └── (TRT-LLM engine 路径)
└── config.pbtxtconfig.pbtxt:
backend: "tensorrtllm"
max_batch_size: 32
input [
{ name: "input_ids", data_type: TYPE_INT32, dims: [-1] },
{ name: "input_lengths", data_type: TYPE_INT32, dims: [1] },
{ name: "request_output_len", data_type: TYPE_INT32, dims: [-1] },
{ name: "stop_words_list", data_type: TYPE_INT32, dims: [-1] }
]
output [
{ name: "output_ids", data_type: TYPE_INT32, dims: [-1, -1] },
{ name: "output_lengths", data_type: TYPE_INT32, dims: [-1] },
{ name: "cum_log_probs", data_type: TYPE_FP32, dims: [-1] }
]
parameters: {
key: "decoder_model_path"
value: { string_value: "/models/llama3-8b/engine" }
}
parameters: {
key: "max_beam_width"
value: { string_value: "1" }
}
parameters: {
key: "TRTLLM_Batch_scheduler_policy"
value: { string_value: "max_utilization" }
}六、与 vLLM 的对比
| 维度 | TensorRT-LLM | vLLM |
|---|---|---|
| H100 性能 | 1.0–1.3× 略胜 | 基准 |
| A100 性能 | 接近 | 接近 |
| 易用性 | build 流程重、学习曲线高 | 一行起服务 |
| 模型支持 | 主流模型覆盖,新模型需等 NVIDIA 适配 | HuggingFace 即开即用 |
| 量化支持 | FP8 / SmoothQuant / GPTQ / AWQ | AWQ / GPTQ / FP8 / bitsandbytes |
| 社区生态 | NVIDIA 主导、企业为主 | UC Berkeley 主导、社区驱动 |
| 结构化输出 | outlines / xgrammar 集成 | SGLang 系列更强 |
| 多模态 | 支持但相对落后 | 0.5+ 较好 |
| 跨硬件 | NVIDIA only | NVIDIA only(同) |
| Triton 集成 | 原生 LLM Backend | 通过 vLLM Triton backend |
选择决策
- H100 集群、追求极致:先试 TRT-LLM,实测胜出选它;差异不大则用 vLLM(易用性优势)。
- A100 / L40 / T4:vLLM 通常更省心。
- 快速 PoC、中小团队:vLLM。
- NVIDIA 合作伙伴 / 企业生产:TRT-LLM + Triton 全栈,配合 NVIDIA 商业支持。
- 结构化输出 / Agent:考虑 SGLang 而非 TRT-LLM。
七、局限与边界
- 学习曲线高:build 开关几十个、文档分散在各 GitHub issue 里;初学者容易放弃。
- Build 时间长:kernel auto-tuning 极慢,CI 必须用 engine 缓存。
- 新模型支持滞后:新架构(Mamba、Hyena、新 MoE)落地比 vLLM 慢 1–2 个月。
- 绑定 NVIDIA:跨硬件场景不可用,请走 ONNX Runtime 或 llama.cpp。
- Triton 配置复杂:config.pbtxt 写错易踩坑,需要熟悉 Triton LLM backend 协议。
- 闭源组件:核心 plugin 闭源,调试困难。
八、可继续追踪
- 概念页:批处理与调度、显存带宽、量化、算子融合、图优化原理、GPU 优化原理、延迟与吞吐、模型服务化
- 案例页:TensorRT、vLLM、投机解码、Triton 推理服务、分布式推理
- 论文:核心论文、论文路线图、前沿进展
- 实践页:引擎对比、调优实践、基准测试、避坑指南
- 资源页:硬件入门、基准集合、Awesome 集合
参考资料
- NVIDIA. TensorRT-LLM 官方文档 — 入口
- NVIDIA. TensorRT-LLM GitHub — 源码与示例
- NVIDIA. Deploying LLMs with TensorRT-LLM, Triton and vLLM(GTC 2024) — 官方对比
- Dao et al. FlashAttention-2(2023) — FA2 论文
- Xiao et al. SmoothQuant: Accurate and Efficient Post-Training Quantization for LLMs(ICML 2023) — SmoothQuant
- Xiao et al. Efficient Generative LLM Inference Using Phase Prediction(ISCA 2024) — In-Flight Batching 工程论文
- Cai et al. Medusa(ICML 2024) — TRT-LLM 也支持的投机解码
- Li et al. EAGLE-3(2025) — 最新投机解码