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)发行版(含 trtexeclibnvinfer.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 一定要 initgit submodule update --init --recursive,否则 cmake 会找不到 protobuf / cub / onnx-tensorrt。
  • aarch64 交叉编译要指定 C 编译器CC=/usr/bin/gcc 必须显式给,否则 protobuf 编译会失败。
  • Linux 容器 root 密码是 nvidia:用 ./docker/launch.sh 启动后第一次进容器会用到。
  • Sample 默认编译到 build/outTRT_OUT_DIR 改了之后 trtexec 路径要跟着改。
  • 不要在生产用 FP32:除非是医疗影像这种对精度敏感的领域,否则 FP16 几乎总是无损且速度翻倍。

与同类对比

工具 厂商 精度 适用硬件 LLM 支持 开源
NVIDIA TensorRT NVIDIA FP32/FP16/INT8/FP8 NVIDIA 全系 GPU、Jetson 通过 TensorRT-LLM(独立) 部分(OSS 仓库)
TensorFlow Lite / XLA Google 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