4、环境搭建:嵌入式Linux开发环境配置,交叉编译工具链安装,ONNX Runtime与TensorRT Lite部署准备

好,咱们进入第四章。说实话,这一章是整门课里最「磨人」的部分。为什么?因为环境搭不好,后面所有代码都跑不起来。我见过太多同学卡在这一步,明明模型训得挺好,一到嵌入式设备上就各种报错。别急,咱们一步步来。

4.1 嵌入式Linux开发环境配置

先说说我的习惯。我一般会在Ubuntu 20.04或22.04上做开发,虚拟机也行,WSL2也行,但千万别用Windows直接搞——交叉编译链那套东西在Windows上折腾起来太痛苦了。

你需要准备三样东西:

  • 一台Linux主机(开发机,用来编译代码)
  • 一块嵌入式开发板(比如Jetson Nano、RK3588、树莓派4B)
  • 一根串口线或SSH连接(用来跟板子通信)

我个人建议,开发机内存至少8GB,硬盘留出20GB空间。别问我为什么——你装完几个SDK和依赖库就知道了。

小技巧: 如果你用的是Jetson系列,记得先刷好JetPack SDK。它会把CUDA、cuDNN、TensorRT一股脑全装上。省心不少。

4.2 交叉编译工具链安装

交叉编译是什么?说白了,就是在你的x86电脑上编译出能在ARM板子上跑的程序。你想想看,板子性能那么弱,直接在它上面编译YOLO?那得等到猴年马月。

以ARM64架构为例,安装命令很简单:

sudo apt-get update
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

装完之后验证一下:

aarch64-linux-gnu-gcc --version

嗯,看到版本号就说明成了。但这里有个坑——光有gcc不够。你还需要交叉编译版的OpenCV、Protobuf、Eigen这些库。我曾经在项目里因为OpenCV版本不匹配,整整调了两天。

注意: 交叉编译OpenCV时,记得加上-D CMAKE_BUILD_TYPE=Release和-D BUILD_opencv_world=ON。不然编译出来的库文件散落一地,链接的时候你会疯的。

我一般会写一个交叉编译的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/aarch64-linux-gnu)

然后编译的时候直接:

cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake ..

省事多了。

4.3 ONNX Runtime部署准备

ONNX Runtime,说白了就是微软搞的一个推理引擎。它最大的好处是——你训好的模型转成ONNX格式后,它就能跑,不用管你原来用的是PyTorch还是TensorFlow。

在嵌入式设备上部署,我推荐用ONNX Runtime的ARM64版本。下载地址在GitHub Release里,找名字带「aarch64」的就行。

安装步骤:

  1. 下载预编译包:wget https://github.com/microsoft/onnxruntime/releases/download/v1.15.1/onnxruntime-linux-aarch64-1.15.1.tgz
  2. 解压:tar -xzf onnxruntime-linux-aarch64-1.15.1.tgz
  3. 把lib路径加到环境变量里:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/onnxruntime/lib

这里有个小细节——ONNX Runtime对CPU指令集有要求。如果你的板子太老(比如Cortex-A53),可能跑不了最新版本。我建议用1.12到1.15之间的版本,兼容性最好。

经验之谈: 在Jetson Nano上,ONNX Runtime配合TensorRT执行提供程序(Execution Provider),推理速度能提升3-5倍。具体怎么配,咱们后面章节会细讲。

4.4 TensorRT Lite部署准备

TensorRT Lite?其实没有这个官方叫法。我指的是TensorRT的轻量化部署方案。NVIDIA官方提供了TensorRT,但完整版体积大、依赖多。对于资源受限的嵌入式设备,我们得「精打细算」。

安装TensorRT,我建议走deb包路线:

sudo dpkg -i nv-tensorrt-repo-ubuntu2004-cuda11.6-trt8.4.1.5-ga-20220906_1-1_amd64.deb
sudo apt-get update
sudo apt-get install tensorrt

装完之后,用这个命令验证:

dpkg -l | grep TensorRT

看到版本号就对了。但注意——TensorRT版本必须跟CUDA版本匹配。我见过有人把TRT 8.5配CUDA 11.4,结果编译都过不去。

对于Jetson系列设备,TensorRT已经集成在JetPack里了。你只需要:

sudo apt-get install nvidia-tensorrt

搞定。简单吧?但别高兴太早——TensorRT的模型转换才是真正的坑。有些算子不支持,有些精度会掉,这些咱们后面再聊。

4.5 环境验证:跑一个简单的YOLO测试

环境搭没搭好,跑个demo就知道了。我准备了一个最小的YOLOv5s ONNX模型,在板子上跑一下:

import onnxruntime as ort
import numpy as np

# 创建session
session = ort.InferenceSession("yolov5s.onnx")

# 构造随机输入
input_data = np.random.randn(1, 3, 640, 640).astype(np.float32)

# 推理
outputs = session.run(None, {"images": input_data})

print("推理成功!输出shape:", outputs[0].shape)

如果看到输出shape是(1, 25200, 85),那恭喜你——环境没问题。

注意: 在板子上跑的时候,记得用top命令看看CPU和内存占用。如果内存占用超过80%,说明模型太大了,得做量化或者剪枝。

4.6 避坑指南

最后,我总结几个常见问题:

  • 链接错误: 交叉编译时提示找不到库?检查一下CMAKE_FIND_ROOT_PATH有没有设对。
  • 段错误: 在板子上跑ONNX Runtime时崩溃?多半是内存不够,试试减小batch size。
  • 精度不对: TensorRT推理结果跟PyTorch对不上?检查一下有没有开启FP16,有些层对精度敏感。

嗯,环境搭建这部分就到这里。说实话,这一章内容不多,但每一步都容易踩坑。我建议你搭完环境后,把整个开发机的配置备份一下——用Docker也好,用shell脚本也好,省得下次重装系统时再折腾一遍。

下一章,咱们开始讲模型转换。到时候你会看到,训好的YOLO模型怎么变成能在板子上跑的东西。准备好了吗?