《CUDA与TensorRT推理初探》

课程导入:学习目标、课程结构与环境准备

欢迎来到《CUDA与TensorRT推理初探》的第一章。在正式开始之前,我们需要先明确三个问题:这门课学什么、课程如何组织、以及你的机器上需要准备什么。本章将为你搭建一个清晰的学习框架,并完成环境搭建,确保后续每一章都能直接动手实践。

1.1 学习目标:从“能跑”到“懂原理”

CUDA 是 NVIDIA 提供的并行计算平台,TensorRT 则是基于 CUDA 构建的高性能推理优化引擎。很多初学者容易陷入两个极端:要么只调用 API 而不理解底层机制,要么深陷 GPU 架构细节而无法落地。本课程的目标是帮助你建立一条从原理到实践的完整链路,具体而言,完成本课程后你将能够:

  • 理解 GPU 并行计算模型:掌握线程层次(Grid/Block/Thread)、内存层次(全局/共享/寄存器)以及同步机制,能够分析一个 CUDA 程序的性能瓶颈。
  • 编写并优化 CUDA 内核:能够将简单的循环计算改写为 CUDA kernel,并运用内存合并访问、共享内存复用、避免 bank conflict 等技巧进行优化。
  • 掌握 TensorRT 推理流程:理解从模型解析、网络定义、优化构建到序列化部署的完整流程,能够将 PyTorch/ONNX 模型转换为 TensorRT 引擎。
  • 具备性能调优与排障能力:能够使用 Nsight Systems、Nsight Compute 等工具定位性能瓶颈,并处理常见的精度、显存、动态形状等问题。
学习建议:本课程强调“动手验证”。每章都配有可运行的代码示例,建议你在自己的 GPU 机器上逐行运行并修改参数,观察性能变化。不要只做“阅读者”,要做“实验者”。

1.2 课程结构:四阶段递进式学习

整个课程共 30 章,分为四个阶段,每个阶段都有明确的核心任务和产出物。下图展示了课程的整体架构与知识依赖关系:

阶段一:CUDA 基础 第 1-8 章 GPU 架构与编程模型 线程/内存层次 kernel 编写与调试 性能分析入门 阶段二:CUDA 进阶 第 9-15 章 共享内存与同步 流与并发 归约/扫描/矩阵乘法 多 GPU 编程 阶段三:TensorRT 第 16-24 章 ONNX 模型转换 引擎构建与序列化 FP16/INT8 量化 动态形状与多流推理 阶段四:实战 第 25-30 章 YOLOv8 部署 BERT 推理优化 综合项目 📌 知识依赖关系 CUDA C/C++ 基础 指针、内存管理 GPU 硬件架构 SM、显存带宽 TensorRT API Builder/Engine/Context 模型部署工具链 ONNX、PyTorch、trtexec • 阶段一、二为阶段三提供底层并行计算基础 • 阶段三的 TensorRT 优化依赖对 CUDA 内存模型的理解 • 阶段四综合运用前三个阶段的知识完成真实项目 • 每章末尾的“动手实验”环节是巩固知识的关键

课程结构的设计遵循“基础 → 进阶 → 框架 → 实战”的递进逻辑。前两个阶段聚焦 CUDA 本身,后两个阶段聚焦 TensorRT 推理优化。每个阶段内部章节之间也有依赖关系,例如第 5 章的“共享内存”需要第 3 章的“线程层次”作为基础。建议你按照顺序学习,不要跳跃。

1.3 环境准备:CUDA 与 TensorRT 安装

在开始编码之前,我们需要确保你的开发环境满足以下要求。这里我们以 Ubuntu 22.04 + NVIDIA 驱动 + CUDA 12.x + TensorRT 8.6 为例,其他系统(Windows、WSL2)的安装步骤类似,但命令略有差异。

1.3.1 硬件与驱动检查

首先确认你的机器有 NVIDIA GPU,并且驱动已正确安装。在终端执行:

# 查看 GPU 型号
nvidia-smi

# 如果显示类似以下信息,说明驱动正常
# +-----------------------------------------------------------------------------+
# | NVIDIA-SMI 525.85.12    Driver Version: 525.85.12    CUDA Version: 12.0      |
# |-------------------------------+----------------------+----------------------+
# | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
# |===============================+======================+======================|
# |   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
# +-------------------------------+----------------------+----------------------+

如果 nvidia-smi 无法运行,请先安装 NVIDIA 驱动。注意:驱动版本必须支持你将要安装的 CUDA 版本。例如 CUDA 12.x 需要驱动版本 ≥ 525。

1.3.2 安装 CUDA Toolkit

CUDA Toolkit 包含编译器(nvcc)、运行时库和开发工具。推荐使用 runfile 方式安装,以便自定义安装路径:

