首页> 中国专利> 一种面向深度学习编译器的高效算子优化方法

一种面向深度学习编译器的高效算子优化方法

摘要

本发明一种面向深度学习编译器的高效算子优化方法,基于深度学习框架ONNX定义中间表示的数据结构,并对所述中间表示的数据结构进行解析,得到中间表示IR,用于表示不同的运算算子;根据中间表示IR,进行面向硬件的修改,解析出面向深度学习芯片的硬件融合结点,作为硬件融合算子;根据中间表示IR和解析出的算子,依次进行算子融合、算子调度和算子分组,得到优化后的算子,实现面向深度学习编译器的高效算子优化。通过本发明中的中间表示的定义和解析,才能将不同深度学习框架中的模型转化中相同的数据结构表示的算子,通过算子融合,算子调度和算子分组的优化方法,实现神经网络模型的算子在芯片中的高效执行。

著录项

说明书

技术领域

本发明涉及一种面向深度学习编译器的高效算子优化方法,属于人工智能应用技术领域。

背景技术

随着深度学习的兴起,卷积神经网络CNN(Convolutional Neural Network)的研究得到进一步的发展。其作为人工智能的代表性技术之一,已经广泛的应用在计算机视觉,自然语言处理和自动驾驶等多个领域,并取得了前所未有的突破和成就,展现了卷积神经网络在模式识别算法中的主导地位。

随着人工智能和物联网的兴起,面向移动终端和嵌入式设备的实际应用需求暴增。在深度学习硬件上部署各种模型的困难推动了深度学习编译器的研究和开发。深度学习编译器将不同框架描述的深度学习模型为某个硬件平台生成优化的代码,但是如何实现高效的神经网络模型的解析,并将模型能够高效的部署到相应的深度学习硬件上成为一种困难。

发明内容

本发明解决的技术问题为:克服上述现有技术的不足,提供一种面向深度学习芯片的编译器的高效算子优化方法,实现了深度学习编译器的高效算子优选。

本发明解决的技术方案为:一种面向深度学习编译器的高效算子优选方法,步骤如下:

(1)基于深度学习框架ONNX定义中间表示的数据结构,并对所述中间表示的数据结构进行解析,得到中间表示IR,用于表示不同的运算算子;

(2)根据中间表示IR,解析出面向深度学习编译器的硬件融合结点,作为硬件融合算子;硬件融合结点是根据中间表示中的Graph和Node数据结构把多个算子合成一个算子;

(3)对步骤(1)的中间表示IR和步骤(2)解析出的算子,依次进行算子融合、算子调度和算子分组,得到优化后的算子,实现面向深度学习芯片的编译器的高效算子优选。

优选的,中间表示的数据结构,具体为:Graph和Node的数据结构,其中graph的数据结构用于表示神经网络模型的计算图,用于直接解析ONNX模型的输入结点,输出结点和运算结点。所有的输入输出结点和运算结点通过定义Node数据结构来实现,这样通过Graph和Node的数据结构可以表示神经网络模型的输入输出层和卷积、池化、批处理、非线性等运算层,不同的运算层还包括硬件位宽和小数点位置信息。将深度学习框架ONNX中的ONNX模型(输入输出层和卷积、池化、批处理、非线性等运算层)、硬件位宽和小数点位置信息解析成中间表示的数据结构;ONNX模型通过ONNX模型文件表示;

ONNX模型文件需符合以下格式:硬件位宽和动态定点量化的小数点位置信息需存储在json文件中,硬件位宽为ONNX模型中的各运算层位宽,小数点位置信息是对ONNX模型动态定点量化的结果,包括每个运算层的输入输出数据和权重参数的量化位数数据。

优选的,面向深度学习编译器的硬件融合算子定义如下:

将中间表示的Graph和Node数据结构中相邻的算子融合成一个硬件算子,作为硬件融合算子,该相邻的算子中不包含任何分支结构;除Graph中第一个算子外其他包含在硬件算子里的算子都有且只有一个父结点,除最后一个算子外其他包含在硬件算子里的算子都有且只有一个子结点。

优选的,面向深度学习编译器的硬件融合算子的生成规则如下:

构成硬件融合算子有以下两种情况:一是第一个算子是ConvNode(卷积结点)、UpsampleNode(上采样结点)或者AddNode(加运算结点)这三个算子中的任意一个,此时它后面的算子必须是PoolNode(池化结点),BatchNormalizationNode(批处理结点),ReluNode(非线性结点)这三个算子中不为空子集的一种排列。二是构成它的算子是PoolNode,BatchNormalizationNode,ReluNode三个算子集合中长度至少为2的子集的一种排列。这里的PoolNode包括MaxPoolNode(最大池化结点),AveragePoolNode(平均池化结点),GlobalAveragePoolNode(全局平均池化结点)。

