4. 开发环境搭建:硬件平台选型与SDK部署

好,咱们进入实战环节的第一步——搭环境。说实话,很多同学觉得搭环境就是装个软件、解压个包,没什么技术含量。但我得说,这一步要是没走稳,后面调试的时候能让你怀疑人生。我自己就吃过这个亏,所以今天把这部分掰开揉碎了讲清楚。

4.1 硬件平台选型:RK3588 vs BM1684

先聊聊硬件选型。目前市面上主流的边缘AI芯片,瑞芯微RK3588和算能BM1684是绕不开的两个选择。我个人的习惯是,先看项目需求,再定芯片,千万别反过来。

对比项 RK3588 BM1684
NPU算力 6 TOPS (INT8) 17.6 TOPS (INT8)
CPU架构 4×Cortex-A76 + 4×Cortex-A55 8×Cortex-A53
内存支持 LPDDR4/LPDDR5,最大32GB LPDDR4,最大12GB
典型功耗 约8W 约15W
开发工具链 RKNN Toolkit BMNNSDK / TPU-MLIR
适用场景 轻量级AI + 多媒体处理 中高算力AI推理

简单说下我的看法。RK3588的优势在于CPU性能强,A76大核跑通用计算很猛,而且集成了GPU、VPU,适合做带显示或视频处理的AI应用。BM1684呢,NPU算力是它的杀手锏,17.6 TOPS在边缘端算是很能打的了,但CPU部分偏弱,A53跑复杂逻辑会吃力。

我的建议:如果你做的是智能摄像头、边缘盒子这类产品,RK3588更均衡。如果是纯AI推理任务,比如人脸识别闸机、工业质检,BM1684的NPU算力优势更明显。

4.2 交叉编译工具链安装

交叉编译,说白了就是在你的x86电脑上编译出能在ARM芯片上跑的程序。嗯,这里要注意,工具链版本一定要和芯片匹配,否则编译出来的程序跑不起来。

4.2.1 RK3588交叉编译工具链

瑞芯微官方提供了基于GCC的交叉编译工具链。我个人习惯用aarch64-linux-gnu这个版本,因为RK3588是64位ARMv8架构。

# 下载工具链(以Ubuntu 20.04为例)
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

# 验证安装
aarch64-linux-gnu-gcc --version
我曾经踩过的坑:一开始我图省事,直接用了系统自带的gcc-arm-linux-gnueabihf,结果编译出来的程序在RK3588上段错误。后来才发现,RK3588是64位,必须用aarch64版本。32位和64位不兼容,这个坑我替你们踩过了。

4.2.2 BM1684交叉编译工具链

算能这边,官方推荐使用gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu。注意,BM1684虽然是64位,但它的系统环境对工具链版本有要求,太新或太旧都可能出问题。

# 下载算能官方工具链
wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/03/07/13/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz

# 解压
tar -xvf gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/

# 设置环境变量(建议写入~/.bashrc)
export PATH=/opt/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin:$PATH

# 测试
aarch64-none-linux-gnu-gcc --version

你想想看,工具链装好后,怎么验证它能不能用?我一般写个简单的hello world,交叉编译后放到板子上跑一下。这一步虽然简单,但能提前暴露很多问题。

4.3 SDK部署

SDK部署是重头戏。说白了,就是把芯片厂商提供的开发包放到你的开发环境里,让它能正常编译和链接。

4.3.1 RK3588 SDK部署(RKNN Toolkit)

瑞芯微的AI开发主要依赖RKNN Toolkit。这个工具负责把训练好的模型(比如PyTorch、TensorFlow)转换成RK3588能跑的.rknn格式。

# 安装RKNN Toolkit(Python环境)
pip install rknn-toolkit2 -i https://pypi.douban.com/simple/

# 验证安装
python -c "from rknn.api import RKNN; print('RKNN Toolkit installed successfully')"

# 下载RK3588的NPU驱动和固件(放到板子上)
# 在板子上执行:
sudo dpkg -i rknpu-driver_*.deb
关键点:RKNN Toolkit有两个版本——rknn-toolkit和rknn-toolkit2。RK3588必须用rknn-toolkit2,别搞混了。我见过有人用错版本,折腾了一整天。

4.3.2 BM1684 SDK部署(BMNNSDK)

算能的SDK叫BMNNSDK,它包含了模型转换工具、运行时库、示例代码等。我个人习惯把SDK放在/opt/sophon/目录下,方便管理。

# 下载BMNNSDK(约2GB,耐心等待)
wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/03/07/13/BMNNSDK2.7.0.tar.gz

# 解压到/opt
sudo tar -xzvf BMNNSDK2.7.0.tar.gz -C /opt/
sudo mv /opt/BMNNSDK2.7.0 /opt/sophon

# 设置环境变量
export BMNNSDK_HOME=/opt/sophon
export PATH=$BMNNSDK_HOME/bin:$PATH
export LD_LIBRARY_PATH=$BMNNSDK_HOME/lib:$LD_LIBRARY_PATH

# 验证
bm_version

这里有个小技巧。SDK里的示例代码一定要跑一遍,哪怕只是编译通过。我在项目中遇到过,SDK版本更新后,某些API的调用方式变了,但文档没及时更新。跑一遍示例能帮你确认当前版本的实际用法。

4.4 环境验证:跑通第一个AI程序

环境搭好了,总得验证一下。我习惯用官方提供的分类模型来测试,比如MobileNet。这样能快速确认NPU、CPU、内存、工具链是否都正常工作。

# RK3588上跑MobileNet示例
cd /path/to/rknn-toolkit2/examples/mobilenet
python test.py

# 如果输出类似以下内容,说明环境OK:
# --- TOP 5 ---
# 0: 286, 0.89209
# 1: 285, 0.05127
# ...
避坑指南:如果程序跑不起来,先检查板子的NPU驱动是否加载。执行lsmod | grep rknpu,如果没有输出,说明驱动没装好。我曾经因为驱动版本不对,折腾了整整一个下午。

好了,环境搭建这部分就到这里。说白了,硬件选型看需求,工具链安装看架构,SDK部署看版本。这三样都对了,后面的开发才能顺风顺水。下一章咱们开始写第一个异构计算程序,到时候见。