跳转至

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