第二章 开发环境搭建:嵌入式Linux系统烧录、交叉编译工具链配置、Python与C++运行时环境部署
好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说实话,很多做AI推理的朋友,模型调得再好,板子跑不起来也是白搭。我在项目里见过太多次了——环境没配好,一烧录就变砖,一编译就报错。所以这一章,咱们稳扎稳打。
2.1 嵌入式Linux系统烧录
先说说系统烧录。你手头可能是一块开发板,比如树莓派、RK3588、或者NVIDIA Jetson系列。不管哪块板子,第一步都是把系统装进去。
我个人习惯用SD卡或者eMMC来烧录。为什么?因为方便。SD卡拔下来插电脑上,用工具写镜像,再插回去就能启动。eMMC稍微麻烦点,得用USB线或者网线连电脑。
2.1.1 烧录工具选择
| 平台 | 推荐工具 | 说明 |
|---|---|---|
| Windows | Win32DiskImager / balenaEtcher | 简单易用,支持常见镜像格式 |
| Linux | dd命令 / bmaptool | dd最直接,bmaptool支持增量写入 |
| macOS | balenaEtcher / dd | balenaEtcher有图形界面,省心 |
嗯,这里要注意:烧录前一定确认镜像文件没损坏。我建议你下载完镜像后,先校验一下SHA256。我曾经有一次没校验,烧完板子死活起不来,折腾了半天才发现是镜像下载不完整。
烧录步骤(以树莓派为例):
- 下载官方镜像(比如Raspberry Pi OS)
- 用balenaEtcher选择镜像文件和SD卡
- 点击Flash,等进度条走完
- 插回板子,上电启动
如果你用的是NVIDIA Jetson系列,烧录方式不太一样。它需要用到NVIDIA官方的SDK Manager,走的是USB直连模式。说白了,就是把板子当U盘一样,往里面写系统。
避坑指南:我曾经在烧录Jetson Nano时,忘记把板子切换到强制恢复模式(Force Recovery Mode),结果电脑死活识别不到设备。后来才发现,得先按住板子上的RECOVERY键,再按一下RST键,最后上电。这个顺序不能错。
2.2 交叉编译工具链配置
接下来是交叉编译。你想想看,你的开发电脑是x86架构,但目标板子是ARM架构。你在电脑上编译出来的程序,板子不认识。怎么办?用交叉编译工具链。
交叉编译工具链,说白了就是一套能在x86上生成ARM可执行文件的工具。我建议你直接用芯片厂商提供的工具链,比如ARM官方的gcc-arm-none-eabi,或者Linaro的gcc-linaro。
2.2.1 安装交叉编译工具链
以Ubuntu系统为例,安装ARM64的交叉编译工具链:
sudo apt-get update
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
装完之后,你可以用这个命令验证一下:
aarch64-linux-gnu-gcc --version
看到版本号就说明装好了。嗯,这里有个小技巧:我习惯把工具链的路径加到.bashrc里,这样每次打开终端就不用再手动设环境变量了。
个人经验:如果你用的是树莓派,其实可以不用交叉编译。直接在树莓派上装gcc,本地编译就行。但如果你用的是性能较弱的板子(比如Cortex-M系列),那交叉编译就是必须的。我在一个项目里用STM32MP1跑AI推理,本地编译一个OpenCV库要两个小时,交叉编译只要十分钟。
2.2.2 编写一个简单的测试程序
工具链装好了,咱们写个Hello World试试:
// hello.c
#include <stdio.h>
int main() {
printf("Hello from ARM board!\n");
return 0;
}
用交叉编译器编译:
aarch64-linux-gnu-gcc hello.c -o hello_arm
然后把这个文件传到板子上,运行一下:
./hello_arm
看到输出就对了。如果报错说“无法执行二进制文件”,那八成是架构不对。你检查一下板子的架构,用uname -m看看。
2.3 Python与C++运行时环境部署
好,系统能跑了,交叉编译也通了。接下来咱们部署AI推理需要的运行时环境。这里分两条路:Python和C++。
2.3.1 Python运行时环境
Python在嵌入式设备上做AI推理,最常用的就是ONNX Runtime和TensorFlow Lite。我个人更推荐ONNX Runtime,因为它支持的模型格式多,而且优化得不错。
安装Python和pip:
sudo apt-get install python3 python3-pip
然后安装ONNX Runtime:
pip3 install onnxruntime
注意:板子上的Python版本最好和开发电脑一致。我遇到过Python 3.7和3.9的API有差异,模型加载直接报错。所以建议你统一用Python 3.8或3.9。
验证安装:
python3 -c "import onnxruntime; print(onnxruntime.__version__)"
如果能打印出版本号,说明环境没问题。
2.3.2 C++运行时环境
C++环境稍微复杂一点。你需要安装OpenCV、ONNX Runtime的C++库,还有可能用到TensorRT(如果你用的是NVIDIA的板子)。
安装OpenCV:
sudo apt-get install libopencv-dev
安装ONNX Runtime C++库:
# 下载预编译的ARM64版本
wget https://github.com/microsoft/onnxruntime/releases/download/v1.15.1/onnxruntime-linux-aarch64-1.15.1.tgz
tar -xzf onnxruntime-linux-aarch64-1.15.1.tgz
sudo cp -r onnxruntime-linux-aarch64-1.15.1/include/* /usr/local/include/
sudo cp -r onnxruntime-linux-aarch64-1.15.1/lib/* /usr/local/lib/
sudo ldconfig
嗯,这里要注意:ONNX Runtime的版本要和你的模型兼容。我建议你开发电脑和板子用同一个版本,避免算子支持不一致。
避坑指南:我曾经在RK3588上部署ONNX Runtime,发现官方预编译的ARM64版本不支持NPU加速。后来我改用RKNN Toolkit,才把推理速度提上来。所以,如果你用的是特定芯片(比如瑞芯微、全志),最好用厂商提供的推理框架。
2.3.3 验证C++环境
写一个简单的C++程序,加载ONNX模型:
#include <onnxruntime/core/session/onnxruntime_cxx_api.h>
#include <iostream>
int main() {
Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test");
std::cout << "ONNX Runtime version: " << Ort::GetVersionString() << std::endl;
return 0;
}
编译:
g++ test_onnx.cpp -lonnxruntime -o test_onnx
在板子上运行,看到版本号就说明环境搭好了。
2.4 本章小结
这一章咱们把开发环境从头到尾搭了一遍。从系统烧录到交叉编译,再到Python和C++的运行时环境。你可能会觉得步骤有点多,但相信我,环境搭好了,后面就顺了。
我个人的经验是:每做完一步,都验证一下。烧录完系统,先跑个uname -a看看内核版本。装完工具链,编译个Hello World。部署完运行时,写个测试程序。别等到最后才发现问题,那时候排查起来就麻烦了。
下一章,咱们开始讲模型转换和量化。到时候你会用到今天搭好的环境。嗯,先休息一下,喝杯咖啡,然后继续。