第二章:开发环境搭建——让 Jetson 真正跑起来

说实话,很多初学者在 AI 芯片开发上栽跟头,不是算法不会写,而是环境没搭好。我见过太多人花了两三天装驱动、配工具链,最后连个 Hello World 都跑不起来。嗯,这一章我们就来把这关过了。

我个人习惯把环境搭建分成四步:装 JetPack、配交叉编译链、设 SSH、跑验证程序。每一步都不难,但顺序错了就容易出问题。你想想看,底层驱动没装好,上层工具链再折腾也是白费力气。

核心要点: 开发环境搭建是后续所有实验的基础,请务必按步骤操作,不要跳步。

2.1 安装 JetPack SDK

JetPack 是什么?说白了就是 NVIDIA 为 Jetson 系列芯片准备的一整套开发工具包。它包含了操作系统镜像、CUDA、cuDNN、TensorRT 等核心组件。我刚开始接触 Jetson 时,以为只要装个 Ubuntu 就能用,结果发现 GPU 加速根本跑不起来——因为没装 JetPack 里的专用驱动。

安装方式有两种:

  • SDK Manager 方式(推荐):在 x86 主机上运行,图形化界面,自动下载和烧录
  • 手动刷机方式:下载镜像后用命令行烧录到 SD 卡或 eMMC

我个人推荐用 SDK Manager,省心。步骤如下:

  1. 在 x86 主机上下载并安装 NVIDIA SDK Manager
  2. 用 USB 线连接 Jetson 设备到主机(注意要用数据线,不是充电线)
  3. 将 Jetson 置于强制恢复模式:按住 RECOVERY 键,再按一下 RESET,保持 RECOVERY 键 2 秒后松开
  4. 在 SDK Manager 中选择对应的 Jetson 型号和 JetPack 版本
  5. 勾选需要安装的组件(建议全选,省得后面补装)
  6. 点击安装,等待约 30-60 分钟
注意: 安装过程中不要断开 USB 连接或断电。我曾经有一次中途断电,结果 Jetson 变砖了,只能重新刷机。血的教训。

安装完成后,用 jtop 命令检查一下:

# 安装 jtop(如果没装的话)
sudo pip3 install jetson-stats

# 运行 jtop
jtop

你会看到 JetPack 版本、CUDA 版本、CPU/GPU 占用率等信息。如果能看到这些,说明 JetPack 装好了。

2.2 配置交叉编译工具链

为什么要交叉编译?因为 Jetson 的 ARM 架构性能有限,直接在它上面编译大型项目(比如 TensorRT 的 demo)会慢得让人崩溃。我试过在 Jetson Nano 上编译 OpenCV,整整等了三个小时。所以,我们通常在 x86 主机上编译,然后把二进制文件传到 Jetson 上运行。

交叉编译工具链的配置步骤如下:

  1. 在 x86 主机上下载 L4T 交叉编译工具链(与你的 JetPack 版本对应)
  2. 解压到 /opt 目录下
  3. 设置环境变量
# 解压工具链
sudo tar -xvf gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz -C /opt

# 设置环境变量(建议写入 ~/.bashrc)
export CROSS_COMPILE=/opt/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export LD=${CROSS_COMPILE}ld
export AR=${CROSS_COMPILE}ar

# 验证
aarch64-linux-gnu-gcc --version

如果能看到版本信息,说明工具链配置成功。这里有个小技巧:我习惯把环境变量写在 ~/.bashrc 里,这样每次打开终端就不用重新设置了。

提示: 如果你用的是 CMake 项目,可以在 CMakeLists.txt 中指定交叉编译工具链,这样更规范。具体做法是创建一个 toolchain.cmake 文件,然后在 cmake 命令中通过 -DCMAKE_TOOLCHAIN_FILE 指定。

2.3 设置 SSH 远程开发

SSH 是远程开发的标配。你想想看,每次都要插显示器和键盘去操作 Jetson,多麻烦。我一般把 Jetson 放在机柜里,通过 SSH 远程连接,既方便又整洁。

