NPU代码部署*
1 概况*
使用编译器生成模型文件后,就可以在sdk上部署模型测试。 此文档基于sdk代码例子dsp/vpa/sed/vpa_algorithm.c
- 例子模型实现哭声识别,编译配置
configs/sed/sed_demo_8008_WUKONG_V1.0.config
- 8008c没有NPU,不支持
2 NPU API调用流程*
2.1 NPU任务配置*
int SedInitSnpuTask(SNPU_TASK *snpu_task)
{
snpu_task->module_id = 886;
snpu_task->ops = (void *)ops_content;
snpu_task->data = (void *)cpu_content;
snpu_task->cmd = (void *)npu_content;
snpu_task->tmp_mem = (void *)tmp_content;
return 0;
}
SedInitSnpuTask(&s_snpu_task);
s_snpu_task.input = SedGetSnpuFeatsBuffer(prev_context->snpu_buffer);
s_snpu_task.output = SedGetSnpuStateBuffer(curr_context->snpu_buffer);
2.2 NPU执行*
SnpuRunTask(&s_snpu_task, (void *)curr_context);
2.3 NPU处理回调*
NPU
执行完成后会触发回调函数VpaSedModelCallback
,可以在回调中拿到处理的结果:
int VpaSedModelCallback(unsigned int module_id, unsigned int state, void *private_data)
{
VSP_CONTEXT *context = (VSP_CONTEXT *)private_data;
// 获取输出结果
unsigned short *proOut = SedGetSnpuOutBuffer(context->snpu_buffer);
unsigned int proOut_int = VspFloat16toFloat32(proOut[0]);
g_prob_out = *((float*)&proOut_int);
return 0;
}
3 注意*
3.1 对数据的管理*
// 使数据无效,从内存重新读取
xthal_dcache_region_invalidate(buffer, size);
// 写回缓存到内存
xthal_dcache_region_writeback(buffer, size);
3.2 数据的转换*
NPU的输入输出只支持float16格式
VspFloat32ToFloat16() // float32 转 float16
VspFloat16toFloat32() // float16 转 float32