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端侧移植环境搭建知识结构 BEV端侧移植 · 环境搭建知识结构 环境搭建总览 芯片选型 交叉编译环境 推理引擎安装 Jetson Orin RK3588 地平线 J5 工具链安装 CMake配置 依赖库交叉编译 ONNX Runtime TensorRT 环境验证 💡 核心思路:PC端开发 → 交叉编译 → 板端部署 先选芯片,再配工具链,最后装推理引擎,缺一不可

本章小结: 环境搭建是BEV移植的基石。芯片选型决定了你的性能天花板,交叉编译环境决定了开发效率,推理引擎决定了模型能不能跑起来。这三步走扎实了,后面模型移植才能顺风顺水。