# 下载 CUDA 12.1 runfile(约 2.5GB)
wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda_12.1.0_530.30.02_linux.run

# 执行安装,注意不要安装驱动(如果已装好)
sudo sh cuda_12.1.0_530.30.02_linux.run --toolkit --silent --override

# 配置环境变量(添加到 ~/.bashrc)
export PATH=/usr/local/cuda-12.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:$LD_LIBRARY_PATH

# 验证安装
nvcc --version
# 应输出:Cuda compilation tools, release 12.1, V12.1.105
常见错误:如果 nvcc --version 提示找不到命令,说明 PATH 未正确配置。请检查 /usr/local/cuda-12.1/bin 是否存在,并重新 source ~/.bashrc。另外,不要同时安装多个 CUDA 版本,以免环境变量冲突。

1.3.3 安装 TensorRT

TensorRT 的安装有两种方式:deb 包(推荐)和 tar 包。deb 包会自动处理依赖关系,但需要注册 NVIDIA 开发者账号。这里以 tar 包为例,更通用:

# 从 NVIDIA 官网下载 TensorRT 8.6 GA(需要登录)
# 下载文件:TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-12.0.tar.gz

# 解压到 /opt
sudo tar -xzf TensorRT-8.6.1.6.Linux.x86_64-gnu.cuda-12.0.tar.gz -C /opt

# 配置环境变量
export LD_LIBRARY_PATH=/opt/TensorRT-8.6.1.6/lib:$LD_LIBRARY_PATH
export PATH=/opt/TensorRT-8.6.1.6/bin:$PATH

# 验证安装
trtexec --version
# 应输出类似:TensorRT version: 8.6.1.6

1.3.4 Python 环境(可选但推荐)

本课程大部分实验使用 Python 调用 CUDA 和 TensorRT。建议使用 conda 创建独立环境:

conda create -n cuda_trt python=3.10 -y
conda activate cuda_trt

# 安装 PyTorch(CUDA 12.1 版本)
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121

# 安装 TensorRT Python API
pip install /opt/TensorRT-8.6.1.6/python/tensorrt-8.6.1-cp310-none-linux_x86_64.whl

# 验证
python -c "import tensorrt as trt; print(trt.__version__)"
# 应输出:8.6.1.6

1.4 环境验证清单

为了确保后续章节的代码能够顺利运行,请在开始学习前逐项检查以下清单:

检查项 命令/方法 预期结果
GPU 驱动 nvidia-smi 显示 GPU 型号和驱动版本
CUDA 编译器 nvcc --version 显示 CUDA 12.x 版本号
TensorRT 命令行 trtexec --version 显示 TensorRT 8.6.x
PyTorch GPU 可用 python -c "import torch; print(torch.cuda.is_available())" 输出 True
TensorRT Python API python -c "import tensorrt as trt; print(trt.__version__)" 输出 8.6.x
快速自测:如果上述 5 项全部通过,说明你的环境已经就绪。如果某一项失败,请根据错误信息回溯安装步骤。最常见的两个问题是:① 驱动版本过旧导致 CUDA 无法识别 GPU;② 环境变量未生效导致命令找不到。建议将环境变量配置写入 ~/.bashrc 并执行 source ~/.bashrc。

1.5 常见误区与复盘

在多年的教学和工程实践中,我们发现初学者在环境准备阶段最容易犯以下错误,这里提前为你避坑:

  • 误区一:盲目安装最新版 CUDA。最新版 CUDA 可能不兼容你的驱动或 TensorRT 版本。建议使用 LTS 版本(如 CUDA 12.1/12.2),并确保驱动版本 ≥ 525。
  • 误区二:混淆“驱动 CUDA 版本”和“Toolkit 版本”。nvidia-smi 显示的 CUDA Version 是驱动支持的最高版本,不代表你已安装 Toolkit。必须单独安装 CUDA Toolkit 才能使用 nvcc。
  • 误区三:TensorRT 版本与 CUDA 版本不匹配。TensorRT 8.6 支持 CUDA 11.x 和 12.x,但不同小版本有差异。下载时务必选择与你的 CUDA 版本对应的包。
  • 误区四:忽略 Python 虚拟环境。直接在系统 Python 中安装 PyTorch 和 TensorRT 容易导致依赖冲突。强烈建议使用 conda 或 venv 隔离环境。

如果你在安装过程中遇到问题,不要慌张。绝大多数问题都可以通过以下步骤解决:① 检查驱动版本;② 确认环境变量;③ 查看官方文档的 Troubleshooting 部分。记住:环境搭建是每个 CUDA 开发者必经的“第一道坎”,跨过去之后,后面的学习会顺畅很多。