11bd4fe43Sopenharmony_ci### 4.2.2.NNIE介绍 21bd4fe43Sopenharmony_ci 31bd4fe43Sopenharmony_ci#### 4.2.2.1 NNIE概念 41bd4fe43Sopenharmony_ci 51bd4fe43Sopenharmony_ciNNIE是Neural Network Inference Engine的简称,是上海海思媒体SoC中专门针对神经网络特别是深度学习卷积神经网络进行加速处理的硬件单元,支持现有大部分的公开网络,如Alexnet、VGG16、Googlenet、Resnet18、Resnet50等分类网络,FasterR-CNN、YOLO、SSD、RFCN等检测网络,以及SegNet、FCN等场景分割网络。用户基于NNIE开发智能分析方案,降低CPU占用。 61bd4fe43Sopenharmony_ci 71bd4fe43Sopenharmony_ci目前NNIE配套软件及工具链仅支持Caffe框架,使用其他框架的网络模型需要转化为Caffe框架下的模型。 81bd4fe43Sopenharmony_ci 91bd4fe43Sopenharmony_ci#### 4.2.2.2 NNIE API接口 101bd4fe43Sopenharmony_ci 111bd4fe43Sopenharmony_ciNNIE模块提供了创建任务和查询任务的基本接口。 121bd4fe43Sopenharmony_ci 131bd4fe43Sopenharmony_cil HI_MPI_SVP_NNIE_LoadModel:从用户事先加载到buf中的模型中解析出网络模型。 141bd4fe43Sopenharmony_ci 151bd4fe43Sopenharmony_cil HI_MPI_SVP_NNIE_GetTskBufSize:获取给定网络任务各段辅助内存大小。 161bd4fe43Sopenharmony_ci 171bd4fe43Sopenharmony_cil HI_MPI_SVP_NNIE_Forward:多节点输入输出的CNN类型网络预测。 181bd4fe43Sopenharmony_ci 191bd4fe43Sopenharmony_cil HI_MPI_SVP_NNIE_ForwardWithBbox:多个节点feature map输入。 201bd4fe43Sopenharmony_ci 211bd4fe43Sopenharmony_cil HI_MPI_SVP_NNIE_UnloadModel:卸载模型。 221bd4fe43Sopenharmony_ci 231bd4fe43Sopenharmony_cil HI_MPI_SVP_NNIE_Query:查询任务是否完成。 241bd4fe43Sopenharmony_ci 251bd4fe43Sopenharmony_cil HI_MPI_SVP_NNIE_AddTskBuf:记录TskBuf地址信息。 261bd4fe43Sopenharmony_ci 271bd4fe43Sopenharmony_cil HI_MPI_SVP_NNIE_RemoveTskBuf:移除TskBuf地址信息。 281bd4fe43Sopenharmony_ci 291bd4fe43Sopenharmony_ciNNIE API接口中参数的数据类型类型,请查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiSVP API 参考.pdf》中的2.4 数据类型和数据结构内容,如下图所示: 301bd4fe43Sopenharmony_ci 311bd4fe43Sopenharmony_ci 321bd4fe43Sopenharmony_ci 331bd4fe43Sopenharmony_ci**注:本章节提到的错误码,请查阅源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中的《HiSVP API 参考.pdf》操作手册中对应的错误码内容。** 341bd4fe43Sopenharmony_ci 351bd4fe43Sopenharmony_ci接下来对NNIE API接口进行详细描述。 361bd4fe43Sopenharmony_ci 371bd4fe43Sopenharmony_ci###### HI_MPI_SVP_NNIE_LoadModel 381bd4fe43Sopenharmony_ci 391bd4fe43Sopenharmony_ci【描述】 401bd4fe43Sopenharmony_ci 411bd4fe43Sopenharmony_ci* 从用户事先加载到buf中的模型中解析出网络模型。 421bd4fe43Sopenharmony_ci 431bd4fe43Sopenharmony_ci【语法】 441bd4fe43Sopenharmony_ci 451bd4fe43Sopenharmony_ci* HI_S32 HI_MPI_SVP_NNIE_LoadModel (const SVP_SRC_MEM_INFO_S *pstModelBuf, SVP_NNIE_MODEL_S *pstModel); 461bd4fe43Sopenharmony_ci 471bd4fe43Sopenharmony_ci【参数】 481bd4fe43Sopenharmony_ci 491bd4fe43Sopenharmony_ci 501bd4fe43Sopenharmony_ci 511bd4fe43Sopenharmony_ci【返回值】 521bd4fe43Sopenharmony_ci 531bd4fe43Sopenharmony_ci 541bd4fe43Sopenharmony_ci 551bd4fe43Sopenharmony_ci【需求】 561bd4fe43Sopenharmony_ci 571bd4fe43Sopenharmony_ci* 头文件:hi_comm_svp.h、hi_nnie.h、mpi_nnie.h 581bd4fe43Sopenharmony_ci 591bd4fe43Sopenharmony_ci* 库文件:libnnie.a(PC上模拟用nniefc1.1.lib\nnieit1.1.lib) 601bd4fe43Sopenharmony_ci 611bd4fe43Sopenharmony_ci【注意】 621bd4fe43Sopenharmony_ci 631bd4fe43Sopenharmony_ci* 用户需要保证pstModelBuf中的地址所指向的内存中存储的模型数据的完整性和正确性。 641bd4fe43Sopenharmony_ci 651bd4fe43Sopenharmony_ci* 用户需要保证pstModelBuf中的地址所指向的内存只有当所存储的模型不再使用后才能被释放,并且在释放之前内存中的数据不能被修改。 661bd4fe43Sopenharmony_ci 671bd4fe43Sopenharmony_ci* 用户需要保证解析获得的pstModel里的内容不能被修改。 681bd4fe43Sopenharmony_ci 691bd4fe43Sopenharmony_ci###### HI_MPI_SVP_NNIE_GetTskBufSize 701bd4fe43Sopenharmony_ci 711bd4fe43Sopenharmony_ci【描述】 721bd4fe43Sopenharmony_ci 731bd4fe43Sopenharmony_ci* 获取给定网络任务各段辅助内存大小。 741bd4fe43Sopenharmony_ci 751bd4fe43Sopenharmony_ci【语法】 761bd4fe43Sopenharmony_ci 771bd4fe43Sopenharmony_ci* HI_S32 HI_MPI_SVP_NNIE_GetTskBufSize(HI_U32 u32MaxBatchNum, HI_U32 u32MaxBboxNum, const SVP_NNIE_MODEL_S *pstModel, HI_U32 au32TskBufSize[], HI_U32 u32NetSegNum); 781bd4fe43Sopenharmony_ci 791bd4fe43Sopenharmony_ci【参数】 801bd4fe43Sopenharmony_ci 811bd4fe43Sopenharmony_ci 821bd4fe43Sopenharmony_ci 831bd4fe43Sopenharmony_ci【返回值】 841bd4fe43Sopenharmony_ci 851bd4fe43Sopenharmony_ci 861bd4fe43Sopenharmony_ci 871bd4fe43Sopenharmony_ci【需求】 881bd4fe43Sopenharmony_ci 891bd4fe43Sopenharmony_ci* 头文件:hi_comm_svp.h、hi_nnie.h、mpi_nnie.h 901bd4fe43Sopenharmony_ci 911bd4fe43Sopenharmony_ci* 库文件:libnnie.a(PC上模拟用nniefc1.1.lib\nnieit1.1.lib) 921bd4fe43Sopenharmony_ci 931bd4fe43Sopenharmony_ci【注意】 941bd4fe43Sopenharmony_ci 951bd4fe43Sopenharmony_ci* 针对单线程运行一个网络模型,用户开辟tskBuf可以根据网络段的运行关系来选择以下两种方案: 961bd4fe43Sopenharmony_ci 971bd4fe43Sopenharmony_ci * 1)NNIE→非NNIE→NNIE→非NNIE,类似这种NNIE、非NNIE(CPU或者DSP等)间隔的网络,用户可以选择开辟一个分段au32TskBufSize[]中的最大值,每个段可以复用这段内存; 981bd4fe43Sopenharmony_ci 991bd4fe43Sopenharmony_ci * 2)NNIE→NNIE→非NNIE→NNIE→非NNIE,类似这种存在N个NNIE连续顺序执行段的网络,连续的NNIE段不能复用tskBuf,按照最省内存原则可以选择开辟满足这N个连续NNIE段的其中N-1个size和最小的tskBuf以及剩余所有段中最大的一片tskBuf,具体按文中示例,可以选择开辟“NNIE→NNIE”中较小size的tskBuf,后面“非NNIE→NNIE→非NNIE”中可以复用最大size这片taskBuf; 1001bd4fe43Sopenharmony_ci 1011bd4fe43Sopenharmony_ci* 多线程运行同一个网络模型,每个线程需要各自独立的tskBuf,开辟的方式可以参考“针对单线程运行一个网络模型”的情况。 1021bd4fe43Sopenharmony_ci 1031bd4fe43Sopenharmony_ci###### HI_MPI_SVP_NNIE_Forward 1041bd4fe43Sopenharmony_ci 1051bd4fe43Sopenharmony_ci【描述】 1061bd4fe43Sopenharmony_ci 1071bd4fe43Sopenharmony_ci* 多节点输入输出的CNN类型网络预测。 1081bd4fe43Sopenharmony_ci 1091bd4fe43Sopenharmony_ci【语法】 1101bd4fe43Sopenharmony_ci 1111bd4fe43Sopenharmony_ci* HI_S32 HI_MPI_SVP_NNIE_Forward(SVP_NNIE_HANDLE *phSvpNnieHandle, const SVP_SRC_BLOB_S astSrc[], const SVP_NNIE_MODEL_S *pstModel, const SVP_DST_BLOB_S astDst[], const SVP_NNIE_FORWARD_CTRL_S *pstForwardCtrl, HI_BOOL bInstant); 1121bd4fe43Sopenharmony_ci 1131bd4fe43Sopenharmony_ci【参数】 1141bd4fe43Sopenharmony_ci 1151bd4fe43Sopenharmony_ci 1161bd4fe43Sopenharmony_ci 1171bd4fe43Sopenharmony_ci 1181bd4fe43Sopenharmony_ci 1191bd4fe43Sopenharmony_ci 1201bd4fe43Sopenharmony_ci 1211bd4fe43Sopenharmony_ci【返回值】 1221bd4fe43Sopenharmony_ci 1231bd4fe43Sopenharmony_ci 1241bd4fe43Sopenharmony_ci 1251bd4fe43Sopenharmony_ci【需求】 1261bd4fe43Sopenharmony_ci 1271bd4fe43Sopenharmony_ci* 头文件:hi_comm_svp.h、hi_nnie.h、mpi_nnie.h 1281bd4fe43Sopenharmony_ci 1291bd4fe43Sopenharmony_ci* 库文件:libnnie.a(PC上模拟用nniefc1.1.lib\nnieit1.1.lib) 1301bd4fe43Sopenharmony_ci 1311bd4fe43Sopenharmony_ci【注意】 1321bd4fe43Sopenharmony_ci 1331bd4fe43Sopenharmony_ci* 用户需要保证pstModel->stBase中的地址所指向的内存中数据的完整性和正确性。 1341bd4fe43Sopenharmony_ci 1351bd4fe43Sopenharmony_ci* 用户需要保证pstModel结构体中的内容与pstModel->stBase中的地址所指向的内存中的数据是同一个模型文件解析获得的。 1361bd4fe43Sopenharmony_ci 1371bd4fe43Sopenharmony_ci* 网络段类型为SVP_NNIE_NET_TYPE_RECURRENT类型时,用户需要保证类型为SVP_BLOB_TYPE_SEQ_S32的输入输出blob中虚拟地址virt_addr_step及其指向内存大小的正确性。 1381bd4fe43Sopenharmony_ci 1391bd4fe43Sopenharmony_ci* U8图像输入只支持1通道(灰度图)和3通道(RGB图); 1401bd4fe43Sopenharmony_ci 1411bd4fe43Sopenharmony_ci* 多个Blob输入输出时,配合编译器输出的dot描述文件生成的dot图示,可以看到Blob跟层的对应关系。 1421bd4fe43Sopenharmony_ci 1431bd4fe43Sopenharmony_ciNNIE_Forward支持的多节点输入输出网络示意图如下图所示: 1441bd4fe43Sopenharmony_ci 1451bd4fe43Sopenharmony_ci 1461bd4fe43Sopenharmony_ci 1471bd4fe43Sopenharmony_ci###### HI_MPI_SVP_NNIE_UnloadModel 1481bd4fe43Sopenharmony_ci 1491bd4fe43Sopenharmony_ci【描述】 1501bd4fe43Sopenharmony_ci 1511bd4fe43Sopenharmony_ci* 卸载模型。 1521bd4fe43Sopenharmony_ci 1531bd4fe43Sopenharmony_ci【语法】 1541bd4fe43Sopenharmony_ci 1551bd4fe43Sopenharmony_ci* HI_S32 HI_MPI_SVP_NNIE_UnloadModel(SVP_NNIE_MODEL_S *pstModel); 1561bd4fe43Sopenharmony_ci 1571bd4fe43Sopenharmony_ci【参数】 1581bd4fe43Sopenharmony_ci 1591bd4fe43Sopenharmony_ci 1601bd4fe43Sopenharmony_ci 1611bd4fe43Sopenharmony_ci【返回值】 1621bd4fe43Sopenharmony_ci 1631bd4fe43Sopenharmony_ci 1641bd4fe43Sopenharmony_ci 1651bd4fe43Sopenharmony_ci【需求】 1661bd4fe43Sopenharmony_ci 1671bd4fe43Sopenharmony_ci* 头文件:hi_comm_svp.h、hi_nnie.h、mpi_nnie.h 1681bd4fe43Sopenharmony_ci 1691bd4fe43Sopenharmony_ci* 库文件:libnnie.a(PC上模拟用nniefc1.1.lib\nnieit1.1.lib) 1701bd4fe43Sopenharmony_ci 1711bd4fe43Sopenharmony_ci【注意】 1721bd4fe43Sopenharmony_ci 1731bd4fe43Sopenharmony_ci* 无。 1741bd4fe43Sopenharmony_ci 1751bd4fe43Sopenharmony_ci###### HI_MPI_SVP_NNIE_Query 1761bd4fe43Sopenharmony_ci 1771bd4fe43Sopenharmony_ci【描述】 1781bd4fe43Sopenharmony_ci 1791bd4fe43Sopenharmony_ci* 查询任务是否完成。 1801bd4fe43Sopenharmony_ci 1811bd4fe43Sopenharmony_ci【语法】 1821bd4fe43Sopenharmony_ci 1831bd4fe43Sopenharmony_ci* HI_S32 HI_MPI_SVP_NNIE_Query(SVP_NNIE_ID_E enNnieId, SVP_NNIE_HANDLE svpNnieHandle, HI_BOOL *pbFinish, HI_BOOL bBlock); 1841bd4fe43Sopenharmony_ci 1851bd4fe43Sopenharmony_ci【参数】 1861bd4fe43Sopenharmony_ci 1871bd4fe43Sopenharmony_ci 1881bd4fe43Sopenharmony_ci 1891bd4fe43Sopenharmony_ci【返回值】 1901bd4fe43Sopenharmony_ci 1911bd4fe43Sopenharmony_ci 1921bd4fe43Sopenharmony_ci 1931bd4fe43Sopenharmony_ci【需求】 1941bd4fe43Sopenharmony_ci 1951bd4fe43Sopenharmony_ci* 头文件:hi_comm_svp.h、hi_nnie.h、mpi_nnie.h 1961bd4fe43Sopenharmony_ci 1971bd4fe43Sopenharmony_ci* 库文件:libnnie.a(PC上模拟用nniefc1.1.lib\nnieit1.1.lib) 1981bd4fe43Sopenharmony_ci 1991bd4fe43Sopenharmony_ci【注意】 2001bd4fe43Sopenharmony_ci 2011bd4fe43Sopenharmony_ci* 无。 2021bd4fe43Sopenharmony_ci 2031bd4fe43Sopenharmony_ci###### HI_MPI_SVP_NNIE_AddTskBuf 2041bd4fe43Sopenharmony_ci 2051bd4fe43Sopenharmony_ci【描述】 2061bd4fe43Sopenharmony_ci 2071bd4fe43Sopenharmony_ci* 记录TskBuf地址信息。 2081bd4fe43Sopenharmony_ci 2091bd4fe43Sopenharmony_ci【语法】 2101bd4fe43Sopenharmony_ci 2111bd4fe43Sopenharmony_ci* HI_S32 HI_MPI_SVP_NNIE_AddTskBuf(const SVP_MEM_INFO_S *pstTskBuf); 2121bd4fe43Sopenharmony_ci 2131bd4fe43Sopenharmony_ci【参数】 2141bd4fe43Sopenharmony_ci 2151bd4fe43Sopenharmony_ci 2161bd4fe43Sopenharmony_ci 2171bd4fe43Sopenharmony_ci【返回值】 2181bd4fe43Sopenharmony_ci 2191bd4fe43Sopenharmony_ci 2201bd4fe43Sopenharmony_ci 2211bd4fe43Sopenharmony_ci【需求】 2221bd4fe43Sopenharmony_ci 2231bd4fe43Sopenharmony_ci* 头文件:hi_comm_svp.h、hi_nnie.h、mpi_nnie.h 2241bd4fe43Sopenharmony_ci 2251bd4fe43Sopenharmony_ci* 库文件:libnnie.a(PC上模拟用nniefc1.1.lib\nnieit1.1.lib) 2261bd4fe43Sopenharmony_ci 2271bd4fe43Sopenharmony_ci【注意】 2281bd4fe43Sopenharmony_ci 2291bd4fe43Sopenharmony_ci* 记录TskBuf地址信息,用于减少内核态内存映射次数,提升效率。 2301bd4fe43Sopenharmony_ci 2311bd4fe43Sopenharmony_ci* TskBuf地址信息的记录是通过链表进行管理,链表长度默认值为32,链表长度可通过模块参数nnie_max_tskbuf_num进行配置。 2321bd4fe43Sopenharmony_ci 2331bd4fe43Sopenharmony_ci* 若没有调用HI_MPI_SVP_NNIE_AddTskBuf预先把TskBuf地址信息记录到系统,那么之后调用Forward/ForwardWithBbox每次都会Map/Unmap操作TskBuf内核态虚拟地址,效率会比较低。 2341bd4fe43Sopenharmony_ci 2351bd4fe43Sopenharmony_ci* 必须与HI_MPI_SVP_NNIE_RemoveTskBuf成对匹配使用。 2361bd4fe43Sopenharmony_ci 2371bd4fe43Sopenharmony_ci* 建议先把Forward/ForwardWithBbox用到的TskBuf地址信息调用此接口记录到系统。当不再使用时调用HI_MPI_SVP_NNIE_RemoveTskBuf把TskBuf地址信息移除。只需要在初始化时把TskBuf地址信息记录,后续可以直接使用,直到不再使用时才移除。 2381bd4fe43Sopenharmony_ci 2391bd4fe43Sopenharmony_ci* pstTskBuf->u64VirAddr不使用,不做参数异常检查。 2401bd4fe43Sopenharmony_ci 2411bd4fe43Sopenharmony_ci* pstTskBuf->u32Size不能为0。 2421bd4fe43Sopenharmony_ci 2431bd4fe43Sopenharmony_ci* TskBuf内存由用户释放,记录的TskBuf要在移除后才能被释放。 2441bd4fe43Sopenharmony_ci 2451bd4fe43Sopenharmony_ci**HI_MPI_SVP_NNIE_RemoveTskBuf** 2461bd4fe43Sopenharmony_ci 2471bd4fe43Sopenharmony_ci【描述】 2481bd4fe43Sopenharmony_ci 2491bd4fe43Sopenharmony_ci移除TskBuf地址信息。 2501bd4fe43Sopenharmony_ci 2511bd4fe43Sopenharmony_ci【语法】 2521bd4fe43Sopenharmony_ci 2531bd4fe43Sopenharmony_ciHI_S32 HI_MPI_SVP_NNIE_RemoveTskBuf(const SVP_MEM_INFO_S *pstTskBuf); 2541bd4fe43Sopenharmony_ci 2551bd4fe43Sopenharmony_ci【参数】 2561bd4fe43Sopenharmony_ci 2571bd4fe43Sopenharmony_ci 2581bd4fe43Sopenharmony_ci 2591bd4fe43Sopenharmony_ci【返回值】 2601bd4fe43Sopenharmony_ci 2611bd4fe43Sopenharmony_ci 2621bd4fe43Sopenharmony_ci 2631bd4fe43Sopenharmony_ci【需求】 2641bd4fe43Sopenharmony_ci 2651bd4fe43Sopenharmony_ci* 头文件:hi_comm_svp.h、hi_nnie.h、mpi_nnie.h 2661bd4fe43Sopenharmony_ci 2671bd4fe43Sopenharmony_ci* 库文件:libnnie.a(PC上模拟用nniefc1.1.lib\nnieit1.1.lib) 2681bd4fe43Sopenharmony_ci 2691bd4fe43Sopenharmony_ci【注意】 2701bd4fe43Sopenharmony_ci 2711bd4fe43Sopenharmony_ci* 如果TskBuf不再使用,需要将记录的TskBuf地址信息从链表中移除。 2721bd4fe43Sopenharmony_ci 2731bd4fe43Sopenharmony_ci* 必须与HI_MPI_SVP_NNIE_AddTskBuf成对匹配使用。 2741bd4fe43Sopenharmony_ci 2751bd4fe43Sopenharmony_ci* pstTskBuf->u64VirAddr不使用,不做参数异常检查。 2761bd4fe43Sopenharmony_ci 2771bd4fe43Sopenharmony_ci* pstTskBuf->u32Size不能为0。 2781bd4fe43Sopenharmony_ci 2791bd4fe43Sopenharmony_ci* TskBuf内存由用户释放,记录的TskBuf要在移除后才能被释放。 2801bd4fe43Sopenharmony_ci 2811bd4fe43Sopenharmony_ci#### 4.2.2.3 NNIE推理逻辑图 2821bd4fe43Sopenharmony_ci 2831bd4fe43Sopenharmony_ci开发者将RuyiStudio工具量化后生成的wk模型文件通过插件进行加载,并部署到芯片端的Flash或DDR里面,通过NNIE加速器进行推理,NNIE板测推理逻辑图如下: 2841bd4fe43Sopenharmony_ci 2851bd4fe43Sopenharmony_ci 286