2、开发环境搭建:交叉编译工具链安装、Python虚拟环境配置、ONNX Runtime与TensorRT Lite的编译部署
说实话,嵌入式平台跑大模型,最让人头疼的往往不是模型本身,而是开发环境。我见过太多人模型选好了、代码写完了,结果卡在编译这一步——要么工具链版本不对,要么依赖库冲突。今天咱们就把这块硬骨头啃下来。
核心思路:嵌入式平台资源有限,我们必须在宿主机(通常是x86电脑)上完成交叉编译,再把生成的可执行文件丢到目标板(比如ARM开发板)上运行。说白了,就是「在PC上造子弹,到板子上开枪」。
2.1 交叉编译工具链安装
交叉编译工具链,就是一套能在你的PC上生成目标平台机器码的工具。我个人习惯用Linaro提供的GCC工具链,稳定且社区活跃。
2.1.1 下载与解压
以ARM64(aarch64)为例,我建议直接去Linaro官网下载预编译版本。别自己从源码编译,那太折腾了,我在项目中试过一次,编译了整整一个下午,最后还报错——嗯,后来再也不干这种傻事了。
# 下载ARM64 GCC工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
# 解压到指定目录
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz -C /opt/
# 添加环境变量
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
小技巧:把环境变量写到 ~/.bashrc 里,这样每次打开终端就不用重新export了。我一般还会加个别名,比如 alias armcc='aarch64-linux-gnu-gcc',省得每次敲那么长一串。
2.1.2 验证安装
装完别急着走,先验证一下能不能用。跑个简单的Hello World,交叉编译后放到板子上执行——这是最靠谱的测试方法。
# 编写测试代码
echo '#include <stdio.h>
int main() {
printf("Hello from ARM64!\n");
return 0;
}' > test.c
# 交叉编译
aarch64-linux-gnu-gcc test.c -o test_arm
# 查看生成文件的架构
file test_arm
# 输出应该类似:test_arm: ELF 64-bit LSB executable, ARM aarch64, ...
为什么会这样?因为交叉编译出来的文件,在x86电脑上是跑不了的。你得把它传到板子上才能看到效果。我记得第一次做这个时,直接在PC上运行,结果报「无法执行二进制文件」,还以为是工具链装错了——其实只是没搞清楚交叉编译的本质。
注意:工具链版本一定要和你的目标平台匹配。比如你的板子是ARMv8架构,就别用ARMv7的工具链。我曾经因为版本不匹配,折腾了两天才发现是工具链的问题——血的教训。
2.2 Python虚拟环境配置
嵌入式开发中,Python环境往往很脆弱。你想想看,板子上的系统可能只有几百MB的存储空间,装错一个包就得重刷系统。所以虚拟环境是必须的。
2.2.1 使用venv创建虚拟环境
Python自带的venv模块就够用了,不需要额外装virtualenv。我个人习惯在项目根目录下创建一个 .venv 文件夹,这样一眼就能看出来这是个虚拟环境。
# 创建虚拟环境
python3 -m venv .venv
# 激活虚拟环境(Linux/Mac)
source .venv/bin/activate
# 激活虚拟环境(Windows)
.venv\Scripts\activate
# 退出虚拟环境
deactivate
2.2.2 安装依赖包
激活虚拟环境后,用pip安装包就不会污染系统环境了。对于大模型部署,常用的包有:numpy、onnxruntime、tensorrt等。
# 先升级pip
pip install --upgrade pip
# 安装常用包
pip install numpy onnx onnxruntime
# 导出依赖列表
pip freeze > requirements.txt
# 在其他环境安装
pip install -r requirements.txt
避坑指南:我曾经在板子上直接pip install,结果因为网络慢、存储空间不足,装到一半就失败了。后来我学乖了——先在PC上把包下载好,然后传到板子上离线安装。命令是 pip download 包名 -d ./packages,然后在板子上 pip install --no-index --find-links=./packages 包名。
2.3 ONNX Runtime与TensorRT Lite的编译部署
这两个推理引擎是嵌入式大模型部署的核心。ONNX Runtime通用性强,TensorRT Lite则针对NVIDIA平台做了极致优化。怎么选?看你的硬件。
2.3.1 ONNX Runtime交叉编译
ONNX Runtime支持多种平台,但官方预编译包不一定覆盖你的板子。所以很多时候得自己编译。我建议用Docker来编译,环境隔离、可复现。
# 克隆ONNX Runtime源码
git clone --recursive https://github.com/microsoft/onnxruntime.git
cd onnxruntime
# 创建交叉编译配置文件(以ARM64为例)
cat > arm64.toolchain.cmake << EOF
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++)
EOF
# 开始编译
./build.sh --config Release \
--build_shared_lib \
--parallel \
--cmake_extra_defines CMAKE_TOOLCHAIN_FILE=arm64.toolchain.cmake \
--arm64
编译完成后,在 build/Linux/Release/ 目录下会生成 libonnxruntime.so 和 onnxruntime 可执行文件。把这些文件拷贝到板子上就能用了。
关键点:ONNX Runtime编译时有很多选项可以开关,比如 --enable_cuda、--enable_openmp 等。如果你的板子有GPU,一定要开启CUDA支持,推理速度能提升好几倍。我在Jetson Nano上测试过,开启CUDA后推理时间从200ms降到了30ms。
2.3.2 TensorRT Lite编译部署
TensorRT Lite是NVIDIA的轻量级推理引擎,专门为嵌入式设备设计。它比ONNX Runtime更「专」,但性能也更强。不过要注意,它只支持NVIDIA的GPU。
# 下载TensorRT Lite源码
git clone https://github.com/NVIDIA/TensorRT.git
cd TensorRT
# 编译TensorRT Lite(以Jetson平台为例)
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/aarch64-linux-gnu.cmake \
-DTRT_LITE_BUILD_EXAMPLES=ON
make -j4
# 编译完成后,生成的文件在 output/ 目录下
ls output/
# 应该看到:libtrt_lite.so, trt_lite_example 等
注意:TensorRT Lite对CUDA版本有严格要求。比如Jetson Nano用的是CUDA 10.2,你就不能用CUDA 11.x的TensorRT版本。我有个朋友就是没注意版本匹配,编译了一整天,最后发现链接不上——白白浪费时间。
2.3.3 部署验证
编译完成后,一定要在板子上跑个简单的推理测试。我一般用ONNX Runtime自带的 onnxruntime_perf_test 工具,或者写个简单的Python脚本。
# 在板子上运行ONNX Runtime测试
./onnxruntime_perf_test -m your_model.onnx -r 100
# 输出示例:
# Average inference time: 45.32 ms
# Minimum inference time: 42.10 ms
# Maximum inference time: 48.95 ms
如果推理时间在可接受范围内,那恭喜你,环境搭建成功了。如果时间太长,别急着怀疑代码——先检查一下是不是没有开启硬件加速。我遇到过好几次,明明板子有NPU,结果ONNX Runtime默认用CPU跑,速度慢得离谱。
个人经验:在Jetson系列板子上,我推荐优先用TensorRT Lite。虽然编译过程比ONNX Runtime复杂一些,但推理速度能快30%-50%。如果是其他平台(比如瑞芯微、全志),那就老老实实用ONNX Runtime,兼容性更好。
本章小结
开发环境搭建,说白了就是三件事:装工具链、配Python环境、编译推理引擎。每一步都有坑,但只要你按照上面的步骤来,基本不会出大问题。记住一点:先在PC上验证,再往板子上部署。别一上来就在板子上编译,那是在跟自己过不去。