3、开发环境搭建:NVIDIA SDK Manager安装、JetPack刷机、交叉编译工具链配置、SSH远程调试

好,咱们正式开始动手了。这一章我带你把开发环境从头到尾搭一遍。说实话,环境搭建这事儿,看着琐碎,但一步错步步错。我在项目里见过太多人卡在刷机或者工具链上,一卡就是半天。咱们稳一点,把每一步都走扎实。

3.1 NVIDIA SDK Manager 安装

SDK Manager 是 NVIDIA 官方的一站式工具。刷系统、装库、配环境,全用它。说白了,它就是 Jetson 开发的「总开关」。

下载与安装

去 NVIDIA 官网下载 SDK Manager。注意,它只支持 Ubuntu 18.04 或 20.04 宿主机。我个人习惯用 Ubuntu 20.04,稳定一些。下载下来是个 .deb 包,安装命令很简单:

sudo apt update
sudo apt install ./sdkmanager_[version].deb

装完之后,终端里敲 sdkmanager 就能启动。第一次启动会让你登录 NVIDIA 开发者账号。嗯,这里要注意,账号得提前注册好,不然卡在登录界面很尴尬。

小提示: 如果你在虚拟机里跑 SDK Manager,记得给虚拟机分配至少 4GB 内存和 2 个 CPU 核心。我试过 2GB 内存,直接卡死。

3.2 JetPack 刷机

JetPack 是什么?它包含了 L4T(Linux for Tegra)内核、CUDA、cuDNN、TensorRT 等全套软件栈。刷机,就是把这套东西烧录到 Jetson 设备上。

刷机流程

启动 SDK Manager,选择你的 Jetson 型号(比如 Xavier NX 或 Orin Nano)。然后勾选需要的组件。我个人建议,第一次刷机把「全部组件」都勾上,省得后面缺东西再补。

接下来,把 Jetson 设备用 USB 线连接到宿主机。按住设备上的 Force Recovery 按钮,再按一下 Reset 键,然后松开 Recovery 键。这时候设备就进入烧录模式了。

在 SDK Manager 里点击「Flash」,它会自动下载 JetPack 并开始烧录。整个过程大概 20-40 分钟,取决于你的网速和设备型号。

警告: 刷机过程中不要拔掉 USB 线或断电。我曾经有一次手贱拔了线,结果设备变砖,只能重新进入恢复模式再刷一遍。老老实实等着吧。

刷机后的验证

刷完机,设备会自动重启。用 HDMI 接上显示器,你会看到 Ubuntu 桌面。打开终端,检查一下关键组件:

nvcc --version          # 查看 CUDA 版本
jtop                    # 查看系统状态(需要安装 jtop)

如果 nvcc 能正常输出版本号,说明 CUDA 装好了。jtop 是个好东西,我每次调试都开着它看 CPU/GPU 占用。

3.3 交叉编译工具链配置

为什么要交叉编译?因为 Jetson 设备本身性能有限,直接在板子上编译大型项目(比如 TensorRT 模型)会慢得让人抓狂。在宿主机上编译好,再把二进制文件传到板子上跑,效率高得多。

安装交叉编译工具链

SDK Manager 在刷机时,其实已经帮你装好了交叉编译工具链。路径一般在:

/usr/local/ JetPack_[version]/tools/

里面有个 gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu 文件夹,这就是交叉编译器。把它加到 PATH 里:

export PATH=/usr/local/JetPack_5.1.2/tools/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin:$PATH

验证一下:

aarch64-linux-gnu-gcc --version

能输出版本号,就说明工具链配好了。

避坑指南: 交叉编译时,一定要确保宿主机上的库版本和 Jetson 设备上的库版本一致。我遇到过编译出来的程序在板子上跑不起来,就是因为 libstdc++ 版本对不上。解决办法:在宿主机上用 strings 命令检查库的版本号。

CMake 交叉编译配置

我习惯用 CMake 管理项目。写一个 toolchain.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 /usr/local/JetPack_5.1.2/tools)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

编译时这样用:

cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ..
make

生成的二进制文件就是 ARM64 架构的,直接拷到 Jetson 上就能跑。

3.4 SSH 远程调试

环境搭好了,总不能每次都插着显示器和键盘操作吧?SSH 远程调试才是正经干活的方式。

配置 Jetson 的 SSH 服务

Jetson 刷完机默认就开了 SSH。你只需要知道它的 IP 地址。在板子上执行:

ifconfig

找到 eth0wlan0 的 IP。然后在宿主机上:

ssh nvidia@[Jetson_IP]

默认密码是 nvidia。第一次登录会让你改密码,改完就能用了。

免密登录配置

每次输密码太烦了。配置 SSH 密钥:

ssh-keygen -t rsa -b 4096
ssh-copy-id nvidia@[Jetson_IP]

之后登录就不用密码了。我每次新装系统第一件事就是配这个,省时间。

远程调试技巧

我常用的调试方式有两种:

  • VS Code Remote-SSH: 在宿主机上装 VS Code 的 Remote-SSH 插件,直接连接到 Jetson。可以在板子上编辑代码、运行调试器,体验和本地开发一样。
  • rsync 同步代码: 写个脚本,用 rsync 把编译好的二进制文件同步到板子上。比如:
rsync -avz --progress ./build/my_app nvidia@[Jetson_IP]:~/projects/

然后 SSH 过去运行:

ssh nvidia@[Jetson_IP] "~/projects/my_app"
小技巧: 我习惯在宿主机上写一个 deploy.sh 脚本,把编译、同步、运行三步合在一起。每次改完代码,跑一下脚本就能看到效果,效率翻倍。

性能监控

远程调试时,别忘了监控板子的状态。用 jtop 或者 tegrastats

ssh nvidia@[Jetson_IP] "tegrastats"

这个命令会实时显示 CPU、GPU、内存、温度等信息。我调试模型推理时,一定会开着它,看看 GPU 占用率是不是跑满了。

小结

这一章的内容,说白了就是三件事:刷机、配工具链、连 SSH。每一步都有坑,但按我的经验,只要照着流程走,基本不会出大问题。环境搭好了,后面咱们才能真正开始写代码、调模型。

下一章,我会带你写第一个 CUDA 程序,在 Jetson 上跑起来。到时候你就知道,前面这些折腾都是值得的。