使用HiAI开发人工智能应用程序?

HiAI Foundation API是移动计算平台中的人工智能计算库,该计算库面向人工智能应用程序开发人员,让开发者便捷高效地编写在移动设备上运行的人工智能应用程序。
HiAI Foundation API将作为统一的二进制文件发布。这组API主要作用是通过HiAI异构计算平台来加速神经网络的计算,当前仅支持在Kirin SoC上运行。
使用HiAI Foundation API,开发人员可以专注于开发新颖的AI应用程序,而不用关注针对计算的性能调优。
HiAI Foundation API集成到Kirin SOC芯片上,为开发者提供基于移动设备的运行环境和调试工具,开发者可以在移动设备中运行神经网络模型,调用HiAI Foundation API进行加速计算。HiAI Foundation API无需安装,使用移动设备默认镜像即可支持相关集成、开发和验证

功能介绍

HiAI Foundation API支持基本功能:

为人工智能应用开发人员提供了两个主要功能:

技术介绍

执行介绍

  1. 下图展示将已经训练好的神经网络模型,通过编译工具生成可以在HiAI Foundation上高效执行的离线模型,并保存为二进制文件Offline Model。
    将标准的神经网络模型(Caffe等)编译转换为离线模型,编译的主要目的是对网络配置进行优化,生成优化后的目标文件,即离线模型,离线模型是序列化的存储在磁盘上,这样,神经网络前向计算时,可以直接使用优化后的目标文件进行计算,速度更快。

  1. 下图展示离线模型计算时,从文件中加载Load离线模型,将用户的输入数据(如图片)拷贝在HiAI的NPU上进行计算。计算时,每一次Inference推理只需要把用户数据从DDR到NPU导入导出一次。

您将会构建什么

HiAI API集成在使用Kirin SoC芯片的Android系统上,开发者可以在集成环境中运行神经网络模型,调用HiAI API进行加速计算。您集成DDK混合模型接口开发出一个图片分类识别应用 程序。操作流程步骤如下所示:

你的应用程序将:

您将会学到什么

这个教程专注于在集成环境中运行神经网络模型,调用HiAI API进行加速计算。不相关的概念和代码块将被忽略,并提供给您简单地复制和粘贴。

您将会需要什么

下载华为准备的HiAI DDK包。

进入华为开发者联盟页面,登录华为开发者联盟官网,帐号必须实名认证,详见注册认证

服务接入

点击"管理中心" > "自定义桌面" > "开发服务",点击HiAI卡片添加HiAI服务。

点击"DDK下载"下载DDK压缩包。

tools下载

Kirin980平台DDK配套工具:tools for_DDK_100.200.010.011.zip

Kirin970平台DDK配套工具:tools for_DDK_100.150.032.001.zip

Kirin970平台DDK配套工具:tools for_DDK_100.100.001.010.zip

HiAI DDK包结构

我们已经把这个项目需要的所有东西都放到了DDK资源包中。首先,您需要获取代码并在您喜欢的开发环境中打开它。对于这个codelab,我们建议使用Android Studio.
一个完整的HiAI DDK包含有如图的部分。

DDK资源包结构

  1. ai_ddk_mixmodel_demo:使用DDK混合模型接口集成的图片分类识别示例程序。
  2. 混合模型同步JNI接口示例程序:ai_ddk_mixmodel_demo\jni\mix_classify_jni.cpp

    混合模型异步JNI接口示例程序:ai_ddk_mixmodel_demo\jni\mix_classify_async_jni.cpp

    混合模型预处理的在线编译接口示例程序。:ai_ddk_mixmodel_demo\jni\mixbuildmodel.cpp

  3. ai_ddk_mixmodel_lib:依赖库和相关头文件。
  4. DDK混合模型接口依赖的动态库:ai_ddk_mixmodel_lib\lib64\libhiai.so

    Caffe推理适配动态库:ai_ddk_mixmodel_lib\lib64\libcaffe_adapter.so

    Caffe CPU上推理接口动态库:ai_ddk_mixmodel_lib\lib64\libcaffe.so

    Tensorflow推理适配动态库:ai_ddk_mixmodel_lib\lib64\libtensorflow_adapter.so

    Tensorflow CPU上推理接口动态库:ai_ddk_mixmodel_lib\lib64\libtensorflow_inference.so

    DDK混合模型接口头文件:ai_ddk_mixmodel_lib\include\HIAIMixModel.h

  5. Tools为Caffe和Tensorflow离线转换工具以及模型算子兼容性评估及分割工具
  6. Caffe 离线转换工具:tools\tools_caffe\caffe_offline_tools

    Tensorflow 离线转换工具:tools\tools_tensorflow\tf_offline_tools

    模型算子兼容性评估及分割工具:tools\tools_OpratorsCheck

概述

模型算子兼容性评估可通过执行算子检查工具OperatorsCheck.jar来判断模型算子是否支持在NPU上运行。如果检查通过,则可以进行模型转换;否则,工具会将模型分割成多段(算子支持的模型运行在NPU上,不支持的算子模型运行在CPU上)生成zip混合模型文件。

算子检查工具OperatorsCheck.jar可运行在Ubuntu16.04、Win10、MacOS系统上,检查界面一致。

本章以Ubuntu16.04为例说明算子评估操作的方法。

Caffe模型算子评估

Caffe模型算子检查命令:

