1. 课程导学与环境准备:ONNX与TensorRT概述

各位同学好,我是这门课的主讲。今天咱们正式开始《ONNX到TensorRT优化全流程》的第一章。

这一章说白了就是「热身」。我不会一上来就扔一堆公式,而是先带大家搞清楚:ONNX 和 TensorRT 到底是什么?它们能解决什么实际问题?然后,咱们把开发环境搭好,确保后面每一行代码都能跑起来。

我个人习惯是,学任何新技术之前,先问自己三个问题:
1. 这东西解决了我什么痛点?
2. 没有它行不行?
3. 上手成本高不高?

带着这些问题,咱们往下看。

1.1 为什么需要模型中间表示与推理优化?

先聊聊背景。你想想看,现在做深度学习,训练框架五花八门:PyTorch、TensorFlow、PaddlePaddle……每个框架都有自己的模型格式。模型训练好了,要部署到生产环境,问题就来了——

  • 框架锁定:PyTorch 训练的模型,没法直接在 TensorFlow Serving 上跑。
  • 硬件适配:同一个模型,在 NVIDIA GPU、Intel CPU、ARM 上,推理效率天差地别。
  • 性能浪费:训练框架里很多算子(比如自动求导)在推理时根本用不上,白白消耗资源。

我在项目中遇到过最典型的情况:用 PyTorch 训好的一个分类模型,直接拿去做服务端推理,QPS(每秒查询数)死活上不去。后来发现,光是算子调度和显存分配就浪费了 30% 的性能。

所以,业界提出了两个核心思路:

  1. 模型中间表示(Intermediate Representation, IR):比如 ONNX,让模型在不同框架之间「说同一种语言」。
  2. 推理优化引擎:比如 TensorRT,针对特定硬件做极致优化,把推理速度压榨到极限。

一句话总结:ONNX 解决「模型能不能跑」的问题,TensorRT 解决「模型跑得快不快」的问题。

1.2 ONNX 与 TensorRT 核心概念

咱们一个一个说清楚。

1.2.1 ONNX(Open Neural Network Exchange)

ONNX 是微软和 Facebook 在 2017 年联合推出的。它的定位很明确:做一个深度学习模型的「通用格式」。

你可以把 ONNX 想象成「模型界的 PDF」。不管源文件是 Word 还是 LaTeX,导出成 PDF 后,任何设备都能打开。ONNX 也一样——不管模型是用 PyTorch、TensorFlow 还是其他框架训练的,导出成 .onnx 文件后,就能被各种推理引擎加载。

ONNX 的核心组成:

  • 计算图(Graph):描述模型的计算流程,包括节点(算子)和边(张量)。
  • 算子集(Opset):定义了标准化的操作,比如 Conv、Relu、MatMul。不同版本支持不同算子。
  • 元数据(Metadata):模型版本、作者、输入输出信息等。

小提示:ONNX 本身不负责推理加速。它只是「翻译官」。真正的加速,要交给 TensorRT 这样的后端引擎。

1.2.2 TensorRT(NVIDIA TensorRT)

TensorRT 是 NVIDIA 推出的推理优化引擎。它只做一件事:在 NVIDIA GPU 上,把模型推理速度跑到最快。

它的优化手段包括但不限于:

  • 层融合(Layer Fusion):把多个连续的小算子合并成一个 kernel,减少显存读写。
  • 精度校准(INT8/FP16):在几乎不损失精度的情况下,用更低精度计算,速度翻倍。
  • 动态张量内存(Dynamic Tensor Memory):复用显存,减少分配开销。
  • 自动调优(Auto-tuning):针对你的 GPU 型号,自动选择最优的 kernel 实现。

我记得第一次用 TensorRT 优化一个 ResNet-50 模型,FP32 推理延迟从 15ms 降到了 5ms,INT8 更是直接干到 2ms。当时我就一个感觉:这工具,真香。

1.3 应用场景与课程目标

咱们这门课,不是纯理论,而是实战导向。学完之后,你能独立完成从 ONNX 导出到 TensorRT 部署的全流程。

场景 典型需求 本课程覆盖
云端推理服务 高吞吐、低延迟 TensorRT 服务化部署
边缘端设备 资源受限、低功耗 INT8 量化、模型压缩
自动驾驶 多模型、实时性 多流推理、动态 shape
视频分析 高分辨率、批量处理 TensorRT 插件开发

课程目标很清晰:

  1. 掌握 ONNX 导出与调试:能处理常见的导出报错。
  2. 精通 TensorRT 优化流程:从 FP32 到 INT8,每一步都亲手操作。
  3. 能解决实际部署问题:比如动态 shape、自定义算子、多模型并发。

