产品咨询:19113907060
联系我们
产品咨询

使用算能BM1684X 开发板进行模型开发全流程

作者:万物纵横
发布时间:2025-11-24 10:17
阅读量:

一、开发环境准备


1. 硬件连接与系统准备


硬件连接:将核心板插入底板,确保卡扣牢固;连接散热风扇和电源;


系统安装:


下载 BM1684X 专用 Ubuntu 镜像 (如 Ubuntu 20.04);


使用 balenaEtcher 等工具烧录至 TF 卡;


将 TF 卡插入开发板,启动系统;


2. 软件环境搭建(PC 端)


安装依赖:


# Ubuntu
sudo apt update

sudo apt install docker.io python3 python3-dev libgl1-mesa-glx


获取 SDK:从算能官网下载对应版本 SDK(推荐 v24.04.01 以上)


启动 Docker 开发环境:


# 启动TPU-MLIR容器
docker run --privileged --name tpu_mlir -v $PWD:/workspace -it sophgo/tpuc_dev:latest


二、模型转换流程(以 ONNX 模型为例)


1. 模型准备


将训练好的模型导出为 ONNX 格式(支持 PyTorch/TensorFlow/Paddle 等框架);


确保模型输入尺寸符合 BM1684X 要求(如 YOLOv5 常见 [1,3,640,640]);


2. 使用 TPU-MLIR 工具链转换


# 1. ONNX转MLIR
model_transform.py \
--model_name yolov5s \
--model_def yolov5s.onnx \
--input_shapes [[1,3,640,640]] \
--mean 0.0,0.0,0.0 \
--scale 0.0039216,0.0039216,0.0039216 \
--keep_aspect_ratio \
--pixel_format rgb \
--mlir yolov5s.mlir
# 2. MLIR转BModel(FP32)
model_deploy.py \
--mlir yolov5s.mlir \
--quantize F32 \
--processor bm1684x \
--model yolov5s_1684x_f32.bmodel
# 3. MLIR转BModel(INT8量化)
# 先进行校准
run_calibration.py \
--mlir yolov5s.mlir \
--processor bm1684x \
--dataset_path COCO2017 \
--calibration_table yolov5s_calib.table
# 生成INT8模型
model_deploy.py \
--mlir yolov5s.mlir \
--quantize INT8 \
--processor bm1684x \
--calibration_table yolov5s_calib.table \
--model yolov5s_1684x_int8.bmodel


3. 转换参数说明


参数

说明

--model_name

模型名称,自定义

--model_def

原始模型文件 (.onnx/.tflite/.prototxt)

--input_shapes

输入张量 shape,多输入用逗号分隔

--mean/--scale

图像预处理参数(x-mean)* scale

--quantize

量化方式:F32/FP16/BF16/INT8

--processor

指定芯片型号:bm1684x

--calibration_table

INT8 量化时的校准表


三、模型推理开发


1. 开发板环境配置


安装驱动和 SDK:


# 安装驱动
sudo dpkg -i sophon-driver_<version>_arm64.deb
# 安装运行时库
sudo dpkg -i sophon-libsophon_<version>_arm64.deb


2. 编写推理代码(Python 示例)


import sophon.sail as sail
# 1. 初始化BMRT
handle = sail.BMHandle()
handle.init(0)  # 0表示第一个TPU设备
# 2. 加载BModel
model = sail.BMModel(handle, "yolov5s_1684x_int8.bmodel")
# 3. 准备输入数据
input_data = sail.BMData(handle, model.get_input_shape(0))
input_data.from_numpy(image_data)  # image_data为预处理后的numpy数组
# 4. 执行推理
outputs = model.process([input_data])
# 5. 处理输出结果
result = outputs[0].to_numpy()
# 进行后处理,如NMS、类别映射等


3. C++ 推理代码示例


