IPU使用参考


1. IPU


1.1. 简介

IPU(Image Processing Unit)

MI IPU模块实现了AI模型的推演功能加速。IPU的使用包括PC端IPU SDK对模型的训练、转换和仿真以及芯片端MI IPU对模型的调用、推算等。

IPU SDK的使用请参考IPU SDK目录下的文档,MI IPU相关API介绍和使用请参考MI IPU API文档。本篇主要介绍IPU在芯片端常用的调试方法以及SSTAR人脸/人形算法demo的使用。

*本文所提及Demo路径:sdk/verify/release_feature/source/dla/


1.2. MI_IPU芯片端验证模型是否正确

IPU模型在PC端仿真得到了结果,需要在芯片端验证模型的结果是否和仿真的匹配。可以通过dla_simulator来验证。

示例:

./prog_dla_dla_simulator -i ./480x800.jpeg -m ./sypfa5.480302_fixed.sim_sgsimg.img -c Unknown -f BGRA

注意:如果是ARGB格式,format要设置BGRA,SSTAR平台的ARGB存储顺序采用的方式是反向的。如果模型跟标准的classification或detection不一致,-c需要填Unknown。

运行log会打印tensor、model等信息,以及推算耗时,以评估帧率等性能。

在output目录下得到板端推算的output Tensor定点类型输出类似下图的结果,与PC端仿真的浮点类型结果做对比,来确认模型的精度是否正常。

定点类型和浮点类型对比会存在一些小误差,这属于正常现象。

nbatch模型的验证请使用dla_simulator_nbatch demo,跟dla_simulator demo的使用区别只在于多了个-n参数指定一次最大推演数。


1.3. 通过IPU Log进行性能分析

通过板端生成的IPU Log和IPU SDK带的分析工具,用户可以看倒每层性能耗时占比,从而对算法模型进行优化。

MI IPU API文档中,有关于板端IPU的一些debug命令,包括查看修改IPU clock、开启抓取IPU Log等。要生成IPU Log需要用命令先开启抓取IPU Log,之后使用IPU SDK分析工具时输入参数需要传递当前IPU clock,也可以通过命令来确认。

分析工具的使用具体阅读IPU SDK文档中用户手册7.11.IPU Log性能分析工具的讲解,这边只对板端IPU Log生成做介绍,使用dla_show_img_info.zip demo,使用举例如下:

将会在指定路径生成xxx_log_core0.bin和xxx_log_corectrl0.bin两个文件。IPU Log分析 xxx_log_corectrl0.bin是可选的,根据具体的模型来,有可能不生成,但是不影响分析。

之后将两个bin文件搭配分析工具转换成json文件再用chrome浏览器打开就可以看到各信息。


1.4. MI_IPU使用率统计

MI_IPU与CPU类似,都是执行指令运算,但与CPU不同的是,IPU没有系统给IPU做硬件上的分时复用,所以IPU运算时都是把core的算力拉到最高的。IPU只有使用率的概念,即IPU核在一段时间内工作时间占的比例。由于每一次推算之间都会存在几微秒的间隔,这主要是上层软件执行的时间,所以IPU不存在使用率100%的情况。

以下demo提供了使用率统计的功能,可以统计IPU核在一段时间内工作了多长时间,并计算出百分比。

ipu_utilization.c

编译指令:

 aarch64-linux-gnu-gcc ipu_utilization.c -o Ipu_calculate

运行:

/mnt # ./Ipu_calculate
usage: ./Ipu_calculate -t time_interval 多久统计并打印一次,单位:秒
/mnt # ./Ipu_calculate -t 1

结果举例:

因为当前芯片只有一个IPU核,所以只关注core0的数值即可。

PS:如何查看当前ipu clk: cat /proc/mi_modules/mi_ipu/debug_hal/freq


1.5. 如何拉满IPU使用率

在一些特定场景,如:测试PCB板温度、功耗等数据,要求把IPU使用率拉到最高。

在1.2.所述的dla_simulatordemo code中修改如下:

让IPU不停的做Invoke即可,再用1.3.所述的demo统计当前的使用率,可以看到已经接近100%。


1.6. 进一步了解IPU使用&模型生成

进一步了解IPU的使用,请参考IPU在线文档


2. IPU算法


算法 算法库名称 功能 详情链接
Attribute Recognition算法 libsgsalgo_attr attribute recognition算法包括:人脸属性识别、人脸表情识别、车辆属性识别 Attribute Recognition
检测算法 libsgsalgo_det 检测识别算法包括:火焰烟雾、行人、自行车、轿车 、摩托车、公交车、卡车、猫、狗、人头、人脸、包裹 检测算法
检测跟踪算法 libsgsalgo_dt 本算法库可以实现以下基础功能:人形检测、人脸检测,车辆检测,非机动车检测,宠物检测,检测目标(人、人脸、车、非机动车、宠物等)跟踪。还可以实现应用功能:区域人数统计/区域入侵(非法停车)/拌线入侵/徘徊检测/快速移动。 检测跟踪算法
人脸识别算法 libsgsalgo_fr 人脸识别主要是对人脸进行区分,判断抓拍人脸是否是白名单人员。整个算法包含人脸检测、人脸属性识别、人脸表情识别、人脸关键点、人脸过滤、人脸跟踪、人脸对齐、特征提取以及人脸比对。 其中,人脸属性可以判断人脸的眼镜、性别、口罩、胡子、年龄五个属性;人脸表情可以判断人脸7个表情,分别是正常、高兴、难过、惊讶、害怕、厌恶、生气 人脸识别算法
手势识别算法 libsgsalgo_pose 手势识别算法主要对13种手势进行识别:静态手势(10类):L、dislike、ok、fist、stop、like、yes、one、call、rock;动态手势(3类):wave_up、wave_down、grip 手势识别算法
人脸姿态识别算法 libsgsalgo_pose 人脸姿态识别算法主要对人脸部眼睛和嘴巴姿态进行识别,姿态属性有:眼睛(睁眼/闭眼)嘴巴(张嘴/闭嘴) 人脸姿态识别算法
人像分割算法 libsgsalgo_hseg 人像分割算法的功能是输出前景人像的mask,可以应用于背景模糊和背景替换 人像分割算法
人体姿态识别算法 libsgsalgo_pose 人体姿态识别算法主要对7种人体姿态进行识别:静态姿态(6类):bend、cross_arms、standing、wave1、wave2、lie_down;动态姿态(1类):walk;使用时请遵照如下所述的标准人体姿态,以保证算法的识别效果: 人体姿态识别算法
车牌识别算法 libsgsalgo_lpr 车牌识别算法(License Plate Recognize, LPR)包括以下功能:车牌检测、车牌号识别、车牌颜色识别、车牌种类识别 车牌识别算法
移动侦测跟踪算法 libsgsalgo_mdt 移动侦测跟踪算法实现对画面中的运动物体的检测和跟踪。 移动侦测跟踪算法
以文搜图算法 libsgsalgo_ret 以文搜图(Retrieval, Ret)可以实现使用文本对图像内容进行检索的功能,可以配合检测+跟踪算法实现对检测目标的属性进行搜索的能力。 以文搜图算法
KWS算法 libsgsalgo_kws 语音唤醒(Keywords Spotting, KWS)是检测语音流中是否有指定唤醒词的算法 KWS算法
SED算法 libsgsalgo_sed 声音事件检测(Sound Event Detection, SED)是检测是否有对应声音事件的算法,目前支持小孩子哭声检测、咳嗽声检测、玻璃碎声检测 声音事件检测算法