2、开发环境搭建:NVIDIA Jetson平台介绍、JetPack SDK安装、TensorRT安装与验证、交叉编译环境配置

好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说实话,环境搭建这事儿,看着琐碎,但真踩过坑的人都知道——这一步要是没弄好,后面调试起来能让你怀疑人生。我当年第一次用Jetson的时候,光一个交叉编译工具链就折腾了两天,后来发现是版本没对齐。嗯,咱们今天就把这些坑提前填上。

2.1 NVIDIA Jetson平台介绍

先说说Jetson是什么。它本质上是一块嵌入式的AI超级计算机。你想想看,一个巴掌大的板子,能跑完整的深度学习模型,还能做实时推理,这在几年前是不敢想的。

目前主流的Jetson型号有这么几款:

型号 AI算力 典型功耗 适用场景
Jetson Nano 472 GFLOPS 5W-10W 入门级AI、轻量模型
Jetson TX2 1.33 TFLOPS 7.5W-15W 无人机、机器人
Jetson Xavier NX 21 TOPS 10W-20W 边缘计算、多路视频
Jetson AGX Orin 275 TOPS 15W-60W 自动驾驶、工业检测

我个人习惯把Jetson分成两类:一类是Nano和TX2这种“够用就好”的,适合原型验证;另一类是Xavier和Orin系列,真正能扛生产负载的。你在选型的时候,别光看算力,还得看功耗和散热。我在项目中遇到过,有人用Orin跑一个轻量模型,结果风扇呼呼转,功耗全浪费了——说白了,杀鸡用牛刀。

2.2 JetPack SDK安装

JetPack是什么?它是NVIDIA官方为Jetson定制的全套开发包。里面包含了Linux系统、CUDA、cuDNN、TensorRT,还有各种多媒体库。你不需要一个个去装,一个JetPack全搞定。

安装方式有两种:

  • SDK Manager方式(推荐):在PC主机上装NVIDIA SDK Manager,通过USB连接Jetson,一键刷机。
  • 手动刷机方式:下载镜像文件,用balenaEtcher烧录到SD卡或NVMe硬盘上。

我建议你用SDK Manager。为什么?因为它会自动帮你匹配版本。我曾经手贱,手动装了CUDA 11.4,结果TensorRT只支持11.3,折腾了一下午才发现是版本不兼容。SDK Manager就不会犯这种错。

小提示:刷机前记得把Jetson板子进入恢复模式。具体操作:按住RECOVERY键,再按一下RESET,保持RECOVERY键2秒后松开。然后连上USB线,在PC上运行 lsusb,看到“NVIDIA Corp.”就对了。

2.3 TensorRT安装与验证

JetPack装好之后,TensorRT其实已经在了。你可以在Jetson上执行:

dpkg -l | grep tensorrt

如果看到类似 libnvinfer8tensorrt 这样的包,说明已经装好了。但咱们得验证一下它能不能用。

写一个简单的Python脚本来测试:

import tensorrt as trt
print(trt.__version__)
print(trt.Builder(trt.Logger(trt.Logger.WARNING)) is not None)

如果输出版本号并且返回True,恭喜你,TensorRT已经就绪。

注意:如果你是在PC上开发,想在PC上装TensorRT做模型转换,那需要单独下载TensorRT的deb包或tar包。PC版和Jetson版的TensorRT不完全一样——PC版支持更多的精度模式,但Jetson版对硬件优化更好。别搞混了。

我记得有一次,我在PC上把模型转成了FP16的TensorRT引擎,拿到Jetson上死活跑不起来。后来才发现,PC上的TensorRT版本比Jetson上的高了一个小版本,序列化格式不兼容。从那以后,我都是先在Jetson上装好环境,再在Jetson上做转换。省心。

2.4 交叉编译环境配置

为什么要交叉编译?因为Jetson的CPU性能有限,直接在板子上编译大型项目(比如OpenCV、PyTorch)能等得你花儿都谢了。交叉编译就是在PC上编译出能在Jetson上运行的二进制文件,然后传过去直接用。

配置交叉编译环境,核心是装好这几个东西:

  • 交叉编译工具链:比如 aarch64-linux-gnu-g++
  • Jetson的根文件系统:从Jetson上把 /lib/usr 等目录拷贝到PC上
  • CMake工具链文件:告诉CMake用哪个编译器、链接哪个库

一个典型的CMake工具链文件长这样:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)

set(CMAKE_FIND_ROOT_PATH /path/to/jetson/rootfs)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

然后编译的时候,加上 -DCMAKE_TOOLCHAIN_FILE=你的工具链文件.cmake 就行了。

核心要点:交叉编译最怕的就是动态库版本不一致。你在PC上链接的libcudart.so版本,必须和Jetson上的一致。否则编译通过,运行时报错“cannot open shared object file”。我建议你直接从Jetson上把整个 /usr/lib/aarch64-linux-gnu 目录拷过来,一劳永逸。

嗯,到这里,你的开发环境应该已经搭好了。下一章咱们开始真正接触TensorRT的核心概念——模型解析与网络构建。到时候你会发现,环境搭好了,后面的路就好走了。