1.4 开发环境搭建

嗯,这里要注意。环境搭建是很多同学的第一道坎。我见过太多人卡在版本不兼容上。所以,咱们严格按照下面的步骤来。

1.4.1 硬件与操作系统要求

  • GPU:NVIDIA 显卡,计算能力 6.0 以上(GTX 10 系列及以上)。推荐 RTX 30/40 系列。
  • 操作系统:Ubuntu 20.04/22.04(推荐),Windows 10/11 也可。
  • 内存:至少 16GB。
  • 磁盘:至少 20GB 空闲空间。

1.4.2 安装 CUDA 与 cuDNN

CUDA 是 NVIDIA 的并行计算平台,cuDNN 是深度学习加速库。TensorRT 依赖它们。

我个人建议使用 CUDA 11.8 + cuDNN 8.9 这个组合,兼容性最好。

# 1. 安装 CUDA 11.8
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run

# 2. 配置环境变量
echo 'export PATH=/usr/local/cuda-11.8/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

# 3. 验证 CUDA
nvcc --version

# 4. 安装 cuDNN 8.9(需要从 NVIDIA 官网下载 .tar 包)
tar -xzvf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-11.8/include
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-11.8/lib64
sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*

避坑指南:我曾经因为 CUDA 和 cuDNN 版本不匹配,折腾了一整天。记住:TensorRT 的版本对 CUDA 和 cuDNN 有严格依赖。安装前一定去 NVIDIA 官网查兼容性矩阵。

1.4.3 安装 TensorRT

推荐使用 TensorRT 8.6 GA 版本,稳定且文档齐全。

# 下载 TensorRT 8.6 GA(需要 NVIDIA 开发者账号)
# 选择 Tar File 安装包

tar -xzvf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-11.8.tar.gz
sudo mv TensorRT-8.6.1.6 /usr/local/tensorrt

# 配置环境变量
echo 'export LD_LIBRARY_PATH=/usr/local/tensorrt/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

# 安装 Python 包
cd /usr/local/tensorrt/python
pip install tensorrt-8.6.1.6-cp38-none-linux_x86_64.whl

# 验证
python -c "import tensorrt; print(tensorrt.__version__)"

1.4.4 安装 ONNX Runtime

ONNX Runtime 是微软推出的推理引擎,我们用它来验证 ONNX 模型的正确性。

pip install onnx onnxruntime-gpu

# 验证
python -c "import onnx; import onnxruntime; print('ONNX:', onnx.__version__); print('ONNX Runtime:', onnxruntime.__version__)"

1.4.5 环境验证脚本

最后,跑一个完整的验证脚本,确保所有组件都能协同工作。

import torch
import onnx
import tensorrt as trt
import onnxruntime

print("PyTorch version:", torch.__version__)
print("ONNX version:", onnx.__version__)
print("TensorRT version:", trt.__version__)
print("ONNX Runtime version:", onnxruntime.__version__)

# 检查 CUDA 是否可用
print("CUDA available:", torch.cuda.is_available())
print("CUDA version:", torch.version.cuda)

# 检查 TensorRT 推理引擎
logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(logger)
print("TensorRT builder created successfully")

如果所有版本都正常打印,没有报错,恭喜你——环境搭建完成!

1.5 本章知识体系总览

下面这张图,帮你把本章的核心逻辑串起来。

第一章知识体系:ONNX与TensorRT概述与环境搭建 第一章:课程导学与环境准备 ONNX 中间表示 TensorRT 推理引擎 模型导出与转换 CUDA 并行计算 cuDNN 加速库 ONNX Runtime TensorRT 核心流程 训练框架 → ONNX 导出 → TensorRT 优化 → 高性能推理

这张图展示了本章的核心逻辑:ONNX 作为模型中间表示,TensorRT 作为推理优化引擎,而 CUDA、cuDNN、ONNX Runtime 是支撑它们运行的基础环境。后面的课程,我们会沿着这个流程,一步步深入。

1.6 本章小结

这一章我们做了三件事:

  • 搞清楚了 ONNX 和 TensorRT 各自解决什么问题。
  • 明确了课程目标和应用场景。
  • 亲手搭建了完整的开发环境,并验证通过。

环境搭好了,后面的事就好办了。从下一章开始,我们会正式进入 ONNX 模型导出的实战环节。到时候,我会带着大家亲手操作,把 PyTorch 模型转成 ONNX,并解决那些常见的坑。

咱们下章见。