java -jar ./OperatorsCheck.jar -t caffe -p ./*.prototxt -e ./*.caffemodel

检查成功显示如下:

Caffe模型分割

当Caffe模型部分算子不支持,可将模型分割成多段(算子支持的模型运行在NPU上,不支持的算子模型运行在CPU上)生成zip混合模型文件,命令如下:

java -jar OperatorsCheck.jar -t caffe -v v200 -s true -p xxx\xxx.prototxt -e xxx\xxx.caffemodel -in "0,1,3,1200,1200" -on "48"

其中:

  1. -t caffe:输入模型是caffe框架。
  2. -v200:按照DDK V200版本支持算子进行检查。
  3. -s true:当模型不支持算子时,将模型进行分割。
  4. -p xxx.prototxt:caffe模型文件路径。
  5. -e xxx.caffemodel:caffe权值文件路径。
  6. -in "0,1,3,1200,1200":该模型的输入层名、N、C、H、W信息。
  7. -on"48":指定检查到模型48层。

下图是cvt_net_1200模型分割命令执行过程。

概述

INT8量化是一种把fp32模型直接转化为fix8模型的操作。量化操作需要在DevEco IDE工具上执行,本章介绍在IDE中进行INT8量化的操作步骤。
INT8量化约束:

  1. 不支持输入可变shape。
  2. 不支持多输入和多输出模型的量化。
  3. 不支持输入shape中HW不一致的模型。
  4. 只支持3通道图像模型。

DevEco IDE下载地址:进入Android studio->File->Settings->Plugins, 点击"Browse repositories..."按钮,使用JetBrains仓库,在输入框里输入"DevEco IDE"可看到,点击Install下载安装即可。

Caffe模型INT8量化操作

Caffe squeezenet模型为例,IDE上参数选择后,量化操作界面效果如下:

待8bit量化的caffe模型需要选择一个网络训练参数文件Train_val.prototxt。如果该文件跟模型文件同一目录下,IDE工具会自动导入填充。

本章以Caffe Squeezenet INT8量化模型集成为例,说明APP集成操作过程。
使用场景:模型使用了NPU不支持的算子,且算子不能用支持的算子进行替换时,可用模型算子评估及分割工具,将模型进行分割生成zip文件。

编译JNI

编写JNI接口实现代码mix_classify_jni.cpp、mix_classify_async_jni.cpp、mixbuildmodel.cpp,并将这三个文件拷贝至DDK的jni目录
在jni目录下,编写Application.mk文件如下:

APP_ABI := arm64-v8a APP_STL := c++_static

将sdk中so复制到Android Studio下的/libs/arm64-v8a下:

并把分割工具生成的混合模型以及标签文件(DDK提供的Android源码目录src/main/assets下的labels_squeezenet.txt)拷贝至所创建工程的/src/main/assets下:

在demo中hiaidemo\view文件夹下的ClassifyActivity文件中指定集成的模型名称:

demoModelInfo.setOnlineModel("squeezenet_deploy_quant8.prototxt"); demoModelInfo.setOnlineModelPara("squeezenet_v1.1.caffemodel");

模型集成

混合模型集成流程包含获取模型预处理、创建模型管家、模型加载、模型计算、卸载模型、销毁模型管家。由于DDK提供了同步和异步接口,应用开发者根据需求选择使用同步或者异步接口方式。
Demo中:

  1. 同步模式下
  2. −应用层代码文件:SyncClassifyActivity.java

    −JNI层代码文件:mix_classify_jni.cpp

  3. 异步模式下
  4. −应用层代码文件:AsyncClassifyActivity.java

    −JNI层代码文件:mix_classify_async_jni.cpp

模型预处理

模型预处理主要功能如下:

  1. 获取HiAI DDK版本,判断是否支持NPU。
  2. 判断离线模型是否适合在当前HiAI版本上运行。
  3. 离线模型不兼容当前HiAI版本时,通过混合模型在线编译接口来尝试版本兼容。

创建模型管家

同步和异步模式DDK中创建模型管家函数原型:

HIAI_MixModelManager* HIAI_MixModelManager_Create(HIAI_MixModelListener* listener);

模型加载

在使用模型前,需先加载模型,DDK支持单模型和多模型加载。同时支持模型从app源码目录assets中加载和从sdcard中加载。

同步和异步模式DDK加载模型接口函数原型如下:

int HIAI_MixModel_LoadFromModelBuffers(HIAI_MixModelManager*manager, HIAI_MixModelBuffer* bufferarray[], int nbuffers);

其中:

  1. manager:模型管理引擎对象接口(同步,异步)
  2. bufferArray[]HIAI_MixModelBuffer,单模型和多模型均可。
  3. nBuffers:加载模型的个数

运行模型

异步模式下模型运行过程和同步相同,只是在调用HIAI_MixModel_RunModel接口函数时,注意传入的是异步模型管理引擎。

同步和异步模式DDK运行模型接口函数原型如下::

int HIAI_MixModel_RunModel(HIAI_MixModelManager* manager, HIAI_MixTensorBuffer* inputs[], uint32_t niput, HIAI_MixTensorBuffer* outputs[], uint32_t noutput, uint32_t timeout, const char* modelname);

其中:

  1. manager:混合模型管理引擎对象接口
  2. input[]:模型输入,支持多输入
  3. nInput:模型输入的个数
  4. output[]:模型输出,支持多输出
  5. nOutput:模型输出的个数
  6. ulTimeout:超时时间
  7. modelName:模型名称

祝贺您,您已经成功地构建了您的第一个HiAI人工智能应用程序!

您对一个训练好的模型文件进行了适应性调整,并集成到了应用程序中。您学习了HiAi Api的相关知识,并通过在集成环境中运行神经网络模型,调用了HiAI API进行加速计算

现在,您知道了将集成caffe模型到HiAI DDK的所有操作。

接下来您可以

看看这些代码片段...

参考文献

已复制代码