设置步骤:

  1. 确保 Jetson 和主机在同一个局域网内
  2. 在 Jetson 上开启 SSH 服务
  3. 获取 Jetson 的 IP 地址
  4. 从主机 SSH 连接
# 在 Jetson 上开启 SSH
sudo systemctl enable ssh
sudo systemctl start ssh

# 查看 IP 地址
ifconfig
# 或者
ip addr show

# 在主机上连接(假设 Jetson IP 是 192.168.1.100)
ssh nvidia@192.168.1.100

默认密码是 nvidia。第一次连接会提示确认指纹,输入 yes 即可。

安全提醒: 默认密码一定要改!我曾经在公网上暴露过一台 Jetson,结果被黑客扫描到,植入了挖矿程序。建议用 passwd 命令修改密码,或者配置 SSH 密钥登录。

配置 SSH 密钥登录(更安全,也更方便):

# 在主机上生成密钥(如果还没有)
ssh-keygen -t rsa -b 4096

# 将公钥复制到 Jetson
ssh-copy-id nvidia@192.168.1.100

# 现在可以直接登录,不需要密码了
ssh nvidia@192.168.1.100

2.4 验证环境:运行 Hello World 程序

环境搭好了,总得跑个程序验证一下。我习惯用 CUDA 的 Hello World,因为它能同时验证编译工具链和 GPU 驱动是否正常。

在 Jetson 上创建一个测试文件:

// hello.cu
#include <stdio.h>

__global__ void hello_kernel() {
    printf("Hello from GPU block %d, thread %d\n", blockIdx.x, threadIdx.x);
}

int main() {
    printf("Hello from CPU\n");
    
    // 启动 GPU kernel
    hello_kernel<<<2, 4>>>();
    
    // 等待 GPU 执行完成
    cudaDeviceSynchronize();
    
    return 0;
}

编译并运行:

# 编译
nvcc -o hello hello.cu

# 运行
./hello

如果输出类似下面的内容,说明环境完全正常:

Hello from CPU
Hello from GPU block 0, thread 0
Hello from GPU block 0, thread 1
Hello from GPU block 0, thread 2
Hello from GPU block 0, thread 3
Hello from GPU block 1, thread 0
Hello from GPU block 1, thread 1
Hello from GPU block 1, thread 2
Hello from GPU block 1, thread 3

注意看,GPU 的线程是并行执行的,所以输出顺序可能不一样。这是正常现象。

验证清单:
  • JetPack 安装成功(jtop 能看到版本信息)
  • 交叉编译工具链配置成功(aarch64-linux-gnu-gcc 能运行)
  • SSH 远程连接正常(能通过 SSH 登录 Jetson)
  • CUDA 程序能编译并运行(Hello World 输出正确)

知识体系总览

下面这张图概括了本章的核心内容,你可以把它当作一个检查清单:

开发环境搭建知识体系 JetPack SDK 安装 交叉编译工具链 SSH 远程开发 环境验证 SDK Manager / 手动刷机 强制恢复模式 jtop 验证 下载 L4T 工具链 解压到 /opt 设置环境变量 开启 SSH 服务 获取 IP 地址 配置密钥登录 编写 CUDA Hello World nvcc 编译 检查 CPU/GPU 输出 最终目标:在 Jetson 上成功运行 CUDA Hello World 程序 验证 CPU 和 GPU 都能正常工作 常见问题: • USB 连接不上?检查是否在强制恢复模式 • SSH 连不上?检查网络和防火墙设置 • nvcc 找不到?检查 CUDA 路径是否在 PATH 中

环境搭建这件事,说白了就是一次性的体力活。但别小看它,基础打好了,后面的大模型部署才能顺风顺水。我个人建议你把每一步都走一遍,不要偷懒。尤其是交叉编译工具链,很多人觉得麻烦就跳过了,结果后面编译大型项目时叫苦不迭。

好了,环境搭好了,接下来就可以真正开始搞大模型部署了。


公众号:蓝海资料掘金营,微信deep3321