3. 开发环境搭建:JetPack SDK安装、CUDA/cuDNN配置、交叉编译工具链、Python环境与PyTorch/TensorFlow安装

好,咱们直接进入正题。嵌入式GPU开发,环境搭建是第一步,也是最容易踩坑的一步。我见过太多人花了一周时间装环境,结果发现版本不匹配,最后全部重来。今天我就把这几年的经验掰开揉碎讲给你听。

3.1 JetPack SDK安装——别小看这一步

JetPack SDK是NVIDIA为嵌入式平台准备的“全家桶”。它包含了Linux系统、CUDA、cuDNN、TensorRT等所有你需要的东西。说白了,装好它,你就有了一个完整的开发环境。

安装方式有两种:

  • SDK Manager图形化安装:适合新手,点点鼠标就行
  • 命令行安装:适合批量部署,我更喜欢这种方式

我个人习惯用SDK Manager,因为它会自动处理依赖关系。但要注意一点——网络一定要稳定。我曾经在客户现场用4G网络下载,结果下了三次都中断了,最后只能回公司提前下载好离线包。

⚠️ 重要提醒: JetPack版本和硬件型号必须匹配。比如Jetson Xavier NX只能用JetPack 4.6及以上版本。别问我怎么知道的,我有一块板子就因为刷了不兼容的版本,折腾了两天才救回来。

安装步骤:

  1. 下载SDK Manager并安装到你的Ubuntu主机上
  2. 用Micro-USB线连接Jetson设备到主机,并给设备供电
  3. 让设备进入恢复模式(按住RECOVERY键再按RESET键)
  4. 在SDK Manager中选择目标硬件和JetPack版本
  5. 点击安装,等待约30-60分钟

嗯,这里要注意:安装过程中会提示你设置用户名和密码。我建议统一用nvidia作为用户名,方便后续脚本自动化操作。

3.2 CUDA/cuDNN配置——版本匹配是王道

JetPack安装完成后,CUDA和cuDNN其实已经预装了。但很多人会问:“为什么我nvcc -V显示找不到命令?”

原因很简单——环境变量没配好。JetPack默认把CUDA装在/usr/local/cuda目录下,但不会自动加到PATH里。

配置方法:

# 打开bashrc文件
vim ~/.bashrc

# 在文件末尾添加以下内容
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export CUDA_HOME=/usr/local/cuda

# 使配置生效
source ~/.bashrc

# 验证安装
nvcc -V

至于cuDNN,它其实是一堆库文件。JetPack已经帮你装好了,你只需要确认版本就行:

# 查看cuDNN版本
cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
💡 我的经验: 如果你需要手动安装cuDNN,一定要下载和CUDA版本匹配的deb包。比如CUDA 11.4对应cuDNN 8.2。我曾经图省事直接装了最新版cuDNN,结果模型训练时各种报错,排查了两天才发现是版本不兼容。

3.3 交叉编译工具链——PC上编译,板子上跑

交叉编译,说白了就是在你的PC上编译代码,然后放到Jetson上运行。为什么要这么做?因为Jetson的算力有限,直接在板子上编译大型项目(比如OpenCV)可能要等几个小时。

安装交叉编译工具链:

# 在Ubuntu主机上安装aarch64交叉编译器
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

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

你想想看,有了这个工具链,你就可以在PC上编译C/C++代码,然后通过scp传到Jetson上运行。我一般会写个Makefile,里面指定交叉编译器:

# Makefile示例
CC = aarch64-linux-gnu-gcc
CFLAGS = -O2 -march=armv8-a

all: my_program

my_program: main.c
    $(CC) $(CFLAGS) -o $@ $^

clean:
    rm -f my_program
🔑 关键点: 交叉编译时,链接的库也必须是ARM架构的。比如你用了OpenCV,就得先交叉编译OpenCV的ARM版本,或者直接从Jetson上把库文件拷贝过来。

3.4 Python环境与PyTorch/TensorFlow安装

终于到了大家最关心的部分。嵌入式GPU上跑深度学习,Python是首选语言。但要注意——不要直接用pip安装PyTorch

为什么?因为官方PyTorch的ARM版本对Jetson的支持并不好。NVIDIA专门为Jetson编译了优化过的PyTorch,叫做torchtorchvision的JetPack定制版。

安装步骤:

# 1. 安装pip和依赖
sudo apt-get update
sudo apt-get install python3-pip libopenblas-base libopenmpi-dev

# 2. 安装PyTorch(以JetPack 4.6为例)
# 从NVIDIA官网下载对应的whl文件
wget https://developer.download.nvidia.com/compute/redist/jp/v46/pytorch/torch-1.10.0-cp36-cp36m-linux_aarch64.whl
pip3 install torch-1.10.0-cp36-cp36m-linux_aarch64.whl

# 3. 安装torchvision
sudo apt-get install libjpeg-dev zlib1g-dev
git clone --branch v0.11.0 https://github.com/pytorch/vision torchvision
cd torchvision
python3 setup.py install

# 4. 验证安装
python3 -c "import torch; print(torch.__version__); print(torch.cuda.is_available())"

至于TensorFlow,NVIDIA也提供了预编译的pip包:

# 安装TensorFlow
pip3 install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v46 tensorflow==2.7.0+nv22.1
⚠️ 避坑指南: 我曾经在Jetson上直接运行pip3 install tensorflow,结果装了一个CPU版本的TensorFlow,跑模型慢得离谱。后来才发现,必须加上--extra-index-url参数才能安装GPU加速版本。

Python环境管理建议:

  • 使用virtualenvconda创建独立环境
  • 每个项目一个环境,避免依赖冲突
  • 把常用的库(numpy, matplotlib, opencv-python)提前装好

我个人习惯用virtualenv,因为它轻量,不占太多空间。Jetson的存储本来就有限,能省则省。

3.5 环境验证——跑个Hello World

环境装好了,怎么确认一切正常?我一般会跑一个简单的PyTorch程序:

import torch
import torch.nn as nn

# 创建一个简单的模型
model = nn.Linear(10, 5)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)

# 创建输入数据
x = torch.randn(1, 10).to(device)

# 前向传播
output = model(x)
print(f"Output: {output}")
print(f"Device: {device}")

# 检查GPU利用率
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"GPU count: {torch.cuda.device_count()}")
print(f"GPU name: {torch.cuda.get_device_name(0)}")

如果输出显示CUDA available: True,并且能看到Jetson的GPU名称(比如NVIDIA Tegra X2),那就说明环境搭建成功了。

💡 小技巧:nvidia-smi命令可以实时查看GPU使用情况。不过Jetson上的nvidia-smi和桌面版不太一样,它显示的是tegrastats的信息。你可以用sudo tegrastats查看更详细的硬件状态。

好了,环境搭建这部分就到这里。说实话,第一次搭建确实有点繁琐,但只要你按照这个流程走,基本不会出大问题。下一章我们会开始真正的模型部署实战,到时候你会感谢今天认真搭环境的自己。