优选的,算子融合的实现方法如下:

使用一个有限状态机实现硬件融合算子的生成,其初始状态定义为fused1,当下一个点可以融合时跳到状态fused2,再下一个点可以融合时跳到状态fused3,再下一个点可以融合时跳到fused4。中间任意一步发现不能融合以及在fused4状态时都会跳回fused1。从其他状态跳到fused1时,生成一个硬件融合结点,作为硬件融合算子,从而实现算子融合。

优选的,算子调度的实现方法如下:

将经过算子融合的中间表示Graph和Node作为输入,输出是一个包含所有节点(包括输入节点)的列表,列表当中的先后次序代表了各个节点被执行的次序,其实现过程采用的是深度优先的拓扑排序算法。

优选的,算子分组的实现方法如下:

将经过算子调度的节点列表(包含先后次序)作为输入,算子分组的输出是一个结点组构成的列表。每个结点组由若干个CPU类型的结点或若干个NPU类型的结点构成(输入节点不会被放到节点组当中)。

结点组分2种,CPU类型和NPU类型,它们各自只包含有对应的类型的结点。对于NPU类型的结点组,其含义为能够在NPU内部连续计算的结点的序列。对于CPU类型的结点组,其含义为在CPU上连续进行计算的节点序列。

每一个结点组都是结点图当中的一段单链,标志一个结点组结束的情况如下所示:

1)当前结点的输出分叉。

2)当前结点是输出结点(没有子结点)。

3)当前结点的子结点和当前结点属于不同的类型。

4)下一结点包括进来之后,卷积运算带来特征图的行重叠大于8行。

优选的,硬件融合结点是根据中间表示中的Graph和Node数据结构把多个算子合成一个算子,降低硬件计算的计算时间,从而实现高效运行。

本发明与现有技术相比的优点在于:

(1)本发明通过设计一种面向深度学习编译器的高效算子优化方法,实现了神经网络模型在深度学习芯片上高效的执行。

(2)本发明通过对中间表示数据结构的定义和解析,实现了对深度学习框架ONNX的解析,因为基于ONNX框架的神经网络模型可以作为一种开放的神经网络交换格式,这样只需要将其他不同框架的模型转换成ONNX框架的网络模型就可以实现将多种不同的模型进行编译优化,从而部署到深度学习芯片上。同时本发明中定义的中间表示数据结构能够高效的实现面向深度学习芯片的算子融合,算子调度和算子分组;

(3)本发明中算子融合,算子调度和算子分组的优化方法能够实现在深度学习芯片上高效的执行神经网络算法的运算,降低算子的运算时间,提高算子的执行效率;

附图说明

图1为本发明的算子优化的整体方案图;

图2为本发明的硬件算子融合的有限状态机的设计图;

图3为本发明的算子分组的流程图;

具体实施方式

下面结合附图和具体实施例对本发明做进一步详细描述。

本发明实现一种面向深度学习编译器的高效算子优化方法,本方法用在深度学习编译器的设计中。面向深度学习编译器中具有面向深度学习芯片,在人工智能领域,存在着不同深度学习框架,为了使不同的深度学习框架的多种神经网络模型成功部署在深度学习芯片上为深度学习编译器的开发带来了困难。只有采用本发明的方案,才能解决深度学习编译器中的算子优化问题,通过本发明中的中间表示的定义和解析,才能将不同深度学习框架中的模型转化中相同的数据结构表示的算子,通过算子融合,算子调度和算子分组的优化方法,实现神经网络模型的算子在芯片中的高效执行。

深度学习框架ONNX,具体为一种开放的神经网络交换格式,是一个用于表示深度学习模型的标准,可使模型在不同神经网络框架之间进行转换。

深度学习芯片,具体为用于专门计算深度学习运算的专用芯片,通过设计用于计算深度学习的高效运算单元,为人工智能算法提供强大的算力,实现深度学习算法模型的高效运算。

深度学习编译器,具体为将不同深度学习框架描述的深度学习模型编译为深度学习硬件平台上的优化的代码的工具,实现深度学习模型在深度学习硬件上的高效部署。

本发明一种面向深度学习编译器的高效算子优化方法,优选方案包括如下步骤:

