2. 开发环境搭建与工具链配置

Jetson 上的 TensorRT 推理部署,第一步不是写模型,而是把“板子—系统—JetPack—CUDA/cuDNN/TensorRT—开发语言环境—远程调试与监控”这条链路打通。Jetson 与普通 x86 服务器最大的区别在于:GPU 驱动、CUDA、cuDNN、TensorRT 以及 L4T(Linux for Tegra)内核是强绑定的,不能像 PC 上那样随意升级某一个组件。因此本节的核心思路是:先确定 JetPack 版本,再由 JetPack 反推 CUDA/cuDNN/TensorRT 版本,最后配置 Python/C++ 环境与远程工具。

2.1 刷机与 JetPack 安装

Jetson 出厂系统往往版本较旧,建议重新刷机以获得干净的 L4T 环境。刷机有两种主流方式:一是使用 NVIDIA SDK Manager 在 Ubuntu 主机上完成“刷机 + JetPack 组件安装”一体化流程;二是用 SDK Manager 只刷 L4T 系统,再用 apt 安装 JetPack 组件。以 Jetson Orin Nano 为例,典型流程如下:

# 在 Ubuntu 主机上安装 SDK Manager 后启动
sdkmanager

# 选择目标设备:Jetson Orin Nano
# 选择 JetPack 版本:例如 JetPack 6.0 (L4T 36.3)
# 勾选:Jetson Linux (L4T) + Jetson Runtime Components
# 将设备置于 Recovery 模式(按住 REC,点按 RESET,再松开 REC)
# 连接 USB-C 到主机,SDK Manager 识别后开始刷机

刷机完成后,设备首次启动会进入 Ubuntu 初始化界面。此时应确认 L4T 版本与 JetPack 版本一致:

cat /etc/nv_tegra_release
# 输出示例:R36 (release), REVISION: 3.0
dpkg -l | grep jetpack
# 输出示例:nvidia-jetpack 6.0

如果只刷了 L4T 而没有安装 JetPack 组件,可以执行 sudo apt update && sudo apt install nvidia-jetpack 完成 CUDA、cuDNN、TensorRT 等组件的安装。注意:不要手动 apt upgrade 内核或 CUDA 到非 JetPack 对应版本,否则容易出现驱动与运行时版本不匹配。

2.2 CUDA / cuDNN / TensorRT 版本匹配

JetPack 版本决定了 CUDA、cuDNN、TensorRT 的版本组合。下表给出常见 JetPack 与组件版本的对应关系(以官方发布为准,示例仅用于说明匹配逻辑):

JetPackL4TCUDAcuDNNTensorRT
5.1.235.411.48.68.5
6.036.312.28.98.6
6.136.412.49.010.0

验证版本是否匹配,最直接的方式是查看各组件版本号:

nvcc --version          # CUDA 编译器版本
dpkg -l | grep cudnn    # cuDNN 版本
dpkg -l | grep tensorrt # TensorRT 版本
python3 -c "import tensorrt; print(tensorrt.__version__)"

如果 TensorRT 的 Python 包版本与系统 TensorRT 不一致,推理时可能出现 API version mismatch 或 Unable to load library。此时应优先使用 JetPack 自带的 TensorRT,而不是 pip 安装的通用版本。对于需要自定义插件的场景,建议在 C++ 中直接链接系统 TensorRT,Python 侧通过 pycuda 或 cuda-python 调用。

2.3 Python 与 C++ 开发环境配置

Python 侧推荐使用虚拟环境隔离依赖,避免污染系统 Python:

sudo apt install python3-pip python3-venv
python3 -m venv ~/trt_env
source ~/trt_env/bin/activate
pip install numpy pycuda
# 注意:TensorRT Python 包通常由 JetPack 提供,不建议 pip 安装
python3 -c "import tensorrt as trt; print(trt.__version__)"

