4、部署环境搭建:JetPack SDK、CUDA、cuDNN、TensorRT、PyTorch/ONNX 等组件的安装与版本匹配

Jetson 平台的部署环境搭建,本质上是在嵌入式 Linux 系统上构建一套完整的 AI 计算软件栈。与 x86 服务器不同,Jetson 的软件环境高度依赖 NVIDIA 提供的 JetPack SDK 进行统一管理。JetPack 并非单一工具,而是一个集成了 Linux 内核、根文件系统、CUDA、cuDNN、TensorRT、多媒体 API 以及多种开发库的发行版。理解 JetPack 的版本体系与各组件之间的依赖关系,是避免“装完即崩、跑起来报错”的关键前提。本章将围绕版本匹配逻辑、安装流程、PyTorch/ONNX 生态的接入方式以及常见排障展开。

Jetson 部署环境组件依赖与版本匹配链路 JetPack SDK(版本统一入口) CUDA / cuDNN TensorRT 多媒体/其他库 PyTorch (ARM) ONNX / ONNX Runtime TensorFlow (可选) TensorRT Engine(.engine / .trt) 版本匹配核心:JetPack 版本 → CUDA/cuDNN/TensorRT 版本 → PyTorch/ONNX 版本

上图展示了 Jetson 部署环境的核心依赖链路。JetPack SDK 作为版本锚点,决定了底层 CUDA、cuDNN 与 TensorRT 的版本;而 PyTorch、ONNX Runtime 等上层框架必须与这些底层库严格兼容。在实际部署中,最常见的错误是直接在 Jetson 上使用 pip install torch 安装 x86 版本的 PyTorch,导致无法调用 CUDA。因此,理解这条链路是搭建环境的第一步。

4.1 核心原理:JetPack 版本与组件版本的强绑定关系

JetPack SDK 的版本号与 Jetson 的硬件平台(Xavier、Orin 等)以及 L4T(Linux for Tegra)内核版本紧密关联。NVIDIA 为每个 JetPack 版本预编译了匹配的 CUDA、cuDNN、TensorRT 库,并放置在系统路径中。例如,JetPack 5.1 对应 CUDA 11.4、cuDNN 8.6、TensorRT 8.5;而 JetPack 6.0 则升级到 CUDA 12.2、cuDNN 8.9、TensorRT 8.6。这种强绑定意味着:你不能单独升级 CUDA 版本而不影响 TensorRT 的可用性。因为 TensorRT 在编译时链接了特定版本的 CUDA 运行时库,如果 CUDA 版本不匹配,TensorRT 初始化会直接失败。

对于 PyTorch 而言,NVIDIA 官方提供了针对 Jetson 预编译的 wheel 包(通常通过 pip install torch 配合特定 index-url 获取)。这些 wheel 包内部链接了 Jetson 上的 CUDA 库,但依赖 JetPack 中已有的 CUDA 运行时。因此,安装 PyTorch 前必须确认 JetPack 版本,并选择对应的 PyTorch 版本。例如,JetPack 5.x 对应 PyTorch 1.13 或 2.0,而 JetPack 6.0 对应 PyTorch 2.3 或更高。若版本不匹配,轻则无法导入 torch,重则导致 CUDA 上下文崩溃。

关键认知:JetPack 是一个整体,不是可随意拼装的积木。在 Jetson 上,apt-get install nvidia-jetpack 是安装全部组件的推荐方式,它会自动处理依赖关系。手动单独安装 CUDA 或 TensorRT 极易破坏系统库的符号链接,导致运行时找不到 libcudart.so 或 libnvinfer.so。

4.2 判断方法与操作流程:从零搭建部署环境

搭建环境的流程可以归纳为四个阶段:系统烧录 → JetPack 安装 → 验证底层库 → 安装上层框架。以下以 Jetson Orin Nano 开发套件(JetPack 6.0)为例,给出完整操作路径。

阶段一:烧录系统与 JetPack

使用 NVIDIA SDK Manager 工具(x86 主机上运行)或直接使用 balenaEtcher 烧录预编译的 JetPack SD 卡镜像。推荐使用 SDK Manager,因为它能自动下载匹配的镜像并写入。烧录完成后,Jetson 首次启动会进入 Ubuntu 20.04/22.04 桌面环境,此时 JetPack 核心组件已预装。

阶段二:验证 CUDA、cuDNN、TensorRT

打开终端,执行以下命令验证版本:

# 检查 CUDA
nvcc --version
# 输出应包含 Cuda compilation tools, release 12.2

# 检查 cuDNN
dpkg -l | grep cudnn
# 应看到 libcudnn8 及版本号

# 检查 TensorRT
dpkg -l | grep tensorrt
# 应看到 libnvinfer8 及版本号

# 检查 JetPack 版本
cat /etc/nv_tegra_release
# 输出包含 R35 或 R36 等版本标识

如果 nvcc 命令找不到,需要将 CUDA 路径加入环境变量:

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

建议将上述两行写入 ~/.bashrc 以永久生效。

阶段三:安装 PyTorch 与 torchvision

Jetson 的 PyTorch 不能从 PyPI 直接安装,必须使用 NVIDIA 的预编译 wheel。访问 NVIDIA 官方论坛 获取对应 JetPack 版本的下载链接。以 JetPack 6.0 为例:

# 安装依赖
sudo apt-get install python3-pip libopenblas-dev libopenmpi-dev

# 安装 PyTorch(示例版本 2.3.0)
pip install --no-cache-dir torch-2.3.0-cp310-cp310-linux_aarch64.whl