(1)基于深度学习框架ONNX定义中间表示的数据结构,并对所述中间表示的数据结构进行解析,得到中间表示IR,用于表示不同的算子;优选方案如下:

基于深度学习框架ONNX定义中间表示的数据结构,具体为:Graph和Node的数据结构,其中graph的数据结构用于表示神经网络模型的计算图,用于直接解析ONNX模型的输入结点,输出结点和运算结点。所有的输入输出结点和运算结点通过定义Node数据结构来实现,这样通过Graph和Node的数据结构可以表示神经网络模型的输入输出层和卷积、池化、批处理、非线性等运算层,不同的运算层还包括硬件位宽和小数点位置信息。

(2)根据中间表示IR,解析出面向深度学习芯片的硬件融合结点,作为硬件融合算子;优选方案如下:

根据中间表示IR,解析出面向深度学习芯片的硬件融合结点,具体为:将中间表示的Graph和Node数据结构中相邻的算子融合成一个硬件算子,作为硬件融合算子,该相邻的算子中不包含任何分支结构;除Graph中第一个算子外其他包含在硬件算子里的算子都有且只有一个父结点,除最后一个算子外其他包含在硬件算子里的算子都有且只有一个子结点。

解析出的面向深度学习芯片的硬件融合结点,能够实现在深度学习芯片上的一个数据通路中实现多个运算算子的计算,从而降低了神经网络推理的时间。

(3)对步骤(1)和步骤(2)解析出的算子,依次进行算子融合、算子调度和算子分组,得到优化后的算子;

对步骤(1)和步骤(2)解析出的算子,依次进行算子融合,具体为:使用一个有限状态机实现硬件融合算子生成,将所有可以生成硬件融合算子的结点依次融合为一个硬件融合结点,从而减少神经网络模型中的算子数目,这样可以降低神经网络推理的时间。

进行算子调度,优选方案具体为:采用深度优先的拓扑排序算法将经过算子融合之后的算子列表,得到一个包含所有算子的列表,其中列表当中的先后次序代表了各个节点被执行的次序。

进行算子分组,优选方案具体为:将经过算子调度的结点列表(包含先后次序),输出一个结点组构成的列表。每个结点组由若干个CPU的结点或若干个NPU的结点构成,我们要求输入节点不放到节点组当中。

得到的优化后的算子,减少神经网络模型中的算子数目,提供了算子正确的执行次序和在不同的处理器结构中执行的组别,从而解决了深度学习编译器中的算子优化问题。通过算子融合,算子调度和算子分组的优化方法,实现神经网络模型的算子在芯片中的高效执行。

本发明一种面向深度学习编译器的高效算子优化方法,优选方案步骤如下:

(1)基于深度学习框架ONNX定义中间表示的数据结构,并对所述中间表示的数据结构进行解析,得到中间表示IR,用于表示不同的运算算子;

(2)根据中间表示IR,解析出面向深度学习芯片的硬件融合结点,作为硬件融合算子;硬件融合结点是根据中间表示中的Graph和Node数据结构把多个算子合成一个算子,降低硬件计算的计算时间,从而实现高效运行。;

(3)对步骤(1)和步骤(2)解析出的算子,依次进行算子融合、算子调度和算子分组,得到优化后的算子,实现面向深度学习编译器的高效算子优选,如附图1所示。

本发明中的中间表示的数据结构,具体为:Graph和Node的数据结构,其中graph的数据结构用于表示神经网络模型的计算图,用于直接解析ONNX模型的输入结点,输出结点和运算结点。所有的输入输出结点和运算结点通过定义Node数据结构来实现,这样通过Graph和Node的数据结构可以表示神经网络模型的输入输出层和卷积、池化、批处理、非线性等运算层,不同的运算层还包括硬件位宽和小数点位置信息。

本发明中的硬件融合算子定义如下:

将中间表示的Graph和Node数据结构中相邻的算子融合成一个硬件算子,作为硬件融合算子,该相邻的算子中不包含任何分支结构;除Graph中第一个算子外其他包含在硬件算子里的算子都有且只有一个父结点,除最后一个算子外其他包含在硬件算子里的算子都有且只有一个子结点。

优选方案为:本发明中的硬件融合算子的生成规则优选如下:

构成硬件融合算子有以下两种情况:一是第一个算子是ConvNode(卷积结点)、UpsampleNode(上采样结点)或者AddNode(加运算结点)这三个算子中的任意一个,此时它后面的算子必须是PoolNode(池化结点),BatchNormalizationNode(批处理结点),ReluNode(非线性结点)这三个算子中不为空子集的一种排列。二是构成它的算子是PoolNode,BatchNormalizationNode,ReluNode三个算子集合中长度至少为2的子集的一种排列。这里的PoolNode包括MaxPoolNode(最大池化结点),AveragePoolNode(平均池化结点),GlobalAveragePoolNode(全局平均池化结点)。

