你好!针对你关于 HBM 文件推理评测 的问题,这里给出完整的评测流程和关键命令。
核心结论
HBM 模型(Horizon BPU Model)只包含 BPU 算子,板端推理需要使用 BPU SDK API 编写推理程序,或使用官方提供的工具进行快速验证。
一、快速验证流程(推荐新手)
1. 查看模型信息
在板端使用 hrt_model_exec 工具查看 HBM 模型的基本信息和性能:
# 查看模型结构、输入输出 shape
hrt_model_exec model_info --model_file your_model.hbm
# 测试推理性能(latency)
hrt_model_exec perf --model_file your_model.hbm --core_id 1 --frame_count 1000 --thread_num 1
2. 使用官方示例代码
OE 开发包中提供了完整的推理示例,路径:
ddk/samples/ai_toolchain/horizon_runtime_sample/code/00_quick_start/
关键步骤:
- 编译示例:在板端运行
build_j5.sh(J5 芯片)或对应芯片的编译脚本 - 修改模型路径:将示例中的模型文件替换为你的 HBM 文件
- 准备测试数据:准备与模型输入 shape 匹配的图像/数据
- 运行推理:执行生成的脚本,查看输出结果
二、自定义推理程序开发
如果需要更灵活的评测(如自定义后处理、批量测试等),需要编写 C++ 推理程序。核心流程如下:
关键代码步骤
// Step 1: 加载模型
hbPackedDNNHandle_t packed_dnn_handle;
hbDNNHandle_t dnn_handle;
const char* model_file = "your_model.hbm";
hbDNNInitializeFromFiles(&packed_dnn_handle, &model_file, 1);
hbDNNGetModelHandle(&dnn_handle, packed_dnn_handle, model_name_list[0]);
// Step 2: 准备输入输出张量
std::vector<hbDNNTensor> input_tensors;
std::vector<hbDNNTensor> output_tensors;
// 获取输入输出数量并分配内存
hbDNNGetInputCount(&input_count, dnn_handle);
hbDNNGetOutputCount(&output_count, dnn_handle);
// 使用 hbSysAllocCachedMem 分配带缓存的内存
// Step 3: 填充输入数据
// 将图像/数据拷贝到 input_tensors 的内存空间
// 注意数据格式对齐(NV12/NCHW 等)
// Step 4: 执行推理
hbDNNInferCtrlParam infer_ctrl_param;
HB_DNN_INITIALIZE_INFER_CTRL_PARAM(&infer_ctrl_param);
hbDNNInfer(&task_handle, &output, input_tensors.data(), dnn_handle, &infer_ctrl_param);
hbDNNWaitTaskDone(task_handle, 0);
// Step 5: 读取输出结果
// 使用 hbSysFlushMem 同步数据到缓存
// 解析 output_tensors 中的推理结果
// Step 6: 释放资源
hbDNNReleaseTask(task_handle);
hbSysFreeMem(&input_tensors[i].sysMem[0]);
hbDNNRelease(packed_dnn_handle);
三、评测指标获取
1. 推理速度
- 使用
hrt_model_exec perf命令获取平均延迟 - 或在代码中使用
chrono记录hbDNNInfer到hbDNNWaitTaskDone的时间
2. 推理结果正确性
- 对比方法:将板端输出与 PC 端浮点模型/量化模型的输出进行对比
- 工具:使用
hrt_bin_dump工具导出中间层数据进行调试 - 一致性验证:参考社区帖子 QAT 一致性对齐流程
3. 内存占用
- 通过
hbSysAllocCachedMem分配的内存大小累加 - 或使用系统命令
cat /proc/meminfo监控
四、常见问题排查
| 问题 | 排查方法 |
|---|---|
| 模型加载失败 | 检查 OE 版本与编译版本是否匹配,参考 FAQ 手册 |
| 输出 shape 不对 | 使用 hrt_model_exec model_info 确认模型输入输出定义 |
| 推理结果异常 | 检查输入数据对齐规则(NV12/NCHW),参考 对齐规则解析 |
| 速度慢 | 确认 core_id 设置,检查是否使用了 BPU 而非 CPU |
五、推荐学习资源
- 官方教程:模型推理快速上手 - 详细代码解读
- API 手册:工具链手册中的 BPU SDK API 章节
- 示例代码:OE 包中的
horizon_runtime_sample和ai_forward_view_sample - 一致性验证:QAT 一致性对齐流程
下一步建议
- 先用
hrt_model_exec快速验证模型能否正常加载和推理 - 基于官方
00_quick_start示例修改,适配你的 HBM 模型 - 如需进一步帮助,请提供:
- 芯片型号(J5/X3/S100 等)
- OE 开发包版本
- 模型类型(分类/检测/分割等)
- 具体报错信息(如有)
欢迎将评测过程中遇到的问题发帖到社区,方便其他开发者参考!