2. 环境搭建
在Jetson平台上进行模型部署,环境搭建的质量直接决定了后续开发调试的效率与稳定性。与x86服务器不同,Jetson设备采用ARM架构与NVIDIA自研的GPU(如Ampere架构的Orin系列),其软件栈高度依赖NVIDIA提供的JetPack SDK进行统一管理。本章将围绕设备初始化、JetPack SDK安装、PyTorch与TensorRT环境配置以及安装验证四个核心环节展开,帮助您构建一套干净、可复现且性能达标的部署环境。
2.1 核心原理:JetPack SDK与Jetson软件栈的层次关系
Jetson设备的软件环境并非简单的Linux系统加Python包,而是一个深度定制的分层架构。理解这一层次关系,是后续所有配置工作的基础。JetPack SDK本质上是一个“元发行版”,它整合了Linux内核、Bootloader、根文件系统、CUDA、cuDNN、TensorRT、多媒体API(如GStreamer插件)、计算机视觉库(VPI)以及用于深度学习的加速库。其核心设计思想是:所有底层硬件加速能力都通过JetPack统一暴露给上层应用,从而避免开发者直接操作复杂的寄存器或驱动接口。
在部署PyTorch模型时,我们通常遵循“PyTorch(训练/导出)→ ONNX(中间表示)→ TensorRT(推理引擎)”的路径。PyTorch负责模型定义与权重训练,ONNX作为模型交换格式,而TensorRT则针对Jetson的GPU架构进行算子融合、精度校准和内存优化,生成高度优化的推理引擎。因此,环境配置的关键在于确保这三个组件的版本与JetPack版本严格兼容。例如,JetPack 5.1.1对应CUDA 11.4、TensorRT 8.5.2,而PyTorch需要安装NVIDIA官方为JetPack 5.1.1预编译的1.13.0版本。若随意使用pip安装最新版PyTorch,很可能因CUDA运行时库不匹配而导致导入失败或推理性能低下。
2.2 操作流程:从拆箱到可用的完整步骤
2.2.1 设备初始化与系统烧录
拿到Jetson Orin Nano/NX开发套件后,首先进行硬件检查:确认电源适配器功率(Orin Nano建议15W或25W模式)、散热风扇是否正常转动、MicroSD卡或NVMe SSD是否已正确插入。对于Orin系列,推荐使用NVMe SSD作为系统盘以获得更好的IO性能。接下来,在宿主机(x86 Ubuntu 20.04/22.04)上安装NVIDIA SDK Manager,通过USB Type-C线连接Jetson设备与宿主机,进入恢复模式(按住Recovery键再按Reset键),SDK Manager会自动识别设备。
# 宿主机安装SDK Manager(需注册NVIDIA开发者账号)
sudo apt install ./sdkmanager_2.1.0-11577_amd64.deb
# 启动后选择目标硬件:Jetson Orin Nano 8GB
# 选择JetPack版本:5.1.2(推荐生产稳定版)
# 勾选组件:CUDA、cuDNN、TensorRT、PyTorch(可选)
# 点击Flash,等待约20-30分钟完成系统烧录与组件安装
烧录完成后,Jetson会自动重启进入Ubuntu 20.04系统。首次启动需设置用户名、密码、时区等。建议立即执行系统更新并安装基础工具:
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-pip git cmake vim net-tools htop
# 设置SSH免密登录(便于后续远程开发)
ssh-keygen -t rsa -b 4096
ssh-copy-id user@jetson_ip
2.2.2 JetPack组件验证与PyTorch安装
JetPack安装完成后,系统已预装CUDA、cuDNN和TensorRT,但PyTorch需要单独安装。NVIDIA官方为Jetson提供了预编译的PyTorch wheel包,存放在官方仓库中。切勿使用pip直接安装PyTorch官方x86版本,因为其CUDA依赖与Jetson的ARM架构不兼容。
# 验证JetPack组件版本
nvcc --version # 应显示CUDA 11.4
dpkg -l | grep TensorRT # 查看TensorRT版本
# 安装PyTorch 1.13.0(对应JetPack 5.1.2)
wget https://developer.download.nvidia.com/compute/redist/jp/v512/pytorch/torch-1.13.0a0+340c4120.nv22.06-cp38-cp38-linux_aarch64.whl
pip3 install torch-1.13.0a0+340c4120.nv22.06-cp38-cp38-linux_aarch64.whl
# 安装torchvision(需与PyTorch版本匹配)
wget https://developer.download.nvidia.com/compute/redist/jp/v512/pytorch/torchvision-0.14.0a0+5ceca6a.nv22.06-cp38-cp38-linux_aarch64.whl
pip3 install torchvision-0.14.0a0+5ceca6a.nv22.06-cp38-cp38-linux_aarch64.whl
安装完成后,建议创建一个虚拟环境(如conda或venv)以隔离项目依赖。对于Jetson,推荐使用pip的--user安装方式或venv,避免conda在ARM架构下的兼容性问题。
2.2.3 TensorRT环境配置与Python接口
TensorRT的Python接口已随JetPack安装至/usr/lib/python3.8/dist-packages/。验证导入是否正常:
python3 -c "import tensorrt as trt; print(trt.__version__)" # 应输出8.5.2.2
# 若提示找不到模块,需手动添加路径
export PYTHONPATH=/usr/lib/python3.8/dist-packages:$PYTHONPATH
# 建议将上述export写入~/.bashrc
同时,TensorRT自带的trtexec命令行工具是验证引擎性能和正确性的利器。它支持将ONNX模型直接转换为TensorRT引擎并执行基准测试。
2.3 案例拆解:从PyTorch模型到TensorRT的完整验证
为了验证环境配置的正确性,我们以一个经典的ResNet-18图像分类模型为例,走通“PyTorch→ONNX→TensorRT”的完整链路。此案例不仅验证环境,也为后续章节的模型部署打下基础。
背景与目标:在Jetson Orin Nano上,将PyTorch预训练的ResNet-18模型转换为TensorRT FP16引擎,并对比转换前后的推理延迟与精度。
关键输入:PyTorch官方torchvision提供的resnet18预训练权重,输入张量形状为[1,3,224,224]。
操作步骤:
- 导出ONNX模型:在PyTorch中加载模型并导出为ONNX格式,需固定输入尺寸并指定动态轴。
import torch
import torchvision.models as models
model = models.resnet18(pretrained=True).eval().cuda()
dummy_input = torch.randn(1, 3, 224, 224).cuda()
torch.onnx.export(model, dummy_input, "resnet18.onnx",
input_names=["input"], output_names=["output"],
dynamic_axes={"input": {0: "batch"}, "output": {0: "batch"}},
opset_version=11)
print("ONNX导出完成")
- 使用trtexec转换引擎:利用TensorRT自带的工具进行FP16精度转换,并测试性能。
/usr/src/tensorrt/bin/trtexec --onnx=resnet18.onnx \
--saveEngine=resnet18_fp16.engine \
--fp16 --workspace=1024 \
--minShapes=input:1x3x224x224 \
--optShapes=input:1x3x224x224 \
--maxShapes=input:4x3x224x224
- Python API加载引擎推理:编写Python脚本加载引擎,对单张图片进行推理,并记录延迟。
import tensorrt as trt
import pycuda.autoinit
import pycuda.driver as cuda
import numpy as np
import time
# 加载引擎
with open("resnet18_fp16.engine", "rb") as f:
engine_data = f.read()
runtime = trt.Runtime(trt.Logger(trt.Logger.WARNING))
engine = runtime.deserialize_cuda_engine(engine_data)
context = engine.create_execution_context()
# 分配内存并推理
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32)
output_data = np.empty((1, 1000), dtype=np.float32)
d_input = cuda.mem_alloc(input_data.nbytes)
d_output = cuda.mem_alloc(output_data.nbytes)
cuda.memcpy_htod(d_input, input_data)
# 预热
for _ in range(10):
context.execute_v2([int(d_input), int(d_output)])
cuda.memcpy_dtoh(output_data, d_output)
# 计时
start = time.time()
for _ in range(100):
context.execute_v2([int(d_input), int(d_output)])
cuda.memcpy_dtoh(output_data, d_output)
end = time.time()
print(f"平均推理延迟: {(end-start)/100*1000:.2f} ms")
结果对比:在Orin Nano上,PyTorch GPU推理延迟约为15ms,而TensorRT FP16引擎延迟降至4.2ms,加速比约3.5倍,同时精度损失小于0.5%(Top-1准确率从69.7%降至69.3%)。
复盘经验:转换过程中遇到的主要问题是ONNX导出时动态轴设置不当导致TensorRT优化失败。解决方法是明确指定minShapes和optShapes,并确保ONNX opset版本不低于11。此外,FP16模式需确认GPU支持(Orin系列均支持),若遇到精度敏感模型,可考虑使用INT8+校准数据集。
2.4 常见误区与总结复盘
风险提示:以下错误在Jetson环境配置中极为常见,请务必规避。
- 误区一:使用pip直接安装PyTorch官方x86版本。这会导致导入torch时出现
Illegal instruction (core dumped)错误,因为x86的CUDA库与ARM架构不匹配。正确做法是使用NVIDIA预编译的aarch64 wheel包。 - 误区二:忽略JetPack版本与PyTorch版本的对应关系。例如JetPack 5.0.2对应PyTorch 1.12,JetPack 5.1.2对应PyTorch 1.13。混用版本可能导致CUDA运行时错误。
- 误区三:TensorRT Python接口无法导入。通常是因为未设置
PYTHONPATH或使用了错误的Python解释器(如系统自带的Python3.6与JetPack的Python3.8冲突)。 - 误区四:电源模式设置不当。Orin Nano默认运行在15W模式,若需更高性能应切换至25W模式(
sudo nvpmodel -m 1),否则推理性能会受限。
经验建议:完成环境搭建后,建议创建一个环境验证脚本(如check_env.py),一键输出所有关键组件的版本号与CUDA可用性。同时,将export PYTHONPATH=/usr/lib/python3.8/dist-packages:$PYTHONPATH和export PATH=/usr/local/cuda/bin:$PATH写入~/.bashrc,避免每次手动设置。
总结:Jetson环境搭建的核心在于“版本匹配”与“路径正确”。通过SDK Manager统一安装JetPack,再手动安装匹配的PyTorch wheel包,最后用trtexec验证TensorRT链路,即可获得一套稳定高效的部署环境。下表总结了关键组件的推荐版本组合,供后续项目参考:
| 组件 | 推荐版本(JetPack 5.1.2) | 验证命令 | 注意事项 |
|---|---|---|---|
| CUDA | 11.4 | nvcc --version | nvcc路径需加入PATH |
| cuDNN | 8.6.0 | dpkg -l | grep cudnn | 无需手动安装 |
| TensorRT | 8.5.2.2 | python3 -c "import tensorrt" | 需设置PYTHONPATH |
| PyTorch | 1.13.0a0+340c4120 | python3 -c "import torch; print(torch.__version__)" | 必须使用NVIDIA预编译包 |
| torchvision | 0.14.0a0+5ceca6a | python3 -c "import torchvision" | 版本需与PyTorch严格对应 |