Skip to content

TensorRT-LLM

本页速览 NVIDIA 在 TensorRT 之上为 LLM 推理专门打造的扩展,集成 In-Flight Batching、Paged KV Cache、FlashAttention、FP8 等优化,是 H100 上 LLM 推理的旗舰栈。本文拆解 build 流程、调优开关、与 vLLM 的对比与 Triton 部署。

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-fp8

5. 量化支持矩阵

方法位宽TRT-LLM 支持备注
SmoothQuantINT8激活平滑后 W8A8,几乎无损
GPTQINT4配 Marlin kernel
AWQINT4与 vLLM 一致
FP8FP8H100 推荐
INT4 AWQ + FP8 KVINT4 + FP8长上下文首选
INT8 KV cacheINT8非 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_fmhaprefill 阶段 FlashAttentionenable(必开)
--use_paged_context_fmhaprefill 也用 paged KVH100 推荐
--paged_kv_cachepaged KV cacheenable(必开)
--remove_input_padding去除 padding,packed sequenceenable(必开)
--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-8BBF1632~550028 ms
Llama-3-8BFP8 (W8A8)32~1000028 ms
Llama-3-8BINT4 AWQ + FP8 KV32~1200030 ms
Llama-3-70BBF16 (2×H100 TP)32~170075 ms
Llama-3-70BFP8 (1×H100)32~190070 ms
Mixtral-8x22BFP8 (4×H100 TP)32~2000120 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-eagle

EAGLE-3 在 SGLang/vLLM 上的 2–4× 加速,TRT-LLM 也类似。

3. Triton 部署

TRT-LLM 的官方部署形态是 Triton LLM Backend(详见 Triton 推理服务):

models/
└── llama3-8b/
    ├── 1/
    │   └── (TRT-LLM engine 路径)
    └── config.pbtxt

config.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-LLMvLLM
H100 性能1.0–1.3× 略胜基准
A100 性能接近接近
易用性build 流程重、学习曲线高一行起服务
模型支持主流模型覆盖,新模型需等 NVIDIA 适配HuggingFace 即开即用
量化支持FP8 / SmoothQuant / GPTQ / AWQAWQ / GPTQ / FP8 / bitsandbytes
社区生态NVIDIA 主导、企业为主UC Berkeley 主导、社区驱动
结构化输出outlines / xgrammar 集成SGLang 系列更强
多模态支持但相对落后0.5+ 较好
跨硬件NVIDIA onlyNVIDIA 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。

七、局限与边界

  1. 学习曲线高:build 开关几十个、文档分散在各 GitHub issue 里;初学者容易放弃。
  2. Build 时间长:kernel auto-tuning 极慢,CI 必须用 engine 缓存。
  3. 新模型支持滞后:新架构(Mamba、Hyena、新 MoE)落地比 vLLM 慢 1–2 个月。
  4. 绑定 NVIDIA:跨硬件场景不可用,请走 ONNX Runtimellama.cpp
  5. Triton 配置复杂:config.pbtxt 写错易踩坑,需要熟悉 Triton LLM backend 协议。
  6. 闭源组件:核心 plugin 闭源,调试困难。

八、可继续追踪

参考资料