2、硬件与软件环境准备:熟悉BM1684/BM1688开发板、PCIe/SoC模式、SDK版本、驱动安装、交叉编译工具链及测试工具链的搭建

在开始BM1684/BM1688项目验收之前,必须首先完成硬件与软件环境的系统化准备。环境搭建的质量直接决定了后续帧率、延迟、准确率和稳定性测试数据的可信度。若环境不一致,不同团队或不同批次测试得出的数据将不具备可比性,甚至可能因驱动版本不匹配导致推理结果错误。本章将围绕开发板硬件认知、PCIe/SoC双模式差异、SDK与驱动管理、交叉编译工具链配置以及测试工具链搭建五个核心维度展开,帮助验收团队建立一套可复现、可追溯的标准化环境基线。

BM1684/BM1688 验收环境准备链路 硬件平台层 • BM1684/BM1688 模组 • PCIe加速卡 / SoC核心板 • 电源: 12V/5A (PCIe) • 散热: 主动风扇/被动散热片 • 调试串口: UART / JTAG 运行模式 PCIe模式 SoC模式 Host + 加速卡 独立嵌入式系统 共享内存/中断 软件工具链 • SDK: tpu-mlir / BMNNSDK2 • 驱动: bmnpu.ko / 内核模块 • 交叉编译: aarch64-linux-gnu-gcc • 测试工具: perf / bmrt_test • 监控: bm-smi / 温度传感器 验收测试目标 帧率(FPS) 延迟(Latency) 准确率(Accuracy) 稳定性(Stability) 测试执行流程 环境基线确认 → 驱动/SDK版本核对 → 编译测试程序 → 运行并采集数据 → 结果归档与复现验证

上图展示了从硬件平台到验收目标的完整链路。在实际操作中,环境准备并非一次性工作,而是需要形成文档化的基线记录。以下各节将逐一拆解每个环节的具体操作步骤、验证方法及常见问题。

2.1 开发板硬件认知与接口检查

核心原理:BM1684是算能科技推出的第三代TPU芯片,INT8算力达17.6 TOPS,FP32算力约2.2 TFLOPS;BM1688则面向更低功耗场景,INT8算力约16 TOPS。两者均支持PCIe Gen3 x4接口和SoC模式(片上系统)。在验收前,必须确认开发板的硬件版本、内存容量(BM1684通常搭配12GB DDR4,BM1688搭配8GB或16GB LPDDR4X)、eMMC存储大小以及散热方案是否满足持续满载测试需求。

操作流程:

  1. 外观与接口检查:核对开发板上的丝印版本号,确认PCIe金手指无氧化、供电接口无松动。使用万用表测量电源输入电压是否在额定范围内(PCIe卡通常为12V±5%)。
  2. 串口连接:使用USB转TTL模块连接调试串口(通常为3.3V电平,波特率115200),上电后应能看到U-Boot启动日志。
  3. 系统启动验证:SoC模式下,开发板应能独立启动Linux系统;PCIe模式下,开发板作为从设备,由Host主机识别。
经验提醒:在验收前,建议对每块开发板进行48小时连续上电老化测试,排除早期失效。记录每块板的序列号、固件版本、MAC地址等信息,建立硬件台账。

2.2 PCIe模式与SoC模式的区别及选型

核心原理:PCIe模式下,BM1684/BM1688作为协处理器,通过PCIe总线与x86/ARM主机通信,利用主机内存和存储资源,适合需要复杂预处理或后处理的AI应用。SoC模式下,芯片独立运行Linux系统,所有计算在板内完成,适合边缘部署场景。两种模式在驱动加载方式、内存管理、数据交互路径上存在本质差异。

对比维度PCIe模式SoC模式
驱动安装位置Host主机(x86/ARM)开发板自身Linux内核
内存管理通过DMA映射主机内存使用板载DDR/LPDDR
数据交互PCIe DMA + 中断内部总线 + 共享内存
典型应用服务器端视频分析车载/安防边缘盒子
调试方式主机侧gdb + dmesg板载串口 + 网络SSH
功耗范围25W-35W(含散热)15W-25W(被动散热)

判断方法:验收前需明确项目部署形态。若测试目标为边缘设备,则必须使用SoC模式进行测试;若为数据中心场景,则采用PCIe模式。两种模式的帧率表现可能差异显著,因为PCIe模式下数据搬运存在额外延迟。

风险提示:切勿在PCIe模式下使用SoC模式的驱动包,会导致内核模块加载失败或系统崩溃。务必根据实际模式选择对应的SDK版本。

2.3 SDK版本选择与驱动安装

核心原理:算能科技提供BMNNSDK2(包含编译工具、运行时库、示例代码)和tpu-mlir(用于模型转换)。SDK版本与芯片型号、驱动版本存在严格对应关系。例如,BMNNSDK2.7.0支持BM1684,而BMNNSDK2.8.0及以上版本才支持BM1688。驱动模块(bmnpu.ko)负责管理TPU的算力资源、内存分配和任务调度。

操作流程:

# 1. 确认芯片型号
cat /proc/bm_version  # SoC模式
lspci | grep -i "bm168"  # PCIe模式

