其他
2020年的最后一天,MindSpore发布了1.1版本,1.1中很重要的特性是构建了端边云全场景统一的基础架构:https://gitee.com/mindspore/mindspore所以本文重点是剖析全场景统一的AI框架的挑战和MindSpore的解决思路。全场景统一AI框架的挑战所谓全场景AI,是指可以将深度学习技术快速应用在云边端不同场景下的硬件设备上,包括云服务器、移动终端以及IoT设备等等,高效运行并能有效协同。对于框架而言,涉及三大挑战:快速部署、高效运行、端云协同。快速部署问题1:如何将训练好的模型快速地部署到云服务器、移动终端以及各种IoT设备上进行推理甚至增量训练?云服务器上推理通常以Service的方式进行部署,训练好的模型直接通过远程接口调用(gRPC/REST)推送到云服务器上,用户调用云推理服务接口进行推理。对于移动终端和IoT设备,由于硬件资源限制,云侧的模型和推理运行框架体积太大,无法直接部署,因此模型的压缩和运行框架的轻量化成为移动终端和IoT设备上部署的关键。面向移动终端和IoT设备轻量化的挑战,提供独立的轻量化的端侧AI框架是比较好的解决方案,同时这样的轻量化框架可能还不止一种形态,比如类似于智能手机这些富终端和类似耳环这些瘦终端面临的挑战就不一样,富终端一般存储空间还是比较充裕的,有一定的算力;瘦终端的条件则要苛刻的多,底噪要求控制在百K级别,这样你就不能放一个运行时进去,同时还要考虑给AI开发者一个通用的解决方案。问题2:有了轻量化的端侧框架以及好的模型压缩转换技术是否就可以实现快速部署的目的?其实还有问题,因为如果我们端侧的架构与云侧的架构是分离的、实现是不一致的,如模型的IR不同、算子的定义不同、推理的API接口不同,那很可能导致云侧训练的模型无法顺利的转换到端侧去执行,云侧的推理代码无法在端侧重用。一般框架的从云侧训练模型到端侧部署的流程如下:这种从云侧训练模型到端侧部署的流程方式,目前存在3个问题:第一个问题:两套模型定义很难保持一致,比如云侧和端侧的算子经常会出现一方缺失的问题,导致模型转换失败。第二个问题:云和端都需要的功能会重复开发,并可能有不一致,比如为了提升推理性能而进行的fusion优化需要端云两边都做一遍,数据处理的不一致导致精度问题等。第三个问题:云侧训练好的模型在端侧进行在线训练需要相对复杂的转换。问题3:对于分离的端云框架的不一致问题,是否可以通过如ONNX这样的标准去解决?很难,原因在于,AI产业的快速发展,新的算子类型快速涌现,标准实际上很难跟得上,所以解决的途径还是应该着落在AI框架上。高效运行全场景的高效运行,分解下来就是高效的算子、高效的运行时以及高效的模型,实现异构硬件的最大算力,提升AI算法的运行性能和能效比。算子的性能,需要从算法和底层指令优化多个层面进行优化。比如卷积,Winograd算法相比于Im2Col+GEMM,在很多经典卷积神经网络上性能就有很好的性能提升。但是,并不是所有的场景下Winograd的算法都优于Im2Col+GEMM。在下面的图中,当shape为224x224x3x64时,Winograd的性能反而有所恶化。因此,在不同条件下选择最优的算法对性能至关重要。算法层面的优化,更多的是通过减少运行时的计算次数(乘法)来提升性能,而指令层面的优化则是为了更充分的利用硬件的算力。对于CPU硬件,影响指令执行速度的关键因素包括了L1/L2缓存的命中率以及指令的流水,通用的优化方法有:选择合理数据排布,如NHWC、NC4HW4等等寄存器的合理分配,将寄存器按照用途,可以划分为feature