TensorRT-LLM 部署前沿大模型
本册覆盖 TensorRT-LLM 1.4.0rc2 的完整部署链路:参数语义、显存与 KV 计算、并行拓扑、逐模型可复制命令、调优方法与故障排查。
00导读
TensorRT-LLM 的定位
2026 年 TensorRT-LLM 的产品形态已经和早期完全不同。它不再是「先 build 引擎再 serve」的 AOT 流程,而是转向了 PyTorch backend + JIT 编译:
trtllm-serve直接加载 HuggingFace 格式的 checkpoint,启动时即时编译内核- 配置通过 YAML 文件传入(
--config config.yml),而不是trtllm-build的一大串参数 - 老的
trtllm-build工作流仍然存在,但新模型的 Deployment Guide 全部基于trtllm-serve
这意味着部署体验大幅简化,但也带来一个新问题:首次启动非常慢(要编译内核、autotune、捕获 CUDA Graph),而且镜像版本与模型支持强绑定。
数据基准
| 组件 | 基线 | 说明 |
|---|---|---|
| TensorRT-LLM | 1.4.0rc2.post1 | 2026-10-28,最新 rc |
| 稳定版 | 1.2.1 | 2026-04-20 |
| Python | ≥ 3.10, < 4 | 官方 wheel 要求 |
| CUDA Driver | ≥ 575(Blackwell)/ ≥ 580(GB300) | 见各模型指南 |
| 容器 | nvcr.io/nvidia/tensorrt-llm/release:<tag> | 推荐直接用容器 |
NGC 上带 rcN 后缀的是每周从 main 发布、含最新模型支持的版本;不带后缀的是每月 QA 过的稳定版。要跑新模型,用 rc 版。
三个必须先建立的心智模型
① 它是「内核最优」而非「易用最优」的引擎。 TensorRT-LLM 的价值在于 NVIDIA 手写的融合内核(TRTLLM-GEN、XQA、DeepGEMM、MLA 专用 kernel)。这些内核在 Blackwell 上通常能比通用实现快 20%–50%,代价是只支持验证过的模型与硬件组合。
② 并行配置散落在 YAML 里,不在命令行。 tensor_parallel_size / enable_attention_dp / moe_expert_parallel_size 全部写在 YAML。命令行只保留 --tp_size 这类快捷参数,但混用时以 YAML 为准。
③ free_gpu_memory_fraction 是显存闸门。 它的含义是「模型加载后,剩余显存中拿出多少比例做 KV Cache」。注意是剩余显存的比例,不是总量的比例。这和 vLLM 的 gpu_memory_utilization 语义完全不同。
012026 的部署格局
变化一:模型支持以「验证矩阵」形式给出
TensorRT-LLM 不像 vLLM 那样追求「什么模型都能跑」,而是给出明确的验证列表。截至 2026-11,官方 Deployment Guide 覆盖:
| 模型 | 指南 | 验证硬件 |
|---|---|---|
| GLM-5 / 5.2 / 5.3 | ✅ | 8× B200,8× GB300 |
| Kimi-K3 | ✅ | GB300 NVL(DEP16 / TEP16 / TEP8) |
| Qwen3.5 / Qwen3.8 | ✅ | B200 / B300 / GB200 / GB300 |
| MiniMax-M3 | ✅ | Blackwell |
| gpt-oss | ✅ | Blackwell / Hopper |
| Nemotron-3 系列 | ✅ | Blackwell |
| Qwen3.8-Flash-Next | ✅ | Blackwell |
没有出现在列表里的模型,不保证能跑。这是选型时的第一条约束。
变化二:MoE 并行成为核心议题
TensorRT-LLM 把 MoE 并行拆成三层:
MoE 执行模式 ├─ TP 每个专家的权重在所有 GPU 上切片,每卡看到所有 token ├─ EP 每个专家的完整权重在单卡,每卡只看到路由到本地专家的 token └─ ETP 混合:每卡存一部分专家(EP),再对这些权重切片(TP)
并引入 Wide-EP:通过专家复制(expert replication)和 EPLB(Expert Parallelism Load Balancer)解决「热专家」问题——某些专家被路由到的 token 远多于其他专家,导致 EP rank 间负载严重不均。
变化三:多模态与混合注意力成为常态
2026 年的旗舰模型大量使用:
- MLA + DSA(GLM-5.3):复用 DeepSeek V3.2 的
DeepseekV32Attention - KDA + 稀疏 MLA(Kimi-K3):93 层中大部分是线性注意力,每 4 层一次全 MLA
- GDN + GQA(Qwen3.5):3 层门控 delta 网络 + 1 层 GQA 交替
这带来一个新概念:混合模型的「状态池」。Kimi-K3 的每个 KDA 层为每条序列保留常数大小的循环状态,这部分不在分页 KV 池里,需要单独预留显存。官方在 Kimi-K3 指南里把 free_gpu_memory_fraction 设为 0.25 就是为此。
2026 前沿模型一览
| 模型 | 总参 / 激活 | 上下文 | 注意力 | 精度 | TRT-LLM 最低版本 |
|---|---|---|---|---|---|
| GLM-5.3 | 743B / 39B | 1,048,576 | MLA + DSA | FP8 / NVFP4 / W4A8 | 1.3.0rc25 |
| Kimi-K3 | 2.8T / 16 of 896 | 1,048,576 | KDA + 稀疏 MLA | MXFP4 | 源码构建 |
| Qwen3.5-397B-A17B | 397B / 17B | 262,144 | GDN + GQA | NVFP4 / BF16 | 1.4.0rc2 |
| Qwen3.8-2.4T-A95B | 2.4T / 95B | — | GDN + GQA | FP8 | 1.4.0rc2 |
| MiniMax-M3 | 427B / 26B | 1,048,576 | MSA 块稀疏 | BF16 / MXFP8 / NVFP4 | Blackwell 镜像 |
| gpt-oss-120b | 117B / 5.1B | 131,072 | 滑窗 + 全注意力 | MXFP4 | 1.3.x |
02显存预算与 KV 计算
显存划分:与 vLLM 的关键差异
┌──────────────────────────────────────────────────────────┐
│ Weights │ Runtime / Workspace │ KV Cache │ Graph │
└──────────────────────────────────────────────────────────┘
└──── free_gpu_memory_fraction 作用于这段 ────┘free_gpu_memory_fraction 的语义是:
KV_cache_bytes = (GPU_total - model_weights - runtime_overhead) × free_gpu_memory_fraction
不是 GPU_total × fraction。理解错这个会差出一倍。
官方建议:
- 默认 0.75
- OOM 时降到 0.6 或 0.7
- 混合模型(含状态池)可能低到 0.25(如 Kimi-K3)
KV Cache 计算
公式与 vLLM 相同,因为底层都是分页 KV:
MHA / GQA / MQA(统一公式)
三种架构共用同一个公式,差异只在 n_kv_heads:
KV_bytes_per_token = 2 × n_layers × n_kv_heads × head_dim × dtype_bytes
| 架构 | n_kv_heads | 相对 MHA |
|---|---|---|
| MHA | = n_heads | 1× |
| GQA | = n_heads / g | 1/g |
| MQA | = 1 | 1/n_heads |
GQA 不是「另一种算法」,而是把 KV head 数除以分组比 g。Llama-3-70B 是 64 q-heads / 8 kv-heads,KV 只有 MHA 的 1/8。
TRT-LLM 官方明确说明,GQA / MQA / MLA 在 num_heads < tensor_parallel_size 时 KV-cache 会在每个 GPU 上复制,此时上面的公式要乘 TP 倍数。
MLA
KV_bytes_per_token = n_layers × (kv_lora_rank + qk_rope_head_dim) × dtype_bytes
混合注意力(额外项)
Kimi-K3 的 KDA 层:
KDA_state_bytes = n_kda_layers × d_state × dtype_bytes × batch
↑ 每条序列一份,不随长度增长Qwen3.5 的 GDN 层同理,由 kv_cache_config.mamba_ssm_cache_dtype 控制精度(可选 auto / float16 / bfloat16 / float32)。
tokens_per_block 的选择Kimi-K3 官方固定用 64。原因写在指南里:早期版本需要这个页大小来避免一个不支持 96 个 query head 的 MLA fallback 路径。
怎么确认显存够不够
TensorRT-LLM 启动后会在日志里打印 KV cache 的分配情况。查找关键字:
[TRT-LLM] KV cache size: ... tokens [TRT-LLM] Max batch size: ...
如果启动时 OOM,按这个顺序调:
- 降
kv_cache_config.free_gpu_memory_fraction(0.75 → 0.6 → 0.5) - 降
--max_num_tokens(8192 → 4096 → 3072) - 降
--max_batch_size(128 → 64 → 32) - 降
cuda_graph_config.max_batch_size - 最后才考虑降
--max_seq_len
官方建议设 PYTORCH_ALLOC_CONF=max_split_size_mb:8192 缓解碎片导致的 OOM。
03架构与参数作用点
三层结构
┌─────────────────────────────────────────────────────────┐
│ trtllm-serve(OpenAI 兼容 HTTP Server) │
│ · /v1/chat/completions /v1/completions /v1/responses │
│ · /health /metrics /version /start_profile │
│ · tool_parser / reasoning_parser │
└────────────────────────┬────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────┐
│ LLM API(PyTorch backend) │
│ · 请求调度、KV 管理、CUDA Graph │
│ · TorchLlmArgs:YAML 里的所有配置 │
└────────────────────────┬────────────────────────────────┘
│
┌────────────────────────▼────────────────────────────────┐
│ Executor(MPI / Ray / 本地) │
│ · TP / PP / EP / Attention-DP │
│ · 每 rank 一个进程,各自持有分片权重与 KV │
└─────────────────────────────────────────────────────────┘一次请求的路径
① HTTP 接入 trtllm-serve 的 FastAPI
↓
② 输入处理 分词 → chat template(Jinja)
↓ --tool_parser / --reasoning_parser
③ 调度 token 预算分配 → chunked prefill(若开启)
↓ --max_num_tokens / enable_chunked_prefill
④ KV 分配 从分页池取 block
↓ kv_cache_config.tokens_per_block
⑤ 前向 融合内核(TRTLLM-GEN / XQA / DeepGEMM)
↓ moe_config.backend / attention backend
⑥ 输出 反分词 → 流式返回
↓ stream_intervalYAML 与命令行的分工
命令行(trtllm-serve 直接参数) ├─ --tp_size / --pp_size / --ep_size 并行规模 ├─ --max_batch_size 最大 batch ├─ --max_num_tokens 单步 token 上限 ├─ --host / --port ├─ --served_model_name ├─ --tool_parser / --reasoning_parser └─ --config <yaml> 其余全部 YAML(config.yml) ├─ cuda_graph_config ├─ kv_cache_config ├─ moe_config ├─ speculative_config ├─ enable_chunked_prefill ├─ enable_attention_dp ├─ moe_expert_parallel_size / moe_tensor_parallel_size ├─ cache_transceiver_config(PD 分离) └─ stream_interval
YAML 里的值会覆盖命令行的同名快捷参数。混用时要小心。例如 YAML 里写 tensor_parallel_size: 16,命令行再传 --tp_size 8 会报冲突。
04核心参数详解
4.1并行
| 参数(YAML) | 命令行快捷 | 含义 |
|---|---|---|
tensor_parallel_size | --tp_size | TP 宽度。MoE 模型下 moe_tensor_parallel_size × moe_expert_parallel_size 必须等于它 |
pipeline_parallel_size | --pp_size | PP 宽度 |
moe_expert_parallel_size | --ep_size | MoE 层的 EP 宽度 |
moe_tensor_parallel_size | — | MoE 层的 TP 宽度(混合 ETP 时用) |
enable_attention_dp | — | true 时注意力层走数据并行(权重复制、KV 分区) |
cp_config.cp_size | — | 上下文并行宽度(长序列) |
moe_tensor_parallel_size × moe_expert_parallel_size == tensor_parallel_size。例:TP8 可以配 moe_tp=4, moe_ep=2,或 moe_tp=1, moe_ep=8,或 moe_tp=8, moe_ep=1。
4.2KV Cache
kv_cache_config:
enable_block_reuse: false # 前缀复用(等价 vLLM 的 prefix caching)
free_gpu_memory_fraction: 0.75 # 剩余显存的多少给 KV
dtype: auto # KV 精度:auto / fp8 / ...
tokens_per_block: 64 # 块大小
mamba_ssm_cache_dtype: auto # 混合模型的 SSM 状态精度
mamba_state_config:
periodic_snapshot_interval: 0 # KDA 状态的快照间隔(0 = 关闭)| 字段 | 要点 |
|---|---|
enable_block_reuse | 开启后,具有相同前缀的请求可复用 KV。多轮对话/Agent 必开。注意:多模态模型目前不兼容 kv_cache_reuse |
free_gpu_memory_fraction | 见 02 章 |
dtype | fp8 可让 KV 减半,通常无损 |
tokens_per_block | Kimi-K3 固定 64;GLM 系常用 32/64 |
mamba_ssm_cache_dtype | Qwen3.5 的 GDN 状态精度。bfloat16 比 float32 省一半 |
periodic_snapshot_interval | 混合模型开 block reuse 时必须设(如 256),否则前缀命中无法恢复循环状态 |
Kimi-K3 / Qwen3.5 这类含线性注意力的模型,只有在快照边界上才暴露可复用的前缀。设 periodic_snapshot_interval: 0(默认)时,enable_block_reuse: true 几乎不生效。
4.3CUDA Graph
cuda_graph_config: enable_padding: true # 把 batch padding 到最近的捕获尺寸 max_batch_size: 128 # 最大捕获 batch,应与 --max_batch_size 一致
enable_padding: true能显著提升性能,但会浪费一些计算max_batch_size设得比--max_batch_size小,超出的 batch 会回退到 eager- CUDA Graph 吃显存,与
free_gpu_memory_fraction此消彼长
4.4MoE 后端
moe_config: backend: DEEPGEMM # CUTLASS(默认)/ DEEPGEMM / TRTLLM / ... max_num_tokens: 33024 # MoE 层的 token 上限(可与全局不同) use_low_precision_moe_combine: true # EP combine 用低精度载荷
必须显式指定:GLM-5 指南明确写了「默认 MoE backend 是 CUTLASS,对 GLM-5 你必须显式设置」。
| 模型 | 精度 | 硬件 | 必须的 backend |
|---|---|---|---|
| GLM-5 / 5.3 | FP8 | B200 / GB200 | DEEPGEMM |
| GLM-5 / 5.3 | NVFP4 | B200 / GB200 | TRTLLM(DEEPGEMM 不支持 NVFP4) |
| Kimi-K3 | MXFP4 | GB300 | 自动(moe-backend auto) |
4.5投机解码
speculative_config: decoding_type: MTP # MTP / EAGLE / ... num_nextn_predict_layers: 1 # MTP 层数 max_draft_len: 3 # 草稿长度(MTP3 场景设 3)
| 模型 | 支持的方法 | 备注 |
|---|---|---|
| GLM-5 / 5.3 | MTP | num_nextn_predict_layers 只能为 1 |
| Qwen3.5 / 3.8 | MTP | 内置 1 个 recurrent MTP 模块 |
| Kimi-K3 | Suffix automaton | 聚合与分离模式均支持 |
| DeepSeek 系 | MTP | TRT-LLM 有专门的 MTP 优化(relaxed acceptance) |
(GLM-5 指南明确写了)。要用 MTP 就选 FP8。
4.6PD 分离
cache_transceiver_config: backend: NIXL
所有 context / generation worker 必须使用相同的 cache_transceiver_config。context worker 额外设 disable_overlap_scheduler: true。
# disagg_config.yaml(orchestrator)
hostname: localhost
port: 8000
context_servers:
num_instances: 1
urls:
- "localhost:8001"
generation_servers:
num_instances: 1
urls:
- "localhost:8002"trtllm-serve disaggregated -c disagg_config.yaml4.7解析器
| 参数 | 说明 |
|---|---|
--tool_parser | qwen3_coder、glm47、kimi_k3、deepseek_v3 等。auto 会按模型类型选 |
--reasoning_parser | qwen3_5、glm45、deepseek_r1、nemotron-v3 等 |
绑定了 enable_thinking 的客户端需要改造。5.3 无法关闭思考,改用 reasoning_effort(low/high/max,默认 max),另有 clear_thinking 控制多轮是否保留历史推理。
05并行策略选型
本引擎的推理拓扑与 KV 存放
为便于阅读,下图使用小规模设备组解释机制,不代表旗舰模型能装入这些设备。
全局 tensor_parallel_size 与 MoE 内的 moe_tensor_parallel_size / moe_expert_parallel_size 不同,后两者乘积等于前者。enable_attention_dp 改变注意力布局;ETP、EPLB 副本不包含在下列纯 TP/EP 示例内。
图中 moe_tp / moe_ep / attention_dp 为排版缩写,分别对应 YAML 的 moe_tensor_parallel_size、moe_expert_parallel_size、enable_attention_dp,不能把缩写直接写入配置文件。
官方依据:TensorRT-LLM 并行与配置文档。图示策略存在不代表某个模型、精度、硬件组合已实测。
六种并行
TP 张量并行:切权重,每层 all-reduce PP 流水并行:按层切,stage 间传激活 DP 数据并行:复制模型,各跑各的请求 EP 专家并行:专家分散,all-to-all CP 上下文并行:长序列切分 Wide-EP 宽专家并行:EP + 专家复制 + EPLB 负载均衡
注意力层与 MoE 层要分开配置
TensorRT-LLM 的一个关键设计:注意力层和 FFN/MoE 层的并行方式可以不同。
# 注意力走 DP(KV 分区),MoE 走 EP tensor_parallel_size: 16 enable_attention_dp: true moe_expert_parallel_size: 16
这正是 Kimi-K3 的 DEP16 配置:注意力数据并行到 16 个 rank,896 个专家分片到 16 个 EP rank。
三种 MoE 执行模式对比
| 模式 | 每卡持有 | 每卡看到 | 通信 | 适合 |
|---|---|---|---|---|
| TP | 每个专家的切片 | 所有 token | all-reduce | 小 EP、低延迟 |
| EP | 部分专家的完整权重 | 只看到路由来的 token | all-to-all(少量) | 大规模、高吞吐 |
| ETP | 部分专家的切片 | 部分 token | all-to-all + all-reduce | 折中 |
Wide-EP 解决什么问题
大规模 MoE 有两个固有问题:
- 负载不均:「热专家」接收的 token 远多于冷专家
- 通信开销:EP 规模越大,all-to-all 越贵
Wide-EP 的解法:
- 专家槽位与专家解耦:同一专家的多个副本可以放在不同 GPU
- 动态放置:按负载模式调整专家位置
- EPLB:离线预计算 或 在线动态调整
配置示例(Qwen3.8 高吞吐):
# qwen3.8-ep32-static544.yaml # 544 个全局槽位,重复的 expert id 表示热专家的副本 # layer_updates_per_iter: 0 保持静态
官方提醒:这个 544 槽位的放置方案只对 Qwen3.8-2.4T-A95B + EP32 + 特定 MTP 模式 + 特定流量分布有效。任何输入变化都要重新生成。
选型决策
模型在官方验证列表里?
├─ 否 → 换 vLLM / SGLang,不要硬上
└─ 是 → 单机能装下?
├─ 能 → 需要最高吞吐?
│ ├─ 是 → DP(attention)+ EP,大 batch
│ └─ 否 → TP,小 batch,低延迟
└─ 不能 → 多节点
├─ 跨机 NVLink(GB200/GB300 NVL)→ TP + EP
└─ 普通 IB → TP(单机)+ PP(跨机)PD 分离的拓扑
官方 Qwen3.5 GB300 示例:
GB300 NVL72,4 GPU / tray ├─ 1P1D:1 个 prefill GPU + 2 个 decode GPU(3 卡) ├─ 每 rank 预留 128 GiB host KV cache ├─ 整节点 4 rank 时预留 512 GiB host 内存 └─ 需要 etcd + NATS(Dynamo 编排)
GB300 每 4-GPU 节点 840 GiB 主机内存,4 rank 全占时 512 GiB 给 KV cache,剩下 328 GiB 要装权重加载、staging、OS。扩 worker 前先算这笔账。
06逐模型实战配置
6.1通用起手式
# 1) 拉镜像 docker run --rm -it \ --ipc=host --gpus all \ -p 8000:8000 \ -v $HOST_MODELS_DIR:/models \ --name tensorrt_llm \ nvcr.io/nvidia/tensorrt-llm/release:1.4.0rc2 \ /bin/bash # 2) 容器内启动 trtllm-serve /models/<model> \ --host 0.0.0.0 --port 8000 \ --max_batch_size 128 \ --max_num_tokens 8192 \ --tp_size 8 \ --config /tmp/config.yml
6.2GLM-5 / 5.2 / 5.3
架构:复用 DeepSeek V3.2 的 DeepseekV32Attention,MLA + DSA,DSA 参数从 config.json 自动读取。
Checkpoint 命名注意:
- GLM-5.3:基础仓库
zai-org/GLM-5.3是 FP8,BF16 在-BF16仓库 - GLM-5 / 5.2:基础仓库是 BF16,FP8 在
-FP8仓库
这个命名规则是反的,容易搞错。判断方法:看 checkpoint 的 quantization_config。
B200 FP8 配置
# /tmp/config.yml cuda_graph_config: enable_padding: true max_batch_size: 128 enable_attention_dp: false enable_chunked_prefill: true kv_cache_config: enable_block_reuse: false free_gpu_memory_fraction: 0.75 dtype: fp8 stream_interval: 10 moe_config: backend: DEEPGEMM
trtllm-serve /models/GLM-5.3 \ --served_model_name zai-org/GLM-5.3 \ --host 0.0.0.0 --port 8000 \ --max_batch_size 128 \ --max_num_tokens 8192 \ --tp_size 8 \ --ep_size 8 \ --pp_size 1 \ --config /tmp/config.yml
B200 FP8 + MTP
cuda_graph_config: enable_padding: true max_batch_size: 128 enable_attention_dp: false enable_chunked_prefill: true kv_cache_config: enable_block_reuse: false free_gpu_memory_fraction: 0.75 dtype: auto speculative_config: decoding_type: MTP num_nextn_predict_layers: 1 stream_interval: 10 moe_config: backend: DEEPGEMM
B200 NVFP4
只需改两处:checkpoint 换成 NVFP4,moe_config.backend 改成 TRTLLM。
moe_config: backend: TRTLLM
MTP 与 NVFP4 目前不兼容。
验证
curl -s -o /dev/null -w "Status: %{http_code}\n" "http://localhost:8000/health" curl http://localhost:8000/v1/completions \ -H "Content-Type: application/json" \ -d '{"model":"zai-org/GLM-5.3","prompt":"What is the capital of France?","max_tokens":16,"temperature":0}'
6.3Kimi-K3
架构:93 层解码器,大部分是 KDA(线性注意力,常数状态),每 4 层一次全 MLA。896 专家 top-16。路由专家权重 MXFP4(group size 32),其余 BF16。
必须从源码构建:
python3 scripts/build_wheel.py --cuda_architectures 103-real --skip_building_wheel --yes .venv-3.12/bin/python -m pip install -e . .venv-3.12/bin/python -m pip install fla-core einops
--cuda_architectures:GB300 用 103-real,B200 用 100-real。用 103 构建的也能在 B200 跑,但会缺少 sm100a 专用 batched-GEMM 内核。
三种部署形态:
| 形态 | 注意力布局 | 每 rank 权重 | 需要 |
|---|---|---|---|
| DEP16(高吞吐) | attention-DP(复制) | 210 GB | GB300 级显存 |
| TEP8 | attention-TP, EP8 | 213 GB | GB300 级显存 |
| TEP16(低延迟) | attention-TP, EP16 | 115 GB | GB200(SM100) |
TEP8 装不下的原因写在官方文档里:8 路专家分片本身就要 181 GB/rank,加上非专家权重就爆了。
DEP16 配置
# kimi-k3-config.yml tensor_parallel_size: 16 enable_attention_dp: true moe_expert_parallel_size: 16 max_batch_size: 32 max_num_tokens: 8192 max_seq_len: 8192 trust_remote_code: true disable_overlap_scheduler: false enable_chunked_prefill: true cuda_graph_config: enable_padding: true max_batch_size: 32 moe_config: max_num_tokens: 33024 use_low_precision_moe_combine: true kv_cache_config: enable_block_reuse: false free_gpu_memory_fraction: 0.25 tokens_per_block: 64
为什么 free_gpu_memory_fraction 只有 0.25:每个 KDA 层为每条请求保留循环状态,这部分不在分页 KV 池里。留 0.25 是给运行时和状态池腾空间。
多节点启动(4 节点 × 4 GPU = 16 rank)
MODEL=/path/to/kimi-k3-checkpoint REPO=/path/to/TensorRT-LLM EXTRA_LLM_API_FILE=/path/to/kimi-k3-config.yml srun -N 4 \ --ntasks 16 --ntasks-per-node 4 \ --mpi=pmix --gpus-per-node=4 \ --container-image=/path/to/tensorrt-llm-container.sqsh \ --container-mount-home \ --container-mounts=${REPO}:${REPO},${MODEL}:${MODEL},${EXTRA_LLM_API_FILE}:${EXTRA_LLM_API_FILE}:ro \ bash -c " ulimit -n 65536 # Node-local caches: shared NFS races during autotune JIT export TRITON_CACHE_DIR=/tmp/triton-cache-rank\${SLURM_PROCID:-0} export FLASHINFER_WORKSPACE_BASE=/tmp/flashinfer-rank\${SLURM_PROCID:-0} mkdir -p \"\$TRITON_CACHE_DIR\" \"\$FLASHINFER_WORKSPACE_BASE\" export PATH=\"${REPO}/.venv-3.12/bin:\$PATH\" exec ${REPO}/tensorrt_llm/llmapi/trtllm-llmapi-launch \ trtllm-serve ${MODEL} \ --host 0.0.0.0 --port 8000 \ --config ${EXTRA_LLM_API_FILE} "
TRITON_CACHE_DIR 和 FLASHINFER_WORKSPACE_BASE 必须指向节点本地磁盘。放在共享 NFS 上,多 rank 并发 autotune 会因 stale file handle 崩溃。这是官方文档里明确写出的坑。
混合模型开 block reuse:
kv_cache_config:
enable_block_reuse: true
mamba_state_config:
periodic_snapshot_interval: 256 # 每 256 token 快照一次 KDA 状态6.4Qwen3.5 / Qwen3.8
架构:3 层 GDN(门控 delta 网络)+ 1 层 GQA 交替,512 路由专家 top-10。
| 属性 | Qwen3.8-2.4T-A95B | Qwen3.5-397B-A17B |
|---|---|---|
| 解码层数 | 92 | 60 |
| Hidden size | 8192 | 4096 |
| GDN / GQA 层 | 69 / 23 | 45 / 15 |
| 路由专家 / 激活 | 512 / 10 | 512 / 10 |
| 内置 MTP | 1 个 recurrent 模块 | 1 个 recurrent 模块 |
| 推荐精度 | Block-scaled FP8 | NVFP4 + FP8 KV |
| 模态 | 纯文本 | 文本 + 图像 + 视频 |
。官方明确警告:Qwen3.8 更大、用 FP8、纯文本;Qwen3.5 NVFP4 是多模态 wrapper。并行、量化后端、缓存大小、专家放置都必须按具体 checkpoint 选。
硬件需求
| Checkpoint | B200 | B300 | GB200 | GB300 |
|---|---|---|---|---|
| Qwen3.8-2.4T FP8 | 16 卡 | 16 卡 | 16 卡 | 16 卡 |
| Qwen3.5-397B NVFP4 | 4 卡 | 4 卡 | 4 卡 | 4 卡 |
官方配置模板
TRTLLM_DIR=/app/tensorrt_llm
EXTRA_LLM_API_FILE=${TRTLLM_DIR}/examples/configs/curated/qwen3.5.yaml
trtllm-serve <model_path> \
--host 0.0.0.0 --port 8000 \
--reasoning_parser qwen3_5 \
--tool_parser qwen3 \
--config ${EXTRA_LLM_API_FILE}可用配置:
| 模型 | 档位 | 配置文件 |
|---|---|---|
| Qwen3.8 MoE FP8 | 低延迟 | qwen3.8-low-latency.yaml |
| Qwen3.8 MoE FP8 | 低延迟 + MTP3 | qwen3.8-low-latency-mtp3.yaml |
| Qwen3.8 MoE FP8 | 高吞吐 | qwen3.8-high-throughput.yaml |
| Qwen3.8 MoE FP8 | 高吞吐 + MTP3 | qwen3.8-high-throughput-mtp3.yaml |
| Qwen3.5-397B NVFP4 | 通用 | qwen3.5.yaml |
官方性能参考(GB300,8192 输入 / 1024 输出):
| 目标 | 投机 | 拓扑 | 并发 | 结果 |
|---|---|---|---|---|
| 低延迟 | 关闭 | TP16/EP1 | 1 | 133.5 tok/s/user(7.49 ms TPOT) |
| 低延迟 | MTP3 | TP16/EP1 | 1 | 383.1 tok/s/user(2.61 ms TPOT) |
| 高吞吐 | 关闭 | Attn-DP32/EP32 + Static544 | 3264 | 4059 tok/s/GPU |
| 高吞吐 | MTP3 | Attn-DP32/EP32 + Static544 | 2304 | 4118 tok/s/GPU |
MTP3 的性能数据基于受控的接受长度 2.3,不是自然接受率。
6.5MiniMax-M3
427B / 26B,MSA 块稀疏注意力,原生多模态。
# config.yml cuda_graph_config: enable_padding: true max_batch_size: 64 enable_chunked_prefill: true kv_cache_config: free_gpu_memory_fraction: 0.7 moe_config: backend: TRTLLM
trtllm-serve MiniMaxAI/MiniMax-M3 \ --tp_size 8 --ep_size 8 \ --max_batch_size 64 \ --max_num_tokens 8192 \ --reasoning_parser minimax_m3 \ --tool_parser minimax_m3 \ --config /tmp/config.yml
6.6gpt-oss-120b
最小可跑单位,适合验证环境。
# config.yml cuda_graph_config: enable_padding: true max_batch_size: 128 kv_cache_config: free_gpu_memory_fraction: 0.8 moe_config: backend: TRTLLM # Blackwell 上 MXFP4 走 TRTLLM
trtllm-serve openai/gpt-oss-120b \ --tp_size 1 \ --max_batch_size 128 \ --max_num_tokens 8192 \ --tool_parser openai \ --reasoning_parser openai \ --config /tmp/config.yml
6.7配置速查
| 模型 | TP | EP | Attn-DP | MoE backend | 特殊 |
|---|---|---|---|---|---|
| GLM-5.3 FP8 | 8 | 8 | false | DEEPGEMM | MTP 可用 |
| GLM-5.3 NVFP4 | 8 | 8 | false | TRTLLM | MTP 不可用 |
| Kimi-K3 DEP16 | 16 | 16 | true | auto | free_gpu_memory_fraction: 0.25 |
| Kimi-K3 TEP16 | 16 | 16 | false | auto | 低延迟 |
| Qwen3.8 FP8 | 16 | 1 | false | — | 低延迟档 |
| Qwen3.8 FP8 | 32 | 32 | true | — | 高吞吐 + Static544 |
| Qwen3.5 NVFP4 | 4 | — | — | — | qwen3.5.yaml |
07调优方法论
先定义指标
| 指标 | 定义 |
|---|---|
| TTFT | time to first token |
| TPOT | time per output token |
| ITL | inter-token latency |
| E2EL | end-to-end latency |
| tok/s/GPU | 每 GPU 总吞吐(输入+输出) |
| tok/s/user | 单用户输出吞吐 = 1000 / TPOT(ms) |
官方压测脚本
cat << 'EOF' > bench.sh
concurrency_list="32 64 128 256 512 1024 2048 4096"
multi_round=5
isl=1024
osl=1024
result_dir=/tmp/glm5_output
for concurrency in ${concurrency_list}; do
num_prompts=$((concurrency * multi_round))
python -m tensorrt_llm.serve.scripts.benchmark_serving \
--model zai-org/GLM-5.3 \
--backend openai \
--dataset-name random \
--random-input-len ${isl} \
--random-output-len ${osl} \
--random-prefix-len 0 \
--random-ids \
--num-prompts ${num_prompts} \
--max-concurrency ${concurrency} \
--ignore-eos \
--tokenize-on-client \
--percentile-metrics "ttft,tpot,itl,e2el" \
--save-result \
--result-dir "${result_dir}" \
--result-filename "concurrency_${concurrency}.json"
done
EOF
chmod +x bench.sh && ./bench.sh全套跑完非常耗时。建议先跑 2–3 个并发点定位拐点。
两个优化目标
TensorRT-LLM 的配置明显分成两族,官方在 Qwen3.8 指南里给出了对照:
低延迟族
max_batch_size: 16 or 32 max_num_tokens: 3072 cuda_graph_config: max_batch_size: 16 or 32 kv_cache_config: free_gpu_memory_fraction: 0.6 speculative_config: decoding_type: MTP max_draft_len: 3
高吞吐族
max_batch_size: 512 or 1024 max_num_tokens: 8192 cuda_graph_config: enable_padding: true max_batch_size: <same as above> kv_cache_config: free_gpu_memory_fraction: 0.85 enable_attention_dp: true moe_expert_parallel_size: <large>
按场景的配方
| 场景 | 关键配置 | 理由 |
|---|---|---|
| 低延迟对话 | 小 max_batch_size + MTP3 + enable_padding: true | MTP 在 batch=1 时收益最大 |
| 高吞吐批处理 | 大 max_batch_size + Attn-DP + EP + 大 free_gpu_memory_fraction | 摊薄权重读取 |
| 长上下文 | enable_chunked_prefill: true + 大 max_seq_len + CP | 分块避免单步爆炸 |
| 多轮 Agent | enable_block_reuse: true + periodic_snapshot_interval | 前缀复用 |
| PD 分离 | cache_transceiver_config + disable_overlap_scheduler on prefill | 隔离阶段 |
启动时间
TensorRT-LLM 的冷启动是三家里最慢的(要 JIT 编译 + autotune + 捕获 graph)。可以做的:
| 手段 | 效果 |
|---|---|
复用 TRITON_CACHE_DIR | 避免重复 autotune |
复用 FLASHINFER_WORKSPACE_BASE | 避免重复下载 cubin |
降低 cuda_graph_config.max_batch_size | 减少捕获数量 |
| 预热 | 压测前先发几条请求触发捕获 |
官方提示:第一次查询可能因初始化和编译而明显变慢。
08生产化与排错
8.1容器
docker run --rm -it \ --ipc=host \ --gpus all \ -p 8000:8000 \ -v "$HOST_MODELS_DIR":/models \ --name tensorrt_llm \ nvcr.io/nvidia/tensorrt-llm/release:1.4.0rc2 \ /bin/bash
镜像 tag 选择:
| 需求 | 用哪个 |
|---|---|
| 稳定生产 | 无 rcN 后缀的月度版 |
| 最新模型支持 | 带 rcN 的周更版 |
| 特定模型 day-0 | 官方指南指定的 tag(如 1.3.0a0.dev202610151219) |
8.2端点
| 端点 | 用途 |
|---|---|
/v1/models | 列出模型 |
/v1/completions | 文本补全 |
/v1/chat/completions | 对话 |
/v1/responses | Responses API |
/v1/embeddings | 向量(trtllm-serve embeddings 子命令) |
/health | 健康检查 |
/metrics | Prometheus 指标 |
/version | 版本 |
/start_profile / /stop_profile | 性能剖析(prototype) |
curl -s -o /dev/null -w "Status: %{http_code}\n" "http://localhost:8000/health" curl -s http://localhost:8000/metrics | grep -E 'trtllm_|gpu_mem|inflight'
关键指标:GPU 显存使用、inflight batching 详情、每 iteration 的统计。
8.3故障排查
| 现象 | 原因 | 处理 |
|---|---|---|
| CUDA OOM | KV 或 graph 吃太多 | 降 free_gpu_memory_fraction(0.75→0.6);降 max_num_tokens(8192→3072);降 max_batch_size |
| 内存碎片导致 OOM | PyTorch allocator 碎片 | PYTORCH_ALLOC_CONF=max_split_size_mb:8192 |
| 启动就报 MoE backend 错误 | 没显式指定 | GLM-5 必设 moe_config.backend |
| NVFP4 跑不起来 | 用了 DEEPGEMM | 改 TRTLLM |
| MTP 不生效 | 用了 NVFP4 checkpoint | 换 FP8 |
| Kimi-K3 多 rank 崩溃 | Triton/FlashInfer 缓存在共享盘 | TRITON_CACHE_DIR 指向本地 |
| 前缀缓存不生效(混合模型) | 未设快照间隔 | periodic_snapshot_interval: 256 |
| 首查询特别慢 | JIT 编译 + graph 捕获 | 正常现象,先预热 |
| 多模态 KV 复用报错 | kv_cache_reuse 与多模态不兼容 | enable_block_reuse: false |
| Checkpoint 加载失败 | 拿错了 FP8/BF16 仓库 | 查 config.json 的 quantization_config |
8.4性能剖析
curl -X POST http://localhost:8000/start_profile # 跑负载 curl -X POST http://localhost:8000/stop_profile
生成的 trace 可导入 Chrome Tracing 或 Nsight Systems 分析。
09附录
A. 参数速查
| 参数 | 位置 | 一句话 |
|---|---|---|
tensor_parallel_size | YAML / --tp_size | TP 宽度 |
pipeline_parallel_size | YAML / --pp_size | PP 宽度 |
moe_expert_parallel_size | YAML / --ep_size | MoE 的 EP 宽度 |
moe_tensor_parallel_size | YAML | MoE 的 TP 宽度(ETP 时用) |
enable_attention_dp | YAML | 注意力走 DP |
max_batch_size | CLI | 最大 batch |
max_num_tokens | CLI | 单步 token 上限 |
max_seq_len | YAML | 最大序列长度 |
kv_cache_config.free_gpu_memory_fraction | YAML | 剩余显存的多少给 KV |
kv_cache_config.enable_block_reuse | YAML | 前缀复用 |
kv_cache_config.tokens_per_block | YAML | KV 块大小 |
kv_cache_config.mamba_ssm_cache_dtype | YAML | 混合模型 SSM 状态精度 |
cuda_graph_config.enable_padding | YAML | batch padding 到捕获尺寸 |
cuda_graph_config.max_batch_size | YAML | 最大捕获 batch |
moe_config.backend | YAML | MoE 内核后端 |
moe_config.use_low_precision_moe_combine | YAML | EP combine 低精度 |
speculative_config.decoding_type | YAML | MTP 等 |
speculative_config.max_draft_len | YAML | 草稿长度 |
enable_chunked_prefill | YAML | 分块 prefill |
disable_overlap_scheduler | YAML | 关闭调度重叠(PD prefill 用) |
cache_transceiver_config.backend | YAML | PD 传输后端(NIXL) |
stream_interval | YAML | 流式输出间隔 |
--tool_parser | CLI | 工具调用解析器 |
--reasoning_parser | CLI | 推理内容解析器 |
B. 环境变量
| 变量 | 作用 |
|---|---|
TRITON_CACHE_DIR | Triton 编译缓存(多 rank 时必须本地) |
FLASHINFER_WORKSPACE_BASE | FlashInfer 缓存(同上) |
PYTORCH_ALLOC_CONF | 内存分配器调优(max_split_size_mb:8192) |
TLLM_SPEC_DECODE_FORCE_NUM_ACCEPTED_TOKENS | 强制接受 token 数(仅基准测试) |
TRTLLM_ENABLE_RENDER_ENDPOINTS | 启用 /render 端点 |
MIMALLOC_PURGE_DELAY | mimalloc 回收延迟 |
C. 来源
| 来源 | 用途 |
|---|---|
| nvidia.github.io/TensorRT-LLM/latest/commands/trtllm-serve | serve 命令与端点 |
| nvidia.github.io/TensorRT-LLM/latest/features/parallel-strategy | 并行策略与 ETP 约束 |
| nvidia.github.io/TensorRT-LLM/latest/deployment-guide/* | 逐模型验证配置 |
| nvidia.github.io/TensorRT-LLM/latest/commands/trtllm-bench | 压测 |
| pypi.org/project/tensorrt-llm | 版本核验 |
| NGC catalog | 镜像 tag |
本文档基于 2026-11-06 可获取的公开资料整理。TensorRT-LLM 的模型支持与镜像版本强绑定,部署前请以对应 Deployment Guide 的 Prerequisites 章节为准。