# 安装 torchvision(需与 PyTorch 版本匹配)
pip install --no-cache-dir torchvision-0.18.0-cp310-cp310-linux_aarch64.whl

安装完成后,验证 CUDA 是否可用:

python3 -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"

若输出 True 和 Orin Nano,则说明 PyTorch 已正确调用 CUDA。

阶段四:安装 ONNX 与 ONNX Runtime

ONNX 作为模型交换格式,通常配合 ONNX Runtime 或 TensorRT 使用。安装 ONNX 相对简单:

pip install onnx onnxruntime-gpu

但需注意,onnxruntime-gpu 的版本必须与 CUDA/cuDNN 兼容。例如,onnxruntime 1.17 要求 CUDA 12.x,与 JetPack 6.0 匹配。若使用 JetPack 5.x,则需安装 onnxruntime-gpu==1.14 或更低版本。

JetPack 版本 CUDA cuDNN TensorRT PyTorch 推荐版本 ONNX Runtime 推荐版本
JetPack 5.1 11.4 8.6 8.5 1.13 / 2.0 1.14
JetPack 6.0 12.2 8.9 8.6 2.3 / 2.4 1.17+

4.3 案例拆解:从 PyTorch 模型到 TensorRT 的完整环境验证

以下案例展示了一个典型的部署环境验证流程,帮助读者确认所有组件协同工作。假设我们有一个训练好的 PyTorch 语义分割模型(如 DeepLabV3),目标是在 Jetson 上通过 TensorRT 加速推理。

背景与约束:使用 Jetson Orin Nano 8GB,JetPack 6.0,PyTorch 2.3,TensorRT 8.6。模型输入为 512×512 的 RGB 图像,输出为 512×512 的类别掩码。

初始现象:直接使用 PyTorch 加载模型进行推理,帧率仅为 8 FPS,无法满足实时性要求(目标 25 FPS)。

分析判断:PyTorch 的 eager 模式在 Jetson 上无法充分利用 TensorRT 的算子融合和低精度推理能力。需要将模型转换为 ONNX,再通过 TensorRT 构建 engine。

操作步骤:

  1. 导出 ONNX:在 x86 主机或 Jetson 上,使用 PyTorch 的 torch.onnx.export 导出模型。注意设置 opset_version=17 以兼容 TensorRT 8.6。
  2. 验证 ONNX 模型:使用 onnxruntime-gpu 加载 ONNX 模型,对比输出与 PyTorch 原始输出的差异(容忍误差 1e-3)。
  3. 构建 TensorRT Engine:使用 trtexec 工具或 Python API 构建 engine。命令示例:
trtexec --onnx=deeplabv3.onnx --saveEngine=deeplabv3.engine --fp16 --workspace=2048

其中 --fp16 启用半精度推理,--workspace 设置显存上限(MB)。

  1. 加载 Engine 推理:使用 PyTorch 的 torch.utils.cpp_extension 或直接调用 TensorRT Python API 加载 engine。实测帧率提升至 32 FPS,满足要求。

结果对比:

推理后端 帧率 (FPS) 显存占用 (MB) 精度 (mIoU)
PyTorch (FP32) 8 1800 0.72
ONNX Runtime (FP32) 12 1600 0.72
TensorRT (FP16) 32 950 0.71

风险与代价:FP16 推理导致 mIoU 下降 0.01,在语义分割任务中可接受。若任务对精度敏感,可尝试 INT8 量化,但需要校准数据集,且精度损失可能更大。

复盘经验:环境搭建的核心不是“装好”,而是“验证好”。每次安装新组件后,都应运行一个最小化的 CUDA 程序(如 torch.cuda.is_available())确认链路通畅。此外,TensorRT 的构建参数(如 workspace 大小)直接影响显存占用,需根据实际模型大小调整。

4.4 常见误区与总结复盘

在 Jetson 环境搭建中,以下误区最为常见:

  • 误区一:使用 pip 直接安装 torch。PyPI 上的 torch 是 x86 版本,安装后无法导入或无法使用 CUDA。必须使用 NVIDIA 提供的 aarch64 wheel。
  • 误区二:升级 CUDA 到最新版本。Jetson 的 CUDA 由 JetPack 锁定,手动升级会导致 TensorRT 和 cuDNN 的符号链接失效。如需新 CUDA 特性,应升级整个 JetPack。
  • 误区三:忽略 cuDNN 的授权问题。cuDNN 需要 NVIDIA 开发者账号下载,但 JetPack 预装版本已包含授权,无需额外操作。若手动安装,可能遇到 license 错误。
  • 误区四:混淆 TensorRT 版本与 ONNX opset 版本。TensorRT 8.6 支持 ONNX opset 17,但若使用 opset 18 或更高,可能导致解析失败。导出 ONNX 时务必确认 opset 版本。
风险提示:在 Jetson 上执行 apt-get upgrade 可能会意外升级 CUDA 或 TensorRT 相关包,导致版本不匹配。建议在 /etc/apt/preferences.d/ 中锁定 nvidia 相关包的版本,或使用 apt-mark hold 固定关键包。

总结复盘:部署环境搭建的核心原则是“版本对齐、验证先行”。建议读者在完成安装后,创建一个环境检查脚本,一次性输出所有关键组件的版本号,并运行一个简单的 CUDA 张量运算测试。这样在后续开发中,一旦出现异常,可以快速定位是环境问题还是代码问题。此外,对于生产环境,建议使用 Docker 容器(如 nvcr.io/nvidia/l4t-jetpack:r36.2.0)来隔离环境,避免系统库被污染。容器化部署虽然增加了一点镜像体积,但能显著提升环境复现的可靠性。