NVIDIA/TensorRT · 上手攻略
- 仓库:NVIDIA/TensorRT
- 链接:https://github.com/NVIDIA/TensorRT
- 分类:ai(NVIDIA GPU 上的高性能深度学习推理 SDK)
- 作者:spark
- 更新:2026-07-14
是什么
NVIDIA TensorRT 是 NVIDIA 官方的高性能深度学习推理 SDK,主要做一件事:把训练好的模型(来自 PyTorch / TensorFlow / ONNX 等)编译并优化成针对 NVIDIA GPU 高度调优的运行时引擎(engine),从而在生产中获得最低延迟和最高吞吐。
GitHub 上 NVIDIA/TensorRT 仓库是 TensorRT 的开源组件(OSS)——它不是完整的 TensorRT 二进制发行版,而是源码层级的开放部分,包含:
- 官方 ONNX 解析器(ONNX parser);
- 官方 自定义层/插件实现(plugins);
- 大量 示例程序(samples / demo apps),覆盖从单机推理到多卡集合通信(
sampleDistCollective); - 与之配套的 Python 包源码。
完整的 GA(General Availability)发行版(含 trtexec、libnvinfer.so、TensorRT Python wheel 等二进制)需要从 NVIDIA Developer Zone 下载;OSS 仓库相当于"工具链 + 配方",给你按需自编译或集成进自家推理框架的能力。
截至当前,仓库主版本已升到 TensorRT 11.x,并发布了 11.1.0.106 GA,对应 CUDA 13.3 / 12.9。
解决什么问题
- 生产推理延迟/吞吐瓶颈:直接跑 PyTorch / TF 模型太慢,把模型转成 TensorRT engine 通常能拿到 2~10× 的吞吐提升和显著更低的 P99 延迟,尤其在 T4 / L4 / A100 / H100 / Jetson 上效果明显。
- 跨框架模型部署:ONNX 是公共交换格式,TensorRT 能直接吃 ONNX 模型,覆盖从经典 CNN/Transformer 到 LLM、扩散模型、视觉-语言多模态的全谱系。
- 需要 GPU 级自定义算子:很多自定义算子(RoPE、PagedAttention 风格的注意力、FlashAttention 变体、量化算子融合)只能通过 TensorRT 的 IPluginV3 接入,这个仓库就是这些 plugin 的参考实现。
- 需要确定性 + 强类型推理:11.x 起 TensorRT 强制走 Strongly Typed Networks(弱类型 API 已移除),推理时张量类型在编译期就确定,对安全关键场景(汽车 / 工业)更友好。
- 显式量化工作流:10.x 起的 Explicit Quantization 取代了旧的隐式量化,方便工程化做 INT8/FP8 校准。
快速安装
路径 A:纯 Python 用 pip(最快上手)
如果你只想用 TensorRT 不需要修改它的源码:
pip install tensorrt
这套 wheel 是 NVIDIA 单独发布的,里面已经包含完整的 libnvinfer 运行时 + Python 绑定,可以直接:
import tensorrt as trt
logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(logger)
# ... 加载 ONNX / 用 NetworkDefinition API 构建网络
# ... 序列化 engine → 反序列化 → context.execute_async_v3(...)
⚠️ wheel 版本与系统 CUDA 版本必须匹配(11.1.0.106 对应 CUDA 13.3 或 12.9);不匹配会导致 libnvinfer.so 加载失败。
路径 B:源码构建(OSS 仓库的真正用途)
适合要改 plugins、加自定义算子、给 Jetson/DriveOS 交叉编译的场景。
前置依赖:
| 组件 | 推荐版本 |
|---|---|
| CUDA | 13.3.0 或 12.9.0 |
| cuDNN | 8.9(可选) |
| Python | ≥ 3.10(11.x 起不再支持 3.9 及更早) |
| cmake | ≥ 3.31 |
| GNU make | ≥ 4.1 |
| GCC | ≥ 11.0 |
| Docker + NVIDIA Container Toolkit | 推荐走容器构建 |
| NCCL | ≥ 2.19(仅多卡 sample 需要) |
| PyPI | onnx、onnxruntime、tensorflow-gpu ≥ 2.5.1、Pillow ≥ 9.0.1、pycuda |
1. 拉代码
git clone -b main https://github.com/nvidia/TensorRT TensorRT
cd TensorRT
git submodule update --init --recursive
2. 准备 GA 二进制
仓库自带容器会把 TensorRT 库预装到 /usr/lib/x86_64-linux-gnu,可以跳过这步。如果走原生构建,要先去 NVIDIA Developer Zone 下载对应 CUDA 版本的 GA tar 包并解压:
cd ~/Downloads
tar --zstd -xvf TensorRT-Enterprise-11.1.0.106-Linux-x86_64-cuda-13.3-Release-external.tar.zst
export TRT_LIBPATH=`pwd`/TensorRT-11.1.0.106/lib
3. 用 Docker 构建(推荐)
仓库提供了完整 Dockerfile:
# 构建镜像
./docker/build.sh --file docker/ubuntu-24.04.Dockerfile --tag tensorrt-ubuntu24.04-cuda13.3
# 启动容器(root 用户密码是 nvidia)
./docker/launch.sh --tag tensorrt-ubuntu24.04-cuda13.3 --gpus all
# 也支持 Jetson(aarch64)交叉编译、Rocky Linux、DriveOS 等变体
./docker/build.sh --file docker/ubuntu-cross-aarch64.Dockerfile --tag tensorrt-jetpack-cuda13.3
4. 编译
cd $TRT_OSSPATH
mkdir -p build && cd build
cmake .. -DTRT_LIB_DIR=$TRT_LIBPATH -DTRT_OUT_DIR=`pwd`/out
make -j$(nproc)
Windows 上用:
cd $TRT_OSSPATH
New-Item -ItemType Directory -Path build
cd build
cmake .. -DTRT_LIB_DIR="$env:TRT_LIBPATH" -DTRT_OUT_DIR="$pwd\out"
msbuild TensorRT.sln /property:Configuration=Release -m:$env:NUMBER_OF_PROCESSORS
5. 跑示例
cd $TRT_OSSPATH/build/out
./trtexec --onnx=path/to/model.onnx # 编译 ONNX → engine 并 benchmark
核心用法
1. ONNX 模型编译 + 推理(最常用路径)
把任意框架导出的 .onnx 用 TensorRT 编译:
trtexec \
--onnx=resnet50.onnx \
--saveEngine=resnet50.engine \
--fp16 \
--workspace=4096
--fp16 启用 FP16 精度(大多数情况下几乎不损失精度);INT8 还需要 --int8 + 一个校准 cache。
2. Python Network Definition API(高级 / 自定义结构)
import tensorrt as trt
import numpy as np
logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(logger)
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.STRONGLY_TYPED))
config = builder.create_builder_config()
config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 << 30) # 1 GiB
# 构造网络(强类型模式下要给 dtype)
input_tensor = network.add_input("input", trt.float32, (1, 3, 224, 224))
conv = network.add_convolution_nd(input_tensor, 64, (3, 3), trt.Weights(), trt.Weights())
conv.get_output(0).dtype = trt.float16 # FP16 输出
network.mark_output(conv.get_output(0))
engine = builder.build_serialized_network(network, config)
with open("model.engine", "wb") as f:
f.write(engine)
⚠️ 11.x 起必须开 STRONGLY_TYPED,否则弱类型 API 已经移除。
3. Torch-TensorRT(PyTorch 直出 engine)
不需要先转 ONNX,在 PyTorch 模型上:
import torch
import torch_tensorrt
model = MyModel().eval().cuda()
trt_model = torch_tensorrt.compile(
model,
inputs=[torch_tensorrt.Input(min_shape=(1, 3, 224, 224),
opt_shape=(16, 3, 224, 224),
max_shape=(32, 3, 224, 224))],
enabled_precisions={torch.float16},
)
torch.jit.save(trt_model, "trt_ts.ts")
Torch-TensorRT 不在 OSS 主仓库里,但是 11.x 的官方推荐路径之一,文档在 import_workflows.md 里。
4. HuggingFace / Optimum
optimum 的 TensorRT backend 可以直接吃 HuggingFace 上的 BERT、Llama 等:
pip install optimum[exporters]
optimum-cli export trt --model bert-base-uncased --task text-classification bert_trt/
注意 LLM 路径要走 TensorRT-LLM(不在本仓库),那是另一个独立仓库,专门做大模型推理。
5. 自定义 plugin(IPluginV3)
10.x 起的 plugin 写法:实现 IPluginV3 + IPluginV3Creator,配合 registry 注册:
class MyCustomPlugin : public nvinfer1::IPluginV3 {
// 实现 getOutputShapes、supportsFormatCombination、enqueue、serialize 等
};
REGISTER_TENSORRT_PLUGIN(MyCustomPluginCreator);
详细迁移指南见 extending-custom-layers.html#migrating-v2-plugins-to-ipluginv3;旧的 IPluginV2 在 11.x 已经移除。
6. 多卡集合通信(sample)
启用 sampleDistCollective:
cmake .. -DTRT_LIB_DIR=$TRT_LIBPATH -DTRT_OUT_DIR=`pwd`/out -DTRT_BUILD_ENABLE_MULTIDEVICE=ON
make -j$(nproc)
需要 NCCL ≥ 2.19 + 多张 GPU。
典型适用场景
- LLM 推理:用 TensorRT-LLM(独立仓库)做大模型;本仓库主要负责自定义算子 plugin。
- CV 模型上线:ResNet / YOLO / DETR / Segment Anything 等,转成 FP16 / INT8 engine 部署到 T4/L4 上。
- 嵌入 / 向量检索:BERT / E5 / BGE 系列,转成 FP16 engine 跑 batch embedding。
- Jetson 边缘:通过
docker/ubuntu-cross-aarch64.Dockerfile交叉编译,部署到 Jetson Orin / Thor。 - DriveOS / 车规:用 QNX safe 工具链编译
BUILD_SAFE_SAMPLES=ON,走功能安全路径。 - 需要 PyTorch + TensorRT 联动:直接走 Torch-TensorRT,免去 ONNX 中转。
坑与注意
- 仓库 ≠ 完整发行版:这里没有完整的
trtexec/libnvinfer二进制;纯用 pip 装的 wheel 用户通常根本不需要这个仓库,只有要改源码或交叉编译的人才需要 clone。 - CUDA 版本必须严格匹配:wheel 安装失败九成是 CUDA 版本不匹配;查表:TensorRT 11.1 ↔ CUDA 13.3 / 12.9;TensorRT 10.x ↔ CUDA 12.x。
- Python 3.10+:11.x 起 wheel 不再含 py39 包,旧项目升 TensorRT 必须先升 Python。
- 强类型网络迁移:从 10.x 升 11.x 的代码大概率要改,因为弱类型 API 已经删了;IPluginV2 同理需要重写成 IPluginV3。
- submodule 一定要 init:
git submodule update --init --recursive,否则 cmake 会找不到 protobuf / cub / onnx-tensorrt。 - aarch64 交叉编译要指定 C 编译器:
CC=/usr/bin/gcc必须显式给,否则 protobuf 编译会失败。 - Linux 容器 root 密码是
nvidia:用./docker/launch.sh启动后第一次进容器会用到。 - Sample 默认编译到
build/out:TRT_OUT_DIR改了之后trtexec路径要跟着改。 - 不要在生产用 FP32:除非是医疗影像这种对精度敏感的领域,否则 FP16 几乎总是无损且速度翻倍。
与同类对比
| 工具 | 厂商 | 精度 | 适用硬件 | LLM 支持 | 开源 |
|---|---|---|---|---|---|
| NVIDIA TensorRT | NVIDIA | FP32/FP16/INT8/FP8 | NVIDIA 全系 GPU、Jetson | 通过 TensorRT-LLM(独立) | 部分(OSS 仓库) |
| TensorFlow Lite / XLA | FP32/FP16/INT8 | CPU/GPU/EdgeTPU | ❌ | ✅ | |
| ONNX Runtime | 微软 + 社区 | FP32/FP16/INT8 | CPU/GPU/NNAPI/DirectML | 部分 | ✅ |
| OpenVINO | Intel | FP32/FP16/INT8 | Intel CPU/GPU/NPU | 部分 | ✅ |
| llama.cpp | 社区 | GGUF 量化 | CPU/Apple Silicon/任意 CUDA | ✅(GGUF) | ✅ |
| vLLM | UC Berkeley | FP16/AWQ/GPTQ | NVIDIA / AMD | ✅ | ✅ |
定位差异:TensorRT 是 NVIDIA 阵营下"想要极致的 GPU 推理性能"的标准答案;做 LLM 推理直接走 TensorRT-LLM 而不是本仓库,做 CV/小模型才直接用本仓库;想跨硬件就选 ONNX Runtime 或 OpenVINO。
一句话推荐结论
如果你的模型跑在 NVIDIA GPU 上、需要生产级延迟和吞吐,那就装 TensorRT(直接 pip install tensorrt + trtexec);只有当你需要改 plugins、加自定义算子或交叉编译到 Jetson/DriveOS 时,才需要 clone 这个 OSS 仓库去从源码构建。
参考链接
- 仓库主页:https://github.com/NVIDIA/TensorRT
- GA 二进制下载:https://developer.nvidia.com/tensorrt
- Developer Guide:https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html
- Quick Start:https://docs.nvidia.com/deeplearning/tensorrt/quick-start-guide/index.html
- 迁移指南(10→11):https://docs.nvidia.com/deeplearning/tensorrt/latest/inference-library/advanced.html#strongly-typed-networks
- Import Workflows:https://github.com/NVIDIA/TensorRT/blob/main/documents/import_workflows.md
- Supported Models:https://github.com/NVIDIA/TensorRT/blob/main/documents/supported_models.md