TensorRT LLM 是 NVIDIA 维护的开源推理库,仓库在 github.com/NVIDIA/TensorRT-LLM,Apache 2.0 许可。它最重要的变化发生在 1.0 到 1.2 这条线上:PyTorch 原生后端从「可选」变成「默认」,再变成 **唯一**。1.2 的发行说明写得很直接——`LLM(backend="tensorrt")` 现在会直接抛 ValueError。也就是说,网上那一大批教你 `trtllm-build` 把 checkpoint 编译成 `.engine` 再加载的 2024 年教程,今天照抄会失败在第一步。这是搜「TensorRT-LLM 本地部署」最容易踩的坑,没有之一。当前稳定线是 1.2,main 分支已经推到 1.3.0rc。
TensorRT LLM 本身不是模型,它没有固定显存占用;真正要算的是三笔账:权重 + KV cache + 激活峰值。绝大多数人第一次 OOM 不是权重放不下,而是栽在 KV cache 上——`free_gpu_memory_fraction` 默认就是 0.9,它会把当前空闲显存的 90% 直接圈走做 KV 池。8B 的 FP8 权重只有 9GB 左右,塞进 24GB 卡绰绰有余,但默认配置下服务一起来显存就见底了,压测稍微上并发就崩。把这个值调到 0.80~0.85,再配合 `--max_num_tokens` 卡住单批 token 上限,是每次部署都要做的第一件事。KV cache 的块复用(`enable_block_reuse`)和部分复用默认是开的,多轮对话和共享前缀场景能省下相当可观的一块。
另一条硬约束是量化格式和卡的代际死死绑定,这决定了你该租哪张卡而不是反过来。Ampere(A100、A6000、3090)没有 FP8 张量核,只能走 W4A16 的 AWQ / GPTQ 或者干脆 BF16;Ada(4090)和 Hopper(H100)才有 FP8;NVFP4、MXFP4 这些新格式要 Blackwell,其中 sm120(RTX 5090)支持 NVFP4、MXFP4 和 FP8 per-tensor。系统层面也别抱幻想:官方只支持 Linux x86_64 和 aarch64,没有 Windows;当前支持矩阵里 Turing 和 Volta 都不在列,官方明确说不在列表里的架构他们不开发也不测试。NexGPU 上最便宜的可用卡恰好也是最便宜的卡——RTX 3090 24GB,$0.193/卡·时,按秒计费。
01 —
版本线:先搞清楚你看的教程是哪一代
TensorRT LLM 的 API 在 1.x 这条线上动过刀,版本错了整套命令都对不上。
| 版本 | 参数量 | 显存 | 上下文 | 说明 |
|---|---|---|---|---|
| TensorRT LLM 1.3.0rc(main 开发线) | PyTorch 原生后端 + AutoDeploy beta | NVFP4 / MXFP4 / NVFP4 KV Cache,需 Blackwell | CUDA 13.1 · PyTorch 2.10 · Python 3.12 · Ubuntu 24.04 | 追新用。DFlash、PARD、后缀自动机(SA)等新投机解码方法先落在这条线上;rc 版本 API 随时可能改,别拿去做生产基线。 |
| TensorRT LLM 1.2(当前稳定线) | PyTorch 唯一执行后端 | FP8 权重可把 70B 压进单张 80GB | Linux x86_64 / aarch64,无 Windows | 破坏性变更集中在这里:TRT 后端彻底移除,`LLM(backend="tensorrt")` 抛 ValueError;CLI 参数优先级高于 YAML 配置。新项目从这条线起步。 |
| TensorRT LLM 1.1 | PyTorch 与 TRT 后端并存的最后一版 | FP8 KV Cache 可用,显存再省一截 | 同 1.0 依赖 | 加入 GPT-OSS、Hunyuan 支持和 KV Cache Connector API(分离式服务的地基)。C++ TRTLLM sampler 变成默认,新增 `sampler_type` 参数。 |
| TensorRT LLM 1.0 | LLM API 正式宣布稳定 | 与 1.1 一致 | PyTorch 架构定为默认后端 | 分水岭版本。运行时初始化从「首次调用时」挪到了 `__init__`,第一次 generate 不再有长时间卡顿,但开销提前到构造函数。 |
| TensorRT LLM 0.21 及更早 | trtllm-build 编译 engine 流程 | engine 构建期有额外显存峰值 | TensorRT 10.x 依赖 | 历史流程:转 checkpoint → `trtllm-build` 出 `.engine` → 加载。1.2 起已彻底移除。网上绝大多数中文教程停留在这一代,识别方法是看有没有 `trtllm-build`。 |
02 —
选卡:量化格式决定代际,不是显存大就行
FP8 要 Ada 以上,NVFP4 要 Blackwell,Ampere 只能走 INT4——按你要跑的精度倒推卡。
8B 级 FP8 单卡起服务、跑通链路
RTX 4090 24GB$0.540/卡·时
Ada(sm89)是能吃 FP8 的最便宜档,nvidia/Qwen3-8B-FP8 权重约 9GB,剩下 15GB 做 KV 池够撑起像样的并发。
20B–32B 跑 MXFP4 / NVFP4 新格式
RTX 5090 32GB$0.723/卡·时
sm120 是支持 NVFP4、MXFP4 和 FP8 KV Cache 的消费级 Blackwell,GPT-OSS-20B 这类原生 MXFP4 权重在这张卡上才是原生速度。
70B 级 W4A16 AWQ、长上下文推理
A100 PCIE 80GB$0.824/卡·时
Ampere 没有 FP8,70B 只能走 INT4 AWQ / GPTQ;权重约 40GB,80GB 显存留下的余量正好喂饱长上下文的 KV cache。
生产级 FP8 吞吐、大 MoE 张量并行与分离式服务
H100 SXM 80GB$3.582/卡·时
FP8 block scaling、rowwise 全套只在 Hopper 齐活,NVLink 让 `--tp_size 2/4` 和 prefill-decode 分离的 KV 传输不被互联拖死。
03 —
四步把 trtllm-serve 跑起来
全程走官方容器,绕开 CUDA 13.1 / PyTorch 2.10 的版本地狱。
- 01
开卡,拉 NGC 官方容器
别用裸机 pip 装第一次。官方发布镜像在 nvcr.io,已经把 CUDA、PyTorch、OpenMPI 全部对齐好了。`--ipc=host` 和两个 ulimit 是官方文档要求的,缺了会在多进程和大 KV 池上翻车。想走 pip 路线的话顺序是:先 `pip3 install torch==2.10.0 torchvision --index-url https://download.pytorch.org/whl/cu130`,再 `apt-get install libopenmpi-dev`,最后 `pip3 install tensorrt_llm`。
docker run --rm -it --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --gpus=all nvcr.io/nvidia/tensorrt-llm/release:1.3.0rc24 - 02
起 OpenAI 兼容服务,第一件事是压住 KV cache
`trtllm-serve` 直接吃 HuggingFace 模型 ID,不需要任何预编译。注意这里显式写了 `--kv_cache_free_gpu_memory_fraction 0.85`——默认 0.9 会把空闲显存吃到只剩渣,是新手 OOM 的头号原因。`--max_num_tokens` 卡住单批 token 上限,`--backend pytorch` 在 1.2 之后其实是唯一选项,写出来是为了让配置自解释。
trtllm-serve serve nvidia/Qwen3-8B-FP8 --tp_size 1 --max_batch_size 32 --max_num_tokens 8192 --kv_cache_free_gpu_memory_fraction 0.85 --backend pytorch --host 0.0.0.0 --port 8000 - 03
验证接口,确认它就是个 OpenAI 端点
服务起来后是标准的 `/v1/chat/completions` 和 `/v1/completions`,任何 OpenAI SDK 直接改 base_url 就能接。这一步的意义是确认权重加载、tokenizer 和 chat template 都对——如果模型输出乱码或者不停止,八成是 chat template 没匹配上,用 `--chat_template` 显式指定。
curl -X POST http://localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{"model": "nvidia/Qwen3-8B-FP8", "messages":[{"role": "user", "content": "用一句话说明你是谁"}], "max_tokens": 64, "temperature": 0}' - 04
用 trtllm-bench 压出真实容量,再决定租几张卡
这是 TensorRT LLM 相比其他运行时最值钱的一步:官方自带压测工具,先合成一份符合你业务分布的数据集,再跑吞吐。`--input-mean` / `--output-mean` 按你真实的 prompt 和回复长度填,压出来的 TTFT、TPOT 和 tokens/s 才有意义。拿到 `--report_json` 的结果,你就能算出「一张卡撑多少 QPS」,进而算出该开几张——而不是拍脑袋。
trtllm-bench --model nvidia/Qwen3-8B-FP8 throughput --dataset /tmp/synth.jsonl --max_batch_size 32 --concurrency 16 --streaming --report_json /tmp/report.json
一轮完整验证到底花多少钱
以 Qwen3-8B-FP8 在 RTX 4090 24GB 上跑通并压测为例。开机、拉 nvcr.io 官方镜像、下载权重、第一次 `trtllm-serve` 起服务并跑完 warmup,按 30 分钟算:0.5 小时 × $0.540 = $0.27。接着用 `trtllm-bench` 跑三组并发(8 / 16 / 32)各 40 分钟,合计 2 小时:2 × $0.540 = $1.08。这一轮总共 $1.35,你换回来的是这张卡上真实的 TTFT、TPOT 和吞吐曲线,而不是别人博客里的数字。 往上走一档:70B 级 W4A16 AWQ 换 A100 PCIE 80GB,$0.824/卡·时,跑满一个 12 小时的调参日是 12 × $0.824 = $9.89。如果业务必须用 FP8——Ampere 做不到,只能上 Hopper——H100 SXM 80GB 开 `--tp_size 2` 就是 2 × $3.582 = $7.164/时,一轮 6 小时的压测 6 × $7.164 = $42.98。对照一下:光是买一张 H100 的钱,够你在这里压测好几年。 权重存储单独算。70B 的 INT4 权重约 40GB,$0.414/GB·月 × 40 = $16.56/月,折合每天约 $0.55。计算按秒计费、停机即停止计费,但存储会一直算到你把它销毁为止——调完参记得把不再用的权重卷删掉。无最低消费、无开通费、不用申请配额。
04 —