C++ 侧需要确保头文件与库路径正确。TensorRT 的头文件通常位于 /usr/include/aarch64-linux-gnu/,库文件位于 /usr/lib/aarch64-linux-gnu/。编译时使用 nvcc 或 g++ 并链接 -lnvinfer -lnvparsers -lcudart。一个最小验证程序如下:

#include <NvInfer.h>
#include <iostream>
int main() {
    std::cout << "TensorRT version: " << NV_TENSORRT_VERSION << std::endl;
    return 0;
}
// 编译:g++ test_trt.cpp -o test_trt -lnvinfer
// 运行:./test_trt

如果编译报错找不到 NvInfer.h,可用 find / -name "NvInfer.h" 2>/dev/null 定位,并在编译命令中通过 -I 指定路径。C++ 环境配置完成后,建议先用一个空 TensorRT 引擎加载测试,确认运行时库可正常加载。

2.4 远程调试与性能监控工具

Jetson 通常作为边缘设备部署,没有显示器,因此远程调试是必备能力。常用方式包括:

  • SSH + VS Code Remote:在主机 VS Code 中安装 Remote-SSH 插件,直接编辑 Jetson 上的代码并运行终端。
  • NVIDIA Nsight Systems:用于分析 CUDA 内核、TensorRT 推理和 CPU 调度的时序,命令为 nsys profile ./app。
  • tegrastats:Jetson 自带的实时监控工具,可查看 CPU/GPU 占用、内存、功耗、温度。例如 tegrastats --interval 1000 每秒输出一次。
  • jtop:基于 Python 的图形化监控工具,安装后执行 sudo jtop 可查看各硬件模块状态。

下面这张图展示了从刷机到远程监控的完整工具链关系,以及各组件之间的版本依赖方向:

Jetson 开发环境工具链与版本依赖关系 Jetson 设备 Orin Nano / Xavier NX SDK Manager 刷机 Recovery 模式 + USB-C L4T 系统 Ubuntu 20.04 / 22.04 JetPack 6.x 版本锚点:决定 CUDA / cuDNN / TensorRT 组合 CUDA 12.x nvcc / cudart GPU 并行计算基础 TensorRT 8.6 / 10.0 nvinfer / nvparsers 推理引擎与优化 cuDNN 8.9 / 9.0 深度神经网络加速库 卷积 / 池化 / 归一化 Python 环境 venv + numpy + pycuda tensorrt 包由 JetPack 提供 C++ 环境 g++ / nvcc + NvInfer.h -lnvinfer -lnvparsers -lcudart 远程调试与监控 SSH / VS Code Remote nsys / tegrastats / jtop 版本验证命令 nvcc --version | dpkg -l | grep tensorrt | python3 -c "import tensorrt; print(tensorrt.__version__)" 版本 强 绑定 主机 远程 连接

在实际操作中,建议按以下顺序检查环境是否可用:先确认 nvcc --version 与 JetPack 版本一致;再确认 TensorRT Python 包可导入且版本与系统一致;然后编译一个最小 C++ TensorRT 程序;最后用 tegrastats 观察推理时 GPU 占用与功耗是否正常。如果 tegrastats 显示 GPU 占用长期为 0,通常说明推理没有真正跑在 GPU 上,需要检查 TensorRT 引擎是否成功反序列化、CUDA 上下文是否创建。

提示:Jetson 上不要随意执行 apt upgrade 升级内核或 CUDA。如果必须升级,应通过 JetPack 整体升级,并重新验证 TensorRT 引擎兼容性。TensorRT 引擎与 GPU 架构、TensorRT 版本强相关,跨版本升级后通常需要重新生成引擎。
注意:如果使用 pip 安装了通用版 TensorRT,可能与 JetPack 自带的系统 TensorRT 冲突。建议在虚拟环境中卸载 pip 版 TensorRT,改用系统包,或通过 export PYTHONPATH=/usr/lib/python3.10/dist-packages:$PYTHONPATH 优先加载系统路径。