使用 SOPHON SDK 进行模型转换是将深度学习模型部署到 BM1684X 芯片的关键步骤。以下是详细的操作流程和示例:
1. 模型转换流程概述
SOPHON SDK 提供了bmnetu(通用模型编译器)和bmcv(计算机视觉库)工具,支持将主流框架(TensorFlow、Caffe、PyTorch、ONNX 等)训练的模型转换为 BM1684X 专用的 BModel 格式。转换过程主要包括:
模型导出:将训练好的模型导出为中间格式(如 ONNX)。
模型量化:将 FP32 精度模型转换为 INT8/FP16 等低精度模型,提升推理速度。
编译优化:生成针对 BM1684X 优化的 BModel 文件。
2. 转换前的准备工作
环境要求
安装 SOPHON SDK(v3.0.0 及以上版本)。
安装 Python 依赖:
pip install numpy onnx onnxruntime
模型要求
模型需为静态图(动态图需先转换为静态图)。
输入输出张量维度需明确(如[1, 3, 224, 224])。
3. 模型转换步骤
步骤 1:导出模型为 ONNX 格式(以 PyTorch 为例)
import torch
import torchvision.models as models # 加载预训练模型
model = models.resnet50(pretrained=True) model.eval() # 创建输入示例
dummy_input = torch.randn(1, 3, 224, 224) # 导出为ONNX
torch.onnx.export(
model,
dummy_input,
"resnet50.onnx",
export_params=True,
opset_version=11,
input_names=['input'],
output_names=['output'] )
步骤 2:使用bmnetu工具编译 ONNX 模型
# 基本转换命令
bmnetu --model=resnet50.onnx \
--shapes=[[1,3,224,224]] \
--target=BM1684X \
--outdir=./output \
--net_name=resnet50
参数说明
参数 | 描述 |
---|---|
--model | 输入模型文件路径(ONNX/TensorFlow/Caffe 格式) |
--shapes | 输入张量形状,例如[[1,3,224,224]] 表示批量大小为 1,3 通道,224×224 图像 |
--target | 目标芯片型号,BM1684X 芯片使用BM1684X |
--outdir | 输出目录 |
--net_name | 生成的 BModel 名称 |
--cmp | 启用精度比对(可选) |
--calibration_data | 量化校准数据集路径(INT8 量化时必需) |
4. 模型量化(可选但推荐)
为提升推理速度,通常需要将 FP32 模型量化为 INT8 模型。量化需要提供校准数据集:
# INT8量化示例(需要校准数据集)
bmnetu --model=resnet50.onnx \
--shapes=[[1,3,224,224]] \
--target=BM1684X \
--outdir=./output_int8 \
--net_name=resnet50_int8 \
--calibration_data=./calibration_data \
--calibration_iterations=100
5. 验证转换结果
转换成功后,会在outdir目录下生成以下文件:
resnet50.bmodel:可部署到 BM1684X 的模型文件。
resnet50_compare.log:精度比对日志(如果启用了--cmp)。
使用 Python API 验证推理
import bmruntime as bmr # 加载BModel
runtime = bmr.BMRuntime()
runtime.load_model("output/resnet50.bmodel") # 创建输入数据
input_data = bmr.BMData("input", shape=[1, 3, 224, 224], dtype="float32")
# 填充输入数据... # 执行推理
outputs = runtime.forward(input_data) # 处理输出结果
print("Output shape:", outputs[0].shape)
6. 常见问题与解决方案
模型转换失败:
检查模型是否为静态图,输入输出维度是否明确。
尝试降低 ONNX opset 版本(如使用opset_version=11)。
量化精度损失:
增加校准数据集的多样性和数量。
使用--calibration_iterations提高校准迭代次数。
尝试混合精度量化(部分层保持 FP16)。
性能未达预期:
使用bmprofile工具分析模型瓶颈。
调整批量大小(Batch Size)以充分利用芯片算力。
7. 高级用法
多 Batch 推理优化
# 生成支持Batch=4的模型
bmnetu --model=resnet50.onnx \
--shapes=[[4,3,224,224]] \
--target=BM1684X \
--outdir=./output_batch4
自定义预处理
使用bmcv库优化图像预处理(如缩放、归一化):
import bmcv # 创建BMImage对象
input_image = bmcv.BMImage(device_id=0, width=224, height=224, format=bmcv.BM_IMAGE_FORMAT_BGR_PLANAR) # 执行预处理(如缩放、色域转换)
bmcv.vpp_resize(ctx, src_image, input_image)
总结
通过 SOPHON SDK 的bmnetu工具,可高效地将主流框架的深度学习模型转换为 BM1684X 支持的 BModel 格式。关键步骤包括模型导出、编译优化和量化,同时可利用 SDK 提供的性能分析工具进行调优。