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% 的性能。
所以,业界提出了两个核心思路:
- 模型中间表示(Intermediate Representation, IR):比如 ONNX,让模型在不同框架之间「说同一种语言」。
- 推理优化引擎:比如 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 插件开发 |
课程目标很清晰:
- 掌握 ONNX 导出与调试:能处理常见的导出报错。
- 精通 TensorRT 优化流程:从 FP32 到 INT8,每一步都亲手操作。
- 能解决实际部署问题:比如动态 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 作为推理优化引擎,而 CUDA、cuDNN、ONNX Runtime 是支撑它们运行的基础环境。后面的课程,我们会沿着这个流程,一步步深入。
1.6 本章小结
这一章我们做了三件事:
- 搞清楚了 ONNX 和 TensorRT 各自解决什么问题。
- 明确了课程目标和应用场景。
- 亲手搭建了完整的开发环境,并验证通过。
环境搭好了,后面的事就好办了。从下一章开始,我们会正式进入 ONNX 模型导出的实战环节。到时候,我会带着大家亲手操作,把 PyTorch 模型转成 ONNX,并解决那些常见的坑。
咱们下章见。