摘要:近期大热的图像识别处理核赔技术,可应对剁手党们冲动购物以后汹涌而至的退货场景。那么,这背后运用的技术原理是怎样? AI计算平台又可否重构企业业务引擎呢?
随着AI技术的挖掘与应用落地,也为每年的电商大促带来了更多新鲜和惊喜。双十一、618等活动走到今天已经有十多年的时间了,从开始的价格战到现现在的全方位的购物体验的比拼,电商大促已再也不是个单纯的购物狂欢,更是对电商行业方方面面的一次全面“大阅兵”。segmentfault
电商大促其中,有关计算机视觉技术的应用也是层出不穷。基于CV进行以图搜图的“拍照购”,用户在互联网或现实中看到了感兴趣的商品,能够拍照或截图,经过拍照购在电商平台中搜索同款;电商大促节事后,随之而来的则是“退货潮”。针对这种状况,电商金融平台将引入图像识别技术处理核赔,以应对大批剁手党冲动购物以后汹涌而至的退货要求。那么,这背后应用的技术运行的原理是怎样的? AI计算平台可否知足客户的需求,重构企业业务引擎呢?api
提及AI业务,就不得不提最经典的AlexNet。AlexNet模型于2012年提出,其被认为是计算机视觉领域最有影响力的模型之一。AlexNet网络主要包含八层,前五层是卷积层,最后三层是全链接层。 配合pooling及norm运算,如下列出全部卷积层和全链接层的参数规模以及每层的浮点计算量,从图中能够看出AlexNet网络的参数规模达到了6千万量级,计算量达到720MFlops。经过在横向比较几个经典的分类网络,参数规模以及计算量都是巨大的。那么从计算量的角度来看计算中99%以上都是卷积运算,本质都是矩阵运算。网络
在如此级别的规模参数及计算量下,矩阵运算如何加速,成为了视觉计算领域亟需解决的问题。举例:一个典型的16*16的两个矩阵乘运算,在不一样硬件上是如何进行计算的?框架
在CPU中矩阵乘须要作3个for循环,每一位依次进行乘加运算,理论上须要16*16*16*2的时钟周期。函数
GPU中矩阵乘作了相关的优化,GPU是能够直接进行向量的乘加运算,那么上述运算能够拆解为16*16个乘加运算,即须要256个时钟周期。性能
昇腾处理器提供专门的矩阵乘运算单元,一个时钟周期就能够完成一次矩阵乘运算。其凭借着在AI推理上的优异性能以及超低功耗,被应用于昇腾AI计算解决方案。优化
昇腾AI计算解决方案以极致算力,端边云融合、全栈创新,开放生态的硬核实力,助力行业客户在图片分类、目标检测、人体检测、人脸识别、车辆检测等AI 视觉类计算领域取得亮眼的成绩。spa
在IAAS层,昇腾AI计算解决方案可提供昇腾Ai推理实例——包括Ai1,KAi1,及可用于Ai训练的裸机实例KAt1。Ai1正在热卖中,点击购买。操作系统
在算子层,昇腾AI计算解决方案可支持主流框架TensorFlow与Caffe的算子,以及自定义算子的能力。基于算子层还提供Matrix标准化接口,用户能够经过基于Matrix标准化接口构建昇腾业务引擎。3d
同时,用户还可使用华为昇腾Serving,对外提供RestFull API或gRPC请求,轻松解耦业务。上层再配合AI容器服务,轻松实现弹性伸缩,大大缩短业务部署周期。
用户可使用标准的Matrix接口实现业务引擎,经过SDK方式对外释放昇腾AI加速能力。
Matrix为通用业务流程执行引擎,运行于操做系统之上,业务应用之下。能够屏蔽操做系统差别,为应用提供统一的标准化接口,包括流程编排接口(支持C/C++语言、Python语言)和模型管家接口(支持C++语言)。
对于一个典型的业务流,一般包含数据读取,数据的预处理(图片的解码,前处理),模型推理,数据后处理等过程。
那么在Matrix框架中,能够把上述每一个过程抽象为一个engine,engine就是特定功能的计算引擎。若干engine构成Graph,Graph负责对engine进行管理。Matrix是一个通用的业务流程执行引擎,可以管理Graph的生成,执行以及销毁。
关于Matrix的计算流程,咱们从建立流程、执行流程、销毁流程展开来看。
建立流程,如红色箭头所示:
根据Graph配置建立Graph对象。
上传离线模型文件和配置文件到Device侧。
初始化engine,推理Engine经过离线模型管家(AIModelManager)的Init接口加载模型。
执行流程,如灰色箭头所示:
输入数据
预处理Engine调用dvpp的api接口,进行数据预处理,例如对视频/图像进行编解码、抠图、缩放。
推理Engine调用离线模型管家(AIModelManager)的Process接口进行推理计算。
推理Engine调用Matrix提供的SendData接口将推理结果返回给DestEngine。DestEngine经过回调函数将推理结果返回给APP。
销毁流程,如蓝色箭头所示:
结束程序,销毁Graph对象。
咱们能够看到,在Matrix框架中数据流的传输性能是相当重要的。
在框架中单独提供了一套内存分配和释放接口,包括HIAI_DMalloc/HIAI_DFree、 HIAI_DVPP_DMalloc/HIAI_DVPP_DFree,支持C/C++语言。
其中,
HIAI_DMalloc/HIAI_DFree接口主要用于申请内存,再配合SendData接口从Host侧搬运数据到Device侧;
HIAI_DVPP_DMalloc/HIAI_DVPP_DFree接口主要用于申请Device侧DVPP使用的内存。
经过调用HIAI_DMalloc/HIAI_DFree、 HIAI_DVPP_DMalloc/HIAI_DVPP_DFree接口申请内存,可以尽可能少拷贝,减小流程处理时间。
HIAI_Dmalloc在跨侧传输以及模型推理阶段,性能最优,主要优点体如今:
申请的内存是能够用于数据搬运对的,这样能够避免Matrix与数据传输模块间的数据拷贝。
申请的内存能够直接使能模型推理零拷贝机制,减小数据拷贝时间。
HIAI_DVPP_Dmalloc接口体如今:
申请的内存能够给DVPP使用,同时能够在DVPP使用完后透传给模型推理时使用。
若是不须要作模型推理,申请的内存中的数据能够直接回传给Host侧。
在Host-Device间数据传输状况下,用HIAI_REGISTER_SERIALIZE_FUNC对自定义数据类型进行序列化/反序列化,能够实现高性能数据传输,节省传输时间。
Matrix经过“控制信息+数据信息”的形式描述要传输的数据,控制信息指用户自定义的数据类型,数据信息指须要传输的数据内容。为保证Host和Device之间的数据传输,Matrix提供以下机制:
在传输数据前,用户可调用HIAI_REGISTER_SERIALIZE_FUNC宏注册用户自定义数据类型、用户自定义序列化函数、用户自定义反序列化函数。
用户在本端调用SendData接口发送数据后,Matrix会作以下处理,处理流程以下:
调用用户自定义的序列化函数对控制信息序列化,将序列化后的控制信息放入内存(ctrlBuf)。
经过DMA(Direct Memory Access)映射将控制信息拷贝一份存放到对端的内存中,并保持本端与对端之间控制信息的映射关系。 指向数据信息的内存(dataBuf)指针已经过SendData接口的入参传入,dataBuf是由用户调用HIAI_DMalloc/HIAI_DVPP_DMalloc接口申请的,申请该内存后系统将本端的数据信息经过DMA映射拷贝一份存放到对端的内存中,并保持本端与对端之间数据信息的映射关系。
拼装消息发送给对端,主要将ctrlBuf的地址及大小、dataBuf的地址及大小发送到对端。
对端收到消息后,Matrix会调用用户自定义的反序列化函数解析对端已获取到的控制信息和数据信息,并将解析后的数据发送给对应的接收Engine进行处理。
对端解析数据后,控制信息已使用完成,所以能够释放掉存放控制信息的内存(ctrlBuf),但因为存放控制消息的内存是在本端申请的,所以对端须要给本端发送释放ctrlBuf的消息。
本端收到消息后,释放ctrlBuf。
Engine在收到数据并完成全部处理后,即可以释放dataBuf了,但因为Matrix并不知道用户什么时候会使用完dataBuf,所以须要用户在实现反序列化函数时,dataBuf以智能指针返回并绑定析构器hiai::Graph::ReleaseDataBuffer。当智能指针结束生命周期析构时,便会自动调用析构器给本端发送释放dataBuf内存消息。
本端收到消息后,释放dataBuf。
以上,咱们详细介绍了如何使用Matrix接口构建业务引擎,同时用户还能够集成昇腾Serving对外提供标准RestFull API或者gRPC请求,提供解耦的标准推理接口能力。或者配合AI容器服务,提供弹性伸缩,易于部署的能力,模型热替换的能力。