优选方案为:本发明中的算子融合的实现方法优选如下:

如附图2所示,使用一个有限状态机实现硬件融合算子的生成,其初始状态定义为fused1,当下一个点可以融合时跳到状态fused2,再下一个点可以融合时跳到状态fused3,再下一个点可以融合时跳到fused4。中间任意一步发现不能融合以及在fused4状态时都会跳回fused1。从其他状态跳到fused1时,生成一个硬件融合结点,作为硬件融合算子,从而实现算子融合。

优选方案为:本发明中的算子调度的实现方法如下:

将经过算子融合的中间表示Graph和Node作为输入,输出是一个包含所有节点(包括输入节点)的列表,列表当中的先后次序代表了各个节点被执行的次序,其实现过程采用的是深度优先的拓扑排序算法。

优选方案为:本发明中的算子分组的实现方法如下:

优选方案为:如附图3所示,将经过算子调度的节点列表(包含先后次序)作为输入,算子分组的输出是一个结点组构成的列表。每个结点组由若干个CPU类型的结点或若干个NPU类型的结点构成(输入节点不会被放到节点组当中)。

优选方案为:结点组分2种,CPU类型和NPU类型,它们各自只包含有对应的类型的结点。对于NPU类型的结点组,其含义为能够在NPU内部连续计算的结点的序列。对于CPU类型的结点组,其含义为在CPU上连续进行计算的节点序列。

优选方案为:每一个结点组都是结点图当中的一段单链,标志一个结点组结束的情况如下所示:

1)当前结点的输出分叉。

2)当前结点是输出结点(没有子结点)。

3)当前结点的子结点和当前结点属于不同的类型。

4)下一结点包括进来之后,卷积运算带来特征图的行重叠大于8行。

本发明克服了现阶段卷积神经网络算法在深度学习芯片中部署过程中存在的存储和执行效率低下的困难,提供了一种面向深度学习芯片的高效编译器设计方法,提高了神经网络模型在深度学习芯片上的执行效率。

本发明的一种面向深度学习高效编译器设计方法,极大地提高了卷积神经网络模型在深度学习芯片上的高效运行的效率,为在嵌入式系统中实现卷积神经网络算法的推理过程提供了更高效的编译器优化方法。

优选方案为:图1是本发明中算子优化的整体方案图,以ONNX格式的神经网络模型与存储硬件运算层位宽和量化后的小数位置信息的json文件作为输入,经过中间表示的定义与解析,面向硬件的修改和三种算子优化方法,得到深度学习编译器中优化后的算子。

优选方案为:图2是本发明中硬件算子融合的有限状态机的设计图,通过四个状态的有限状态机详细简明的展示了本发明中的硬件融合算子的生成过程。

优选方案为:图3是本发明中算子分组的流程图,将经过算子调度的节点列表(包含先后次序)作为输入,对列表中的算子进行遍历,通过判断当前算子是否符合算子分组条件来决定是否将当前算子分配到算子组中,算子分组的判断条件见上文说明。

本发明通过设计一种面向深度学习编译器的高效算子优化方法,实现了神经网络模型在深度学习芯片上高效的执行,且本发明通过对中间表示数据结构的定义和解析,实现了对深度学习框架ONNX的解析,因为基于ONNX框架的神经网络模型可以作为一种开放的神经网络交换格式,这样只需要将其他不同框架的模型转换成ONNX框架的网络模型就可以实现将多种不同的模型进行编译优化,从而部署到深度学习芯片上。同时本发明中定义的中间表示数据结构能够高效的实现面向深度学习芯片的算子融合,算子调度和算子分组;

本发明中算子融合,算子调度和算子分组的优化方法能够实现在深度学习芯片上高效的执行神经网络算法的运算,降低算子的运算时间,提高算子的执行效率;

本发明的一种面向深度学习编译器的算子优化方法,通过了对目标检测网络YOLOv3的测试,通过本发明的算子优化方案,成功的编译出深度学习芯片所需的优化算子,能够正确快速的部署到深度学习芯片上,通过算子融合、算子调度和算子分组的方案,降低了4-10倍的算子执行时间。同时中间表示的定义和解析为多种不同的深度学习框架的模型在深度学习芯片中的部署提供了可行性。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号