3、JetPack SDK详解:CUDA、cuDNN、TensorRT的版本对应关系、安装验证、多版本管理、环境变量配置

好,咱们进入正题。JetPack SDK,说白了就是NVIDIA给Jetson系列准备的“全家桶”。你拿到一块Jetson板子,想跑深度学习模型,光有硬件不行,得靠这套软件栈把硬件的潜力榨出来。我个人习惯把JetPack理解成“驱动+工具链+加速库”的集合体,缺一不可。

3.1 版本对应关系:别瞎配,会翻车

很多新手上来就问:“我能不能装最新的CUDA 12.x?” 嗯,在Jetson上,这事没那么简单。JetPack的版本是锁死的,它决定了你能用哪个版本的CUDA、cuDNN和TensorRT。我见过有人硬装不匹配的版本,结果系统直接起不来,只能刷机重来。

下面这张表,是我在实际项目中反复验证过的对应关系,你直接照着来就行:

JetPack版本 CUDA版本 cuDNN版本 TensorRT版本 L4T版本
JetPack 5.1.3 CUDA 11.4 cuDNN 8.6 TensorRT 8.5.2 L4T 35.4.1
JetPack 5.1.2 CUDA 11.4 cuDNN 8.6 TensorRT 8.5.2 L4T 35.3.1
JetPack 5.1.1 CUDA 11.4 cuDNN 8.6 TensorRT 8.5.1 L4T 35.3.1
JetPack 5.0.2 CUDA 11.4 cuDNN 8.6 TensorRT 8.5.0 L4T 35.1.0
JetPack 4.6.4 CUDA 10.2 cuDNN 8.2 TensorRT 8.2.1 L4T 32.7.4
⚠️ 警告: 千万别跨版本混装。比如JetPack 4.6的系统,你非要去装CUDA 11.x,那底层驱动根本认不出来,GPU直接罢工。我曾经在客户现场遇到过这种问题,排查了半天,最后发现是版本不匹配,白白浪费了一下午。

3.2 安装验证:装完别急着跑,先验货

装完JetPack之后,第一件事不是急着跑模型,而是验证每个组件是否正常工作。我有个习惯,三步走:

3.2.1 验证CUDA

先看看CUDA能不能认到设备:

# 查看CUDA版本
nvcc --version

# 查看GPU信息
nvidia-smi

# 跑一个简单的测试
cd /usr/local/cuda/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery

如果能看到你的Jetson设备信息,比如“Detected 1 CUDA Capable device(s)”,那就说明CUDA装好了。注意,Jetson上nvidia-smi的输出和桌面显卡不太一样,它显示的是Tegra芯片的信息,别觉得奇怪。

3.2.2 验证cuDNN

cuDNN是个库,没有独立的命令行工具。验证它最简单的方式是编译一个测试程序:

# 进入cuDNN samples目录
cp -r /usr/src/cudnn_samples_v8/ $HOME
cd $HOME/cudnn_samples_v8/mnistCUDNN
make clean && make
./mnistCUDNN

如果输出“Test passed!”,那就稳了。我记得第一次在Jetson上跑这个测试,看到“Test passed”的时候,心里那块石头才落地。

3.2.3 验证TensorRT

TensorRT的验证更直接,用它的自带工具:

# 查看TensorRT版本
dpkg -l | grep tensorrt

# 跑一个推理示例
cd /usr/src/tensorrt/samples/sampleMNIST
make
./sampleMNIST

能正常输出推理结果,说明TensorRT已经就绪。这里有个小细节:如果make报错,多半是路径问题,检查一下环境变量。

3.3 多版本管理:一个系统,多套工具链

实际项目中,你可能会遇到这种情况:项目A需要TensorRT 8.2,项目B需要TensorRT 8.5。怎么办?总不能每次刷机吧?

我推荐用符号链接切换法。说白了,就是把不同版本的库放在不同目录,然后用软链接指向当前要用的版本。

3.3.1 安装多版本

假设你已经通过JetPack装了默认版本,现在想装另一个版本:

# 下载TensorRT 8.2的deb包(从NVIDIA官网)
sudo dpkg -i tensorrt-8.2.1.8-ubuntu18.04-aarch64.deb

# 安装到指定目录
sudo mv /usr/lib/aarch64-linux-gnu/libnvinfer.so.8 /usr/lib/aarch64-linux-gnu/libnvinfer.so.8.2
sudo mv /usr/lib/aarch64-linux-gnu/libnvinfer.so /usr/lib/aarch64-linux-gnu/libnvinfer.so.8.2.link

3.3.2 切换版本

写一个切换脚本,方便管理:

#!/bin/bash
# switch_tensorrt.sh
VERSION=$1

if [ "$VERSION" == "8.2" ]; then
    sudo ln -sf /usr/lib/aarch64-linux-gnu/libnvinfer.so.8.2 /usr/lib/aarch64-linux-gnu/libnvinfer.so
    export TENSORRT_VERSION=8.2
elif [ "$VERSION" == "8.5" ]; then
    sudo ln -sf /usr/lib/aarch64-linux-gnu/libnvinfer.so.8.5 /usr/lib/aarch64-linux-gnu/libnvinfer.so
    export TENSORRT_VERSION=8.5
else
    echo "不支持的版本"
fi
💡 小技巧: 我习惯在~/.bashrc里加一个alias,比如alias trt82='source switch_tensorrt.sh 8.2',这样切换版本就是敲几个字母的事,省心。

3.4 环境变量配置:别让系统找不到路

环境变量配置不对,你编译代码时会疯狂报错“找不到头文件”或“找不到库”。说白了,就是系统不知道去哪找你装的东西。

3.4.1 核心环境变量

在~/.bashrc或~/.zshrc里加上这几行:

# CUDA
export CUDA_HOME=/usr/local/cuda
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH

# cuDNN
export CUDNN_HOME=/usr/lib/aarch64-linux-gnu
export LD_LIBRARY_PATH=$CUDNN_HOME:$LD_LIBRARY_PATH

# TensorRT
export TENSORRT_HOME=/usr/src/tensorrt
export LD_LIBRARY_PATH=$TENSORRT_HOME/lib:$LD_LIBRARY_PATH
export PATH=$TENSORRT_HOME/bin:$PATH

3.4.2 验证环境变量

配置完记得source一下:

source ~/.bashrc
echo $CUDA_HOME
echo $LD_LIBRARY_PATH

如果输出不是你期望的路径,检查一下是不是被其他配置覆盖了。我遇到过最坑的情况是,Anaconda的环境变量把系统路径给覆盖了,导致CUDA死活找不到。

🔑 核心要点:
  • 版本对应关系是铁律,别挑战它
  • 装完必须验证,别偷懒
  • 多版本管理用软链接,简单可靠
  • 环境变量配置完要source,然后检查

好了,这一章的内容就这些。你想想看,这些配置虽然琐碎,但都是基本功。我刚开始搞Jetson的时候,光环境变量就折腾了两天,后来才明白,这些细节才是决定项目能不能顺利推进的关键。下一章咱们聊聊如何用SDK Manager刷机,那又是另一番体验了。