一、开发环境准备
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 -