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.soonnxruntime 可执行文件。把这些文件拷贝到板子上就能用了。

关键点: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上验证,再往板子上部署。别一上来就在板子上编译,那是在跟自己过不去。

嵌入式大模型开发环境搭建流程 交叉编译工具链 Python虚拟环境 推理引擎编译部署 下载Linaro GCC 配置环境变量 验证交叉编译 创建venv虚拟环境 安装依赖包 导出requirements.txt ONNX Runtime编译 TensorRT Lite编译 板端推理验证 ✅ 嵌入式平台大模型部署就绪
专注资料整理