2. 环境搭建:端侧AI芯片选型与工具链安装
说实话,做BEV模型移植,第一步不是写代码,而是选芯片。我见过太多团队,模型在PC上跑得飞起,一到板子上就卡成PPT。为什么?芯片选型没想清楚,工具链没配好。
这一章,咱们就把环境搭建这件事掰开揉碎。从芯片选型到交叉编译,再到ONNX Runtime和TensorRT的安装,一步都不能省。
2.1 端侧AI芯片选型:三款主流方案对比
目前端侧BEV部署的主流选择,基本就是这三家:NVIDIA Jetson、瑞芯微RK3588、地平线征程5。我个人的经验是,没有最好的芯片,只有最合适的场景。
| 维度 | NVIDIA Jetson Orin | 瑞芯微 RK3588 | 地平线 征程5 (J5) |
|---|---|---|---|
| AI算力 | 40~275 TOPS (INT8) | 6 TOPS (NPU) | 128 TOPS (BPU) |
| 生态成熟度 | 极高,TensorRT原生支持 | 中等,RKNN工具链 | 较高,地平线OE工具链 |
| 功耗 | 15~60W | 8~15W | 35W |
| BEV适配难度 | 低,算子全 | 中,需手动优化 | 中高,需算子对齐 |
| 典型场景 | 自动驾驶、机器人 | 智能座舱、轻量感知 | 高阶辅助驾驶 |
我的建议: 如果你刚入门,或者团队不大,直接上Jetson Orin。TensorRT的生态太成熟了,踩坑少。RK3588适合功耗敏感、算力要求不高的场景。地平线J5嘛,适合有算法团队、愿意深度优化的公司。
2.2 交叉编译环境配置
交叉编译,说白了就是在PC上编译出能在ARM板子上跑的程序。嗯,这里要注意,千万别在板子上直接编译——那速度,你会崩溃的。
2.2.1 安装交叉编译工具链
以Jetson Orin为例,我习惯用aarch64交叉编译工具链。RK3588和J5也类似,只是工具链来源不同。
# 安装aarch64交叉编译工具链(Ubuntu 20.04/22.04)
sudo apt-get update
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
# 验证安装
aarch64-linux-gnu-gcc --version
避坑指南: 我曾经在RK3588上踩过一个坑——官方SDK里的交叉编译器版本太老,导致C++17的代码编译不过。后来我换了Linaro的7.5版本才搞定。所以,建议你直接用芯片厂商提供的交叉编译器,别自己从网上随便下。
2.2.2 配置CMake交叉编译链文件
我个人习惯写一个cmake工具链文件,这样每次编译不用重复配置。
# toolchain_aarch64.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_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
编译时这样用:
mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain_aarch64.cmake
make -j$(nproc)
2.3 ONNX Runtime安装
ONNX Runtime是个好东西。它让你在换芯片时,不用重写推理代码。你想想看,模型导出成ONNX格式,然后ONNX Runtime帮你适配不同后端。
2.3.1 在Jetson上安装ONNX Runtime
Jetson有NVIDIA官方编译好的包,直接装就行。
# 下载Jetson Orin对应的ONNX Runtime
wget https://github.com/microsoft/onnxruntime/releases/download/v1.16.3/onnxruntime-linux-aarch64-1.16.3.tgz
tar -xzf onnxruntime-linux-aarch64-1.16.3.tgz
sudo cp -r onnxruntime-linux-aarch64-1.16.3 /usr/local/onnxruntime
2.3.2 在RK3588上交叉编译ONNX Runtime
RK3588没有官方预编译包,得自己交叉编译。这个过程有点烦,但一次搞定后面就省心了。
# 下载源码
git clone --recursive https://github.com/microsoft/onnxruntime.git
cd onnxruntime
# 交叉编译配置
./build.sh --config Release \
--build_shared_lib \
--parallel \
--arm64 \
--cmake_extra_defines CMAKE_TOOLCHAIN_FILE=/path/to/toolchain_aarch64.cmake \
--skip_tests
# 编译产物在 build/Linux/Release/ 下
注意: 交叉编译ONNX Runtime时,内存至少需要8GB,磁盘空间预留20GB以上。我曾在只有4GB内存的虚拟机上编译,结果编译到一半直接OOM了。
2.4 TensorRT安装
TensorRT是NVIDIA的看家本领。BEV模型里的Transformer、可变形注意力,TensorRT 8.5+都支持得不错。
2.4.1 在Jetson上安装TensorRT
Jetson的JetPack SDK里已经包含了TensorRT。你刷完系统,TensorRT就在那了。
# 检查TensorRT版本
dpkg -l | grep tensorrt
# 安装Python接口(如果需要)
sudo apt-get install python3-libnvinfer-dev
2.4.2 在x86 PC上安装TensorRT(用于模型转换)
你需要在PC上先把模型转成TensorRT的engine文件,再传到板子上跑。
# 下载TensorRT .deb包(需要NVIDIA账号)
# 以TensorRT 8.6.1为例
sudo dpkg -i nv-tensorrt-local-repo-ubuntu2204-8.6.1-cuda-12.0_1.0-1_amd64.deb
sudo apt-get update
sudo apt-get install tensorrt
# 验证安装
trtexec --version
我的经验: 在PC上转模型时,记得加上 --fp16 或者 --int8 参数。BEV模型动辄几百兆,不量化的话,在Jetson Orin上跑不到实时。我曾经把一个BEVFormer模型从FP32转成FP16,推理速度直接快了2.3倍,精度只掉了0.5%。
2.5 环境验证:跑一个简单的ONNX模型
环境搭好了,得验证一下。我习惯用一个小模型做冒烟测试。
import onnxruntime as ort
import numpy as np
# 创建session
session = ort.InferenceSession("test_model.onnx")
# 构造输入
input_name = session.get_inputs()[0].name
input_shape = session.get_inputs()[0].shape
input_data = np.random.randn(*input_shape).astype(np.float32)
# 推理
outputs = session.run(None, {input_name: input_data})
print("ONNX Runtime 推理成功,输出shape:", outputs[0].shape)
如果这段代码能在板子上跑通,恭喜你,环境搭建完成了。
2.6 本章知识结构
下面这张图,帮你理清整个环境搭建的脉络。
本章小结: 环境搭建是BEV移植的基石。芯片选型决定了你的性能天花板,交叉编译环境决定了开发效率,推理引擎决定了模型能不能跑起来。这三步走扎实了,后面模型移植才能顺风顺水。