Jetson Nano是NVIDIA推出的一款面向边缘AI开发的入门级开发板,搭载128核Maxwell架构GPU和四核Cortex-A57 CPU,功耗仅为5到10瓦,却能运行完整的CUDA生态。不过要在这块板子上跑通深度学习推理,第一步就是正确安装JetPack SDK,然后借助TensorRT对模型做加速优化。整个流程看似简单,实际操作中坑点不少,本文把完整步骤和关键注意事项梳理清楚。

一、JetPack SDK安装与系统环境准备
JetPack SDK是NVIDIA为Jetson系列开发板提供的软件开发包,包含Ubuntu系统镜像、CUDA Toolkit、cuDNN、TensorRT、OpenCV等一整套组件。对于Jetson Nano(A02和B01版本),安装JetPack最推荐的方式是直接使用SD卡镜像,而不是通过NVIDIA SDK Manager刷机,因为SD卡镜像方式简单可靠,适合个人开发者。
首先去NVIDIA官方开发者网站下载对应版本的Jetson Nano SD Card Image,通常是一个压缩包,解压后得到img镜像文件,大小在12GB左右。准备一张容量至少32GB、读写速度Class 10以上的TF卡,用Etcher或Win32DiskImager将镜像写入卡中。烧录过程大概需要十几分钟,写入完成后把TF卡插入Jetson Nano底部的卡槽,接上显示器、键盘鼠标和电源即可开机。首次启动会进入Ubuntu的图形化配置界面,设置好语言、时区、用户名密码后进入桌面。
进入系统后先验证组件是否安装完整。JetPack 4.x系列基于Ubuntu 18.04,自带CUDA 10.2、cuDNN 8和TensorRT 7.x。打开终端输入以下命令检查:
nvcc -V # 查看CUDA编译器版本 cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2 # 查看cuDNN版本 dpkg -l | grep TensorRT # 查看TensorRT安装情况 free -h # 查看内存,建议确认swap情况 jtop # 需pip安装jetson-stats,监控CPU/GPU/内存占用
这里强烈建议安装jetson-stats工具,它提供比系统自带监控更直观的资源面板,后续调试推理性能时离不开它。另外Jetson Nano只有4GB内存,默认swap只有2GB左右,跑大模型时很容易触发OOM被杀进程,建议把swap扩大到4GB以上,可以在TF卡上创建swap文件实现。电源方面务必使用5V4A的官方电源或优质的5V2A电源,供电不足会导致板子随机重启,这是新手最常见的坑。
二、模型准备与ONNX格式转换
TesnorRT不能直接读取PyTorch或TensorFlow的原始模型文件,需要先把模型转换为ONNX中间格式,再由TensorRT构建引擎。ONNX是开放的模型交换格式,几乎所有主流框架都支持导出。以PyTorch为例,导出ONNX模型的代码如下:
import torch
model = torchvision.models.resnet18(pretrained=True)
model.eval()
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(
model,
dummy_input,
"resnet18.onnx",
opset_version=11, # TensorRT 7.x建议使用opset 11
input_names=["input"],
output_names=["output"],
dynamic_axes={ # 固定batch为1,Jetson Nano性能有限
"input": {0: "batch_size"},
"output": {0: "batch_size"}
}
)导出时有几个细节需要注意。第一,输入尺寸最好固定,动态shape虽然灵活但会拖慢引擎构建速度,边缘设备一般batch size固定为1。第二,opset版本要与TensorRT版本匹配,TensorRT 7.x对opset 11支持较好,太高版本的opset可能包含不支持的算子。第三,导出后建议用onnx.checker.check_model验证模型结构,再用Netron工具可视化确认网络结构没有断裂。
如果模型包含自定义算子,TensorRT解析ONNX时可能报不支持的错误,这时需要编写插件或者精简网络结构。一个实用建议是:在PC端先用TensorRT的Python包做一次转换测试,把问题在开发阶段暴露出来,而不是直接在Jetson Nano上反复折腾,因为板子的引擎构建速度远慢于PC。
三、TensorRT引擎构建与加速推理实战
拿到ONNX模型后,下一步是在Jetson Nano上构建TensorRT引擎文件,也就是plan文件。引擎构建是一次性的离线过程,TensorRT会针对当前硬件做算子融合、精度校准和内核自动调优,因此生成的引擎文件不能跨GPU架构使用。Python版本的构建代码如下:
import tensorrt as trt
import pycuda.driver as cuda
import pycuda.autoinit
import numpy as np
logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(logger)
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
parser = trt.OnnxParser(network, logger)
with open("resnet18.onnx", "rb") as f:
if not parser.parse(f.read()):
for i in range(parser.num_errors):
print(parser.get_error(i))
config = builder.create_builder_config()
config.max_workspace_size = 1 << 30 # 1GB工作空间
engine = builder.build_engine(network, config)
with open("resnet18.engine", "wb") as f:
f.write(engine.serialize())引擎构建可能需要几分钟到几十分钟不等,取决于模型复杂度。构建完成后就可以执行推理了,基本流程是分配输入输出缓冲区、把数据从CPU拷贝到GPU、执行推理、取回结果:
import tensorrt as trt
import pycuda.driver as cuda
import pycuda.autoinit
import numpy as np
runtime = trt.Runtime(trt.Logger())
with open("resnet18.engine", "rb") as f:
engine = runtime.deserialize_cuda_engine(f.read())
context = engine.create_execution_context()
h_input = np.random.randn(1, 3, 224, 224).astype(np.float32)
d_input = cuda.mem_alloc(h_input.nbytes)
h_output = cuda.pagelocked_empty(1000, dtype=np.float32)
d_output = cuda.mem_alloc(h_output.nbytes)
cuda.memcpy_htod(d_input, h_input)
context.execute_v2([int(d_input), int(d_output)])
cuda.memcpy_dtoh(h_output, d_output)
print("预测类别ID:", np.argmax(h_output))精度方面可以在FP32、FP16和INT8之间选择。FP16在Jetson Nano的Maxwell架构上加速有限,实测部分模型只有10%到30%的提升,但显存占用能降低一半左右,这对4GB内存的板子很有价值。INT8量化理论上可以带来2到3倍加速,但需要准备校准数据集,且精度会略有下降,建议先用FP16跑通流程再考虑量化。实测以ResNet18为例,FP32推理单张耗时约25毫秒,FP16约18毫秒,配合摄像头流水线处理基本能达到30帧以上。
四、性能优化与常见问题处理
即使模型已经用TensorRT优化,实际部署中仍可能达不到预期帧率,这时要从整体数据流角度找瓶颈。首先是视频解码,Jetson Nano内置硬件解码器,用GStreamer配合nvv4l2decoder做硬件解码可以节省大量CPU资源,如果用OpenCV默认软解码,四个CPU核心很快就会被占满。其次是前后处理,图像resize、归一化等操作尽量放到GPU上完成,或者用Neon指令优化CPU实现。最后是内存拷贝,避免每帧都在CPU和GPU之间来回搬运大数据块,可以使用CUDA共享内存或者页锁定内存提升传输效率。
常见问题方面,第一类是引擎构建时崩溃或被杀,多半是内存不足,扩大swap后再构建;第二类是CUDA_ERROR_OUT_OF_MEMORY,需要检查是否同时运行了桌面环境的图形进程,可以切换到命令行模式释放显存;第三类是TensorRT与cuDNN版本不匹配的报错,切忌自行升级某个组件,Jetson平台的组件必须使用NVIDIA专门编译的ARM版本,全部跟随JetPack版本走才不会出问题。
最后一个实用建议是把整个推理程序做成开机自启动的系统服务,配合jetson-stats监控长期运行的稳定性。经过合理的模型选择、TensorRT加速和流水线优化,Jetson Nano完全可以在10瓦功耗内实现实时目标检测、人脸识别这类典型的边缘AI应用,性价比在同类开发板中相当突出。
Jetson NanoJetPack SDKTensorRT修改时间:2026-08-31 04:54:41