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 |
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
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刷机,那又是另一番体验了。