#include <sophon/sail.h>
int main() {
// 1. 初始化BMRT
BMHandle handle;
handle.init(0);
// 2. 加载BModel
BMModel model(handle, "yolov5s_1684x_int8.bmodel");
// 3. 准备输入
vector<BMData> inputs;
BMData input(handle, model.get_input_shape(0));
input.from_cpu(data);  // data为预处理后的数据
inputs.push_back(input);
// 4. 推理
vector<BMData> outputs = model.process(inputs);
// 5. 获取输出
float* output_data = (float*)outputs[0].to_cpu();
// 处理结果
return 0;
}


4. 推理性能优化技巧


内存优化:


使用内存池避免频繁分配释放;


确保数据按 NPU 对齐要求存储(BM1684X 的 LMEM 划分为 64 个分区);


批量处理:


设置合适的 batch size(如视频流处理建议 8-16);


使用 pipeline 架构(前处理 / 推理 / 后处理并行);


精度选择:


视觉任务优先使用 INT8 量化(可提升 4 倍性能);


大语言模型推荐 W4BF16 或 BF16 混合精度;


四、模型性能调优与部署


1. 模型量化技巧


INT8 量化:


使用足够多的校准样本(建议 1000+);


对于难量化层,可生成 qtable 文件指定哪些层使用浮点计算;


混合精度 (Hybrid Precision):


# 生成混合精度模型(自动选择F16/F32)
model_deploy.py \
--mlir yolov5s.mlir \
--quantize INT8 \
--processor bm1684x \
--calibration_table yolov5s_calib.table \
--mix_precision auto \
--model yolov5s_1684x_hybrid.bmodel


2. 模型部署与测试


文件传输:


# 从PC端到开发板
scp yolov5s_1684x_int8.bmodel username@<开发板IP>:/home/ubuntu/models/


性能测试:


# 使用sophon-perf工具测试
sophon-perf --model yolov5s_1684x_int8.bmodel --batch_size 4 --iterations 100


常见问题排查:


模型转换失败:检查 ONNX 模型是否合规,是否有不支持的算子;


推理结果异常:核对预处理 / 后处理是否与训练一致;


性能不佳:检查内存使用是否合理,是否启用了量化;


五、进阶开发(选做)


1. 使用 BMLang 高级编程接口


BMLang 提供 C++ 高级接口,无需了解硬件细节即可开发高效模型:


#include <bmlang/bmlang.h>
int main() {
// 创建计算图
bmlang::Graph graph;
// 定义输入
auto input = graph.var("input", bmlang::TensorType::float32({1,3,640,640}));
// 添加卷积层
auto conv = graph.conv(input, "conv1", {3,3,64}, {1,1}, padding="SAME");
// 添加激活函数
auto relu = graph.relu(conv, "relu1");
// 编译为BModel
graph.compile("my_model.bmodel", bmlang::CompileOptions::bm1684x());
return 0;
}


2. 自定义算子开发


对于特殊需求,可开发自定义算子:


编写算子实现(C++);


使用bmlang::custom_op接口集成到模型中;


编译时指定自定义算子库路径;


六、总结与下一步


使用 BM1684X 开发板进行模型开发的完整流程为:


训练模型 → 转换为 ONNX → TPU-MLIR 转换为 BModel → 开发板部署推理;


核心要点:


使用 TPU-MLIR 工具链进行模型转换,支持 FP32/INT8/BF16/F16 多种精度;


使用 sophon-sail 库进行推理开发,简单高效;


通过量化和内存优化提升模型性能;


下一步建议:


从官方示例入手(如 YOLOv5/YOLOX),熟悉基本流程;


尝试不同模型(如 ResNet、BERT 等)的转换和部署;


针对特定应用场景进行性能调优,充分发挥 BM1684X 的 32TOPS 算力优势;


注:完整开发文档可参考算能官网 SDK 文档和 GitHub 上的 TPU-MLIR 项目。

- END -
分享:
留言 留言 试用申请
电话咨询 电话咨询 电话联系
19113907060
微信在线客服 微信在线客服 在线客服
返回官网顶部 返回官网顶部 回到顶部
关闭窗口
产品订购
  • *

  • *

  • *

  • *

  • *