# 2. 安装SDK(以BMNNSDK2.8.0为例)
wget https://sophon-edge.sophon.cn/BMNNSDK2.8.0/BMNNSDK2.8.0-linux.tar.gz
tar -xzf BMNNSDK2.8.0-linux.tar.gz
cd BMNNSDK2.8.0
./install.sh --target=bm1688 --mode=soc  # 或 --mode=pcie

# 3. 加载驱动(PCIe模式需在Host侧执行)
insmod /opt/bmnnsdk2/driver/bmnpu.ko
# 验证驱动
ls /dev/bm*
# 预期输出: /dev/bmdev0 /dev/bmctl0

# 4. 设置环境变量
export PATH=$PATH:/opt/bmnnsdk2/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/bmnnsdk2/lib

案例拆解:某安防项目使用BM1688 SoC模式,误将BM1684的驱动包安装到系统中,导致调用bmrt_load_model时返回“Unsupported chip”错误。排查过程:通过dmesg | grep bmnpu查看内核日志,发现驱动版本与芯片ID不匹配。解决方法是卸载旧驱动,重新编译安装匹配的驱动模块,并验证bm_version输出正确。

2.4 交叉编译工具链配置

核心原理:SoC模式下,开发板资源有限,通常需要在x86主机上使用交叉编译工具链生成ARM架构的可执行文件。BM1688采用ARM Cortex-A53架构,需使用aarch64-linux-gnu-gcc工具链。PCIe模式下,若Host为x86,则使用原生gcc;若Host为ARM,则同样需要交叉编译。

配置步骤:

  1. 安装工具链:sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
  2. 验证编译环境:编写简单的hello.c,使用aarch64-linux-gnu-gcc hello.c -o hello编译,通过file hello确认输出为“ELF 64-bit LSB executable, ARM aarch64”。
  3. 链接SDK库:编译时需指定-I/opt/bmnnsdk2/include和-L/opt/bmnnsdk2/lib,并添加-lbmlib -lbmrt等链接选项。
关键参数:在CMakeLists.txt中设置set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc),并确保SDK的lib目录下存在libbmrt.so和libbmlib.so的ARM版本。若使用PCIe模式且Host为x86,则无需交叉编译,直接使用gcc即可。

2.5 测试工具链搭建

核心原理:验收测试需要一套完整的工具链来采集帧率、延迟、准确率和稳定性数据。基础工具包括:bmrt_test(用于验证模型推理正确性)、bm-smi(监控芯片温度、利用率、显存占用)、perf(性能分析)、以及自定义的C++/Python测试程序。

工具清单与用途:

工具名称用途关键参数
bmrt_test验证模型输出与参考结果一致性--input 输入数据 --output 输出目录
bm-smi监控芯片状态watch -n 1 bm-smi
perf stat统计CPU/内存/上下文切换perf stat -e task-clock,context-switches
自定义测试程序测量端到端延迟和帧率循环推理并记录时间戳

操作流程:

# 1. 运行模型正确性测试
bmrt_test --context_dir ./bm1688_yolov5s --input ./test_input.bin --output ./output

# 2. 监控芯片状态(另开终端)
watch -n 1 bm-smi

# 3. 运行自定义性能测试程序
./benchmark --model ./yolov5s.bmodel --loop 1000 --warmup 10

案例拆解:在BM1684 PCIe模式下测试YOLOv5s模型时,发现帧率仅为预期的一半。通过bm-smi观察到芯片利用率仅40%,而CPU占用率高达90%。分析发现瓶颈在Host侧图像预处理(OpenCV缩放)未充分利用多线程。优化方案:使用cv::setNumThreads(8)并启用硬件加速(如IPP),最终帧率从45 FPS提升至82 FPS。

常见误区:测试时未进行warm-up(预热),导致前几次推理包含驱动初始化开销,帧率数据偏低。正确做法是先运行10-20次推理预热,再开始计时。另外,测试环境应关闭无关进程(如GUI、自动更新),避免干扰延迟数据。

2.6 环境基线文档化与复现验证

核心原理:验收数据的可复现性依赖于环境基线的完整记录。基线文档应包含:硬件版本、SDK版本、驱动版本、内核版本、编译选项、测试工具版本、环境变量、以及所有依赖库的哈希值。

操作流程:

  1. 生成环境快照:bm_version > env_snapshot.txt,uname -a >> env_snapshot.txt,md5sum /opt/bmnnsdk2/lib/*.so >> env_snapshot.txt。
  2. 将快照文件与测试代码、模型文件一并归档至版本控制仓库。
  3. 在另一台相同配置的机器上执行./run_all_tests.sh,对比输出结果是否一致。
复盘经验:某团队在验收时未记录SDK补丁版本,后续复测时发现准确率下降0.5%,最终定位为SDK小版本更新导致的算子优化差异。因此,建议使用git tag管理SDK版本,并在测试报告中明确标注。

完成上述环境准备后,验收团队即可在统一、可控的软硬件基础上开展帧率、延迟、准确率和稳定性测试,确保所有测试结果具备横向可比性和纵向可追溯性。