CN118034696A - 计算图编译方法、编译装置、计算设备及存储介质 - Google Patents
计算图编译方法、编译装置、计算设备及存储介质 Download PDFInfo
- Publication number
- CN118034696A CN118034696A CN202211390372.0A CN202211390372A CN118034696A CN 118034696 A CN118034696 A CN 118034696A CN 202211390372 A CN202211390372 A CN 202211390372A CN 118034696 A CN118034696 A CN 118034696A
- Authority
- CN
- China
- Prior art keywords
- operator
- operators
- level
- computing unit
- compiling
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 74
- 238000004364 calculation method Methods 0.000 title claims abstract description 67
- 230000015654 memory Effects 0.000 claims description 65
- 239000011159 matrix material Substances 0.000 claims description 45
- 230000008569 process Effects 0.000 claims description 27
- 230000004927 fusion Effects 0.000 claims description 23
- 230000009467 reduction Effects 0.000 claims description 18
- 125000004122 cyclic group Chemical group 0.000 claims description 17
- 238000000638 solvent extraction Methods 0.000 claims description 11
- 238000004590 computer program Methods 0.000 claims description 9
- 238000013473 artificial intelligence Methods 0.000 claims description 5
- 238000000354 decomposition reaction Methods 0.000 claims description 5
- 230000006870 function Effects 0.000 description 23
- 238000012549 training Methods 0.000 description 14
- 238000013528 artificial neural network Methods 0.000 description 13
- 235000019580 granularity Nutrition 0.000 description 13
- 238000004891 communication Methods 0.000 description 11
- 238000010586 diagram Methods 0.000 description 10
- 206010047289 Ventricular extrasystoles Diseases 0.000 description 8
- 238000005129 volume perturbation calorimetry Methods 0.000 description 8
- 238000011773 genetically engineered mouse model Methods 0.000 description 5
- 238000010606 normalization Methods 0.000 description 5
- 238000012545 processing Methods 0.000 description 5
- 230000008602 contraction Effects 0.000 description 4
- 238000007500 overflow downdraw method Methods 0.000 description 4
- 238000009825 accumulation Methods 0.000 description 3
- 230000000903 blocking effect Effects 0.000 description 3
- 235000019587 texture Nutrition 0.000 description 3
- 238000012546 transfer Methods 0.000 description 3
- 230000017105 transposition Effects 0.000 description 3
- 230000001133 acceleration Effects 0.000 description 2
- 239000000654 additive Substances 0.000 description 2
- 230000000996 additive effect Effects 0.000 description 2
- 238000004422 calculation algorithm Methods 0.000 description 2
- 230000008859 change Effects 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 238000007726 management method Methods 0.000 description 2
- 238000005457 optimization Methods 0.000 description 2
- 230000002093 peripheral effect Effects 0.000 description 2
- 238000011176 pooling Methods 0.000 description 2
- 238000013519 translation Methods 0.000 description 2
- HPTJABJPZMULFH-UHFFFAOYSA-N 12-[(Cyclohexylcarbamoyl)amino]dodecanoic acid Chemical compound OC(=O)CCCCCCCCCCCNC(=O)NC1CCCCC1 HPTJABJPZMULFH-UHFFFAOYSA-N 0.000 description 1
- 241000282414 Homo sapiens Species 0.000 description 1
- 241001465754 Metazoa Species 0.000 description 1
- 238000013529 biological neural network Methods 0.000 description 1
- 210000004556 brain Anatomy 0.000 description 1
- 210000003169 central nervous system Anatomy 0.000 description 1
- 238000005094 computer simulation Methods 0.000 description 1
- 238000013527 convolutional neural network Methods 0.000 description 1
- 238000012937 correction Methods 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000000802 evaporation-induced self-assembly Methods 0.000 description 1
- 238000000605 extraction Methods 0.000 description 1
- 238000013178 mathematical model Methods 0.000 description 1
- 230000003278 mimic effect Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000001537 neural effect Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000012856 packing Methods 0.000 description 1
- 238000011946 reduction process Methods 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 239000013598 vector Substances 0.000 description 1
Landscapes
- Stored Programmes (AREA)
Abstract
本申请提供了一种计算图编译方法、编译装置、计算设备及存储介质,其中,上述方法包括:对计算图中的算子进行融合得到多个第一级子图,然后将每个第一级子图编译成多个内核,每个内核被配置为在XPU上的一个或多个计算单元上执行。如此,可以提高XPU的资源利用率以及计算图的执行效率。
Description
技术领域
本申请涉及人工智能(artificial intelligence,AI)技术领域,具体涉及一种计算图编译方法、编译装置、计算设备及存储介质。
背景技术
神经网络的计算任务(如训练和推理)可以被抽象成计算图来执行,而计算图在执行之前需要先由AI编译器将其编译成可在人工智能加速器(artificial intelligenceaccelerator,XPU)上执行的代码。
目前,计算图编译方法与计算图中算子的融合方法有关。其中,计算图中算子的融合方法主要包括两种:一种是以计算密集型算子(如卷积(convolution,CONV)算子和矩阵乘(matrix multiplication,GEMM)算子)为起点,与其后具有依赖关系的轻量级算子(如线性修正单元(rectified linear unit,ReLU)算子、偏置项增加(bias add)算子)进行融合;另一种是将具有依赖关系的访存密集型算子(如element wise算子和reduce算子、或多个element wise算子)进行融合。相应地,计算图编译方法主要包括:对于采用第一种融合方法得到的子图,AI芯片厂商一般会提供相应的算子库(即编译好的代码),因此在对它进行编译时可通过调用相应的算子库来实现;或者,也可以使用AI编译器直接对上述融合得到的子图进行编译。对于采用第二种融合方法得到的子图,可以通过用户手写代码的方式对其进行编译,例如:用户手写标准算子的算子库,由于上述融合得到的子图是由标准算子构成的,因此在对它进行编译时可通过调用相应的手写算子库来实现,又例如:用户也可直接对上述融合得到的子图进行编译;或者,也可以使用AI编译器对上述融合得到的子图进行编译。但是,上述编译方法存在以下几点问题:
①、如果使用AI芯片厂商提供的算子库,则由于算子库是已经编译好的,因此无法对其进行更改,进而无法对编译后得到的整个计算图对应的代码进行全局优化,从而影响计算图的执行效率。
②、如果使用用户手写的标准算子的算子库,则由于标准算子的粒度小,因此在编译融合得到的子图时会进行大量的调用,从而导致整体的计算开销大,影响计算图的执行效率;如果由用户直接对融合得到的子图进行编译,则不仅会给用户带来较大的工作量,而且编译得到的代码通用性低。
③、如果使用AI编译器对融合得到的子图进行编译,则在编译过程中需要根据用于运行该子图的XPU的硬件架构来搜索与之匹配的高效实现,这是一个十分耗时的过程,从而最终会影响计算图的执行效率。
因此,如何对计算图进行编译仍然是一个有待优化的问题。
发明内容
本申请提供了一种计算图编译方法、编译装置、计算设备及存储介质,能够提高计算图的编译效率以及执行效率。
第一方面,本申请实施例提供了一种计算图编译方法,该方法包括:对计算图中的算子进行融合得到多个第一级子图,然后将每个第一级子图编译成多个内核,每个内核被配置为在XPU上的一个或多个计算单元上执行。如此,可以提高XPU的资源利用率,以及计算图的执行效率。
在第一方面的一种可能实现方式中,上述将每个第一级子图编译成多个内核,包括:将每个第一级子图划分成多个第二级子图,划分得到的多个第二级子图的总性能优于目标性能,然后将每个第二级子图编译成一个内核。应理解,在实际应用中,第一级子图有多种划分方式,对于不同的划分方式所得到的多个第二级子图在编译完成后会得到不同的内核,相应地,在执行时便会体现出不同的性能。因此,为了保证第一级子图对应的多个内核具有较高的执行效率,划分得到的多个第二级子图的总性能(即对划分得到的多个第二级子图进行编译后得到的所有代码的总体性能)需要优于目标性能。
在第一方面的一种可能实现方式中,每个第一级子图包括一个或多个计算密集型算子、以及与上述一个或多个计算密集型算子具有依赖关系的一个或多个访存密集型算子。相较于现有技术中融合得到的子图,第一级子图具有更大的粒度,对大粒度的子图进行编译,有助于进行代码的全局优化,使得该代码具有更高的执行效率,而且对大粒度的子图进行计算,具有更高的计算效率。除此之外,AI模型中通常包括多个具有相同结构的网络层,这些网络层中一般包括一个或多个计算密集型算子以及一个或访存密集型算子,换言之,第一级子图能够对应于AI模型中的网络层,那么,对于AI模型中具有相同结构的网络层来说,无需对其进行重复编译,从而可以提高计算图的编译效率。
在第一方面的一种可能实现方式中,访存密集型算子包括转置算子、elementwise算子和reduce算子中的一种或多种,满足划分得到的多个第二级子图的总性能优于目标性能的划分方式包括下述一种或多种:将第一级子图中的计算密集型算子与其后连接的elementwise算子和转置算子中的至少一种算子划分为一个第二级子图;将第一级子图中的reduce算子与其后连接的elementwise算子和转置算子中的至少一种算子划分为一个第二级子图;在第一级子图中,除了与计算密集型算子连接的转置算子,与计算密集型算子后的elementwise算子连接的转置算子,与reduce算子连接的转置算子,以及与reduce算子后的elementwise算子连接的转置算子之外,将剩余的转置算子划分为一个或多个第二级子图;在第一级子图中,除了与计算密集型算子连接的elementwise算子,与计算密集型算子后的转置算子连接的elementwise算子,与reduce算子连接的elementwise算子,以及与reduce算子后的转置算子连接的elementwise算子之外,将剩余的elementwise算子划分为一个第二级子图。应理解,在实际应用中,第一级子图的划分方式有多种,而通过上述实现方式可以更快地得到满足要求(划分得到的多个第二级子图的总性能优于目标性能)的多个第二级子图,从而提高计算图的编译效率。
在第一方面的一种可能实现方式中,计算密集型算子包括卷积算子和矩阵乘算子中的一种或多个,上述方法还包括:根据下述一个或多个参数对上述编译得到的多个内核进行代码调优:计算密集型算子的输入张量的分块尺寸;第二级子图中的多个计算密集型算子的输入张量的形状是否相同;矩阵乘算子指示的矩阵乘操作的分解尺寸;reduce算子的输入张量中待规约的维度;转置算子的输入张量的分块尺寸;对element wise算子的输入张量进行循环计算时,向量化的长度、循环展开的次数以及循环合并的个数。应理解,在实际应用中,每种算子对应的代码的调优方式有多种,而通过上述实现方式减少了调优参数的选择,从而可以减少代码调优的过程,提高计算图的编译效率。
在第一方面的一种可能实现方式中,上述编译得到的多个内核包括目标内核,目标内核被配置为在XPU上的第一计算单元和第二计算单元上执行。当第一计算单元上执行的部分目标内核(称为第一代码)与第二计算单元上执行的部分目标内核(称为第二代码)之间存在依赖关系时,在第一计算单元执行部分目标内核的过程中,第二计算单元支持预取本地执行所需的数据。通过该方式可以将第一代码的执行与第二代码的执行(即数据预取)部分重叠,即在第一代码执行时,便开始准备第二代码的执行,从而可以提高第二代码的执行效率。除此之外,当第一代码和第二代码之间不存在依赖关系时,第一代码也可以在第一计算单元上执行,第二代码也可以在第二计算单元上执行,从而提高目标内核的执行效率。
在第一方面的一种可能实现方式中,当第一代码和第二代码之间存在依赖关系时,第一计算单元和第二计算单元应满足下述一个或多个条件:第一计算单元和所述第二计算单元支持访问XPU上的同一个存储空间,使得第一计算单元将执行结果存储至上述存储空间,第二计算单元从上述存储空间获取第一计算单元的执行结果;第一计算单元和第二计算单元通过XPU内部的片上网络连接,使得第一计算单元将其执行结果通过片上网络发送至第二计算单元。如此,能够减少片外访存(即通过访问XPU外的存储器来存储以及读取第一代码的执行结果)所带来的开销,从而提高第二代码的执行效率。
第二方面,本申请实施例提供了一种编译装置,该装置用于对计算图进行编译,该装置包括融合模块和编译模块。其中,融合模块用于对计算图中的算子进行融合得到多个第一级子图;编译模块用于将每个第一级子图编译成多个内核,每个内核被配置为在XPU上的一个或多个计算单元上执行。
在第二方面的一种可能实现方式中,上述编译模块用于将每个第一级子图划分成多个第二级子图,划分得到的多个第二级子图的总性能优于目标性能,以及将每个第二级子图编译成一个内核。
在第二方面的一种可能实现方式中,每个第一级子图包括一个或多个计算密集型算子、以及与上述一个或多个计算密集型算子具有依赖关系的一个或多个访存密集型算子。
在第二方面的一种可能实现方式中,访存密集型算子包括转置算子、elementwise算子和reduce算子中的一种或多种,满足划分得到的多个第二级子图的总性能优于目标性能的划分方式包括下述一种或多种:将第一级子图中的计算密集型算子与其后连接的elementwise算子和转置算子中的至少一种算子划分为一个第二级子图;将第一级子图中的reduce算子与其后连接的elementwise算子和转置算子中的至少一种算子划分为一个第二级子图;在第一级子图中,除了与计算密集型算子连接的转置算子,与计算密集型算子后的elementwise算子连接的转置算子,与reduce算子连接的转置算子,以及与reduce算子后的elementwise算子连接的转置算子之外,将剩余的转置算子划分为一个或多个第二级子图;在第一级子图中,除了与计算密集型算子连接的elementwise算子,与计算密集型算子后的转置算子连接的elementwise算子,与reduce算子连接的elementwise算子,以及与reduce算子后的转置算子连接的elementwise算子外,将剩余的elementwise算子划分为一个第二级子图。
在第二方面的一种可能实现方式中,计算密集型算子包括卷积算子和矩阵乘算子中的一种或多个,上述编译模块还用于根据下述一个或多个参数对上述编译得到的多个内核进行代码调优:计算密集型算子的输入张量的分块尺寸;第二级子图中的多个计算密集型算子的输入张量的形状是否相同;矩阵乘算子指示的矩阵乘操作的分解尺寸;reduce算子的输入张量中待规约的维度;转置算子的输入张量的分块尺寸;对element wise算子的输入张量进行循环计算时,向量化的长度、循环展开的次数以及循环合并的个数。
在第二方面的一种可能实现方式中,上述编译得到的多个内核包括目标内核,目标内核被配置为在XPU上的第一计算单元和第二计算单元上执行。当第一计算单元上执行的部分目标内核与第二计算单元上执行的部分目标内核之间存在依赖关系时,在第一计算单元执行部分目标内核的过程中,第二计算单元支持预取本地执行所需的数据。
在第二方面的一种可能实现方式中,第一计算单元和所述第二计算单元支持访问XPU上的同一个存储空间,使得第一计算单元将执行结果存储至上述存储空间,第二计算单元从上述存储空间获取第一计算单元的执行结果;或者,第一计算单元和第二计算单元通过XPU内部的片上网络连接,使得第一计算单元将其执行结果通过片上网络发送至第二计算单元。
第三方面,本申请实施例提供了一种计算设备,该计算设备包括处理器和存储器,处理器执行存储器中的计算机程序代码以实现前述第一方面及第一方面的任一种实现方式所描述部分或全部方法。
第四方面,本申请实施例提供了一种计算机可读存储介质,该计算机存储介质存储有计算机程序代码,当该计算机程序代码被计算设备执行时,该计算设备执行前述第一方面及第一方面的任一种实现方式所描述部分或全部方法。
第五方面,本申请实施例提供了一种计算机程序产品,该计算机程序产品可以是包含指令的、能够运行在计算设备上或被储存在任何可用介质中的软件或程序产品。当该计算机程序产品在至少一个计算设备上运行时,使得至少一个计算设备执行前述第一方面及第一方面的任一种实现方式所描述部分或全部方法。
附图说明
图1是本申请提供的一种编译装置的应用场景示意图;
图2是本申请提供的一种计算图编译方法的流程示意图;
图3是本申请提供的一种对第一级子图进行编译的流程示意图;
图4是本申请提供的利用编译装置实现第一级子图编译的一个具体示例的示意图;
图5是本申请提供的利用编译装置实现第一级子图编译的另一个具体示例的示意图;
图6是本申请提供的利用编译装置实现第一级子图编译的又一个具体示例的示意图;
图7是本申请提供的一种编译装置的结构示意图;
图8是本申请提供的一种计算设备的结构示意图;
图9是本申请提供的一种计算设备集群的结构示意图;
图10是本申请提供的另一种计算设备集群的结构示意图。
具体实施方式
下面结合本申请中的附图,对本申请实施例的方案进行描述。
为了使本申请实施例的方案更清晰,在具体描述本申请实施例的方案之前,首先进行相关术语的解释。
AI模型是基于AI的原理构建的数学算法的统称,也是利用AI解决特定问题的基础。AI的原理是将海量数据与超强的运算处理能力和智能算法结合起来,建立一个解决特定问题的AI模型,使该AI模型能够自动地从数据中归纳和学习潜在的模式或特征,从而实现接近人类的思考方式。
AI模型多种多样,使用较为广泛的一类AI模型是神经网络。神经网络是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型。神经网络由大量的神经元联结进行计算。一个神经网络可以包括多种不同功能的网络层,每层包括参数和计算规则。根据计算公式的不同或功能的不同,神经网络中不同的网络层有不同的名称,例如:进行卷积计算的层称为卷积层,卷积层常用于对输入信号(如图像)进行特征提取。一个神经网络也可以由多个子神经网络组合构成。不同结构的神经网络可适用于不同的场景(如分类和识别)或在用于同一场景时提供不同的效果,神经网络的结构不同具体包括以下一项或多项:神经网络中网络层的层数不同、各个网络层的顺序不同、每个网络层中的权重、参数或算子不同。
任何一个AI模型(如神经网络)在用于解决特定的技术问题之前,都需要经过训练。AI模型的训练(以下称为AI训练)是指利用指定初始模型对训练数据进行计算,根据计算的结果采用一定的方法对初始模型中的参数进行调整,使得该模型逐渐学习到一定的规律,具备特定功能的过程。经过训练后具有稳定功能的AI模型即可用于推理。AI模型的推理(以下称为AI推理)是指利用训练完成的AI模型对输入的数据进行计算,获得预测的推理结果的过程。
在AI训练和AI推理的过程中需要执行大量的计算任务,当前AI的计算任务一般会抽象成计算图(computational graph)来执行。计算图是一种通用的计算过程表示方法,直观的说,它是一个包括多个节点和至少一条有向边的有向图。其中,计算图中的节点之间通过有向边连接,节点之间的有向边用于指示节点之间的依赖关系,节点之间的依赖关系包括数据依赖关系和控制依赖关系。当一个节点的输出是另一个节点的输入时,这两个节点之间的依赖关系属于数据依赖关系;当一个节点指示另一个节点执行计算任务时,这两个节点之间的依赖关系属于控制依赖关系。
在AI领域,计算图中的节点即为AI模型中的算子,算子是AI模型中涉及到的计算函数。基于算子的计算量和访存量,AI模型中的算子(也即是计算图中的算子)包括以下两类:计算密集型算子和访存密集型算子。其中,算子的计算量是指算子执行计算操作的次数,算子的访存量是指算子读取和存储数据的个数。如果算子的计算量与访存量的比值大于或等于一个或多个数量级,则该算子是计算密集型算子;如果算子的计算量与访存量的比值小于一个数量级,则该算子是访存密集型算子。以神经网络为例,计算密集型算子包括卷积算子和矩阵乘算子,访存密集型算子包括规约(reduce)算子、转置算子和简单操作算子。其中,卷积算子用于对张量进行卷积操作;矩阵乘算子用于实现两个张量之间的相乘;reduce算子用于将张量的若干维按某种方式(如累加、累乘或求最大值)进行规约(也称为聚合),生成一个新的张量,新的张量的维度少于原始张量的维度,例如:softmax算子、池化(pooling)算子;转置算子用于对张量进行转置操作;简单操作算子用于指示实现简单且计算量较小的操作,例如:reshape算子、broadcast算子、标量常数化(scalar constant)算子和element wise算子等,reshape算子用于改变张量的形状(shape),但不会改变张量的内容,从而达到改变张量的索引方式的目的;broadcast算子用于根据张量的部分维,按照指定的形状对该张量进行扩展,例如:待扩展的张量是[2;3],指定的形状是2行3列,利用该算子可以将[2;3]扩展成[2,2,2;3,3,3];标量常数化算子用于创建标量常数(包括常数矩阵和向量,标量常数就是单个数值);element wise算子用于将张量中元素(element)进行逐个计算,也即是说,每个元素的计算是相互独立且没有数据依赖关系的,例如:bias add算子、ReLU算子、正则化算子(如批标准化(batch normalization,BachNorm)算子和层标准化(layer normalization,LayerNorm)算子)。需要说明的一点是,虽然在理论上转置算子也是对张量中的元素进行逐个计算的,属于element wise算子,但由于在编译阶段对转置算子的处理较为复杂,因此本实施例中的element wise算子不包括转置算子。
计算图在执行之前需要先由AI编译器将其编译成可在人工智能加速器(artificial intelligence accelerator,XPU)(例如:图形处理器(graphics processingunit,GPU)、张量处理器(tensor processing unit,TPU)、昇腾910等)上执行的代码。其中,对于XPU来说,对计算图进行编译得到的代码也可称为内核(kernel),内核是指可在XPU上执行的程序单元,例如:基于底层虚拟机(low level virtual machine,LLVM)架构的代码、C/C++代码、基于统一计算设备架构(computeunifieddevicearchitecture,CUDA)的代码等。
针对当前计算图的编译所存在的多种问题,本申请实施例提供了一种编译装置,该装置可实现对计算密集型算子的编译,还可将融合得到的子图(包括计算密集型算子和访存密集型算子)作为一个整体,对该子图编译得到的代码(包括计算密集型算子对应的代码和访存密集型算子对应的代码)进行全局优化,使得该子图对应的代码具有更高的执行效率。而且,上述编译装置还具有存储功能,可对融合得到的子图对应的代码进行存储,使得计算图中具有相同结构的子图无需重复编译,提供计算图的编译效率。除此之外,上述编译装置还可将编译得到的内核调度到XPU的多个计算单元上执行,不仅可以提高XPU的资源利用率,还可以提高计算图的执行效率。
上述编译装置可用于计算图的执行场景,比如说:AI训练和AI推理。下面以AI训练和AI推理为例介绍编译装置的应用场景。
由于AI训练和AI推理既可以运行在终端计算设备上,也可以运行在云服务提供商提供的数据中心中的设备上,因此在具体实现中,编译装置的部署也是相对灵活的。需要说明的是,本申请实施例涉及到的终端计算设备包括终端服务器、智能手机、笔记本电脑、平板电脑、个人台式电脑、以及智能摄像机等;数据中心包括云数据中心和边缘数据中心,云数据中心包括云服务提供商拥有的大量基础资源(包括计算资源、存储资源和网络资源),云数据中心包括的计算资源可以是大量的计算设备(如服务器),相较于云数据中心,边缘数据中心是在地理位置上距离终端计算设备较近、且拥有更少基础资源的数据中心,边缘数据中心包括边缘计算设备,例如:边缘服务器、拥有计算能力的边缘小站等。
在一种实施例中,编译装置可以部署在云数据中心,因此编译装置可以是云数据中心上的一台或多台服务器,也可以是部署在云数据中心上的服务器或虚拟机(virtualmachine,VM)上的软件装置,该软件装置可以分布式地部署在多台服务器上、或者分布式地部署在多个VM上、或者分布式地部署在服务器和VM上。如图1所示,编译装置由云服务提供商部署在云数据中心,云服务提供商将编译装置具备的功能作为一项云服务提供给租户。在使用该项云服务时,租户通过客户端网页登录到云数据中心的云管理平台,在云管理平台上选择并购买(可预充值再根据最终资源的使用情况进行结算)相应的云服务,购买成功后,租户即可通过部署在云数据中心的编译装置将指定的计算图编译成可在XPU上执行的代码。
在具体实现中,编译装置的云服务可以部署为在线编译(just intimecompilation,JIT)服务,或者离线编译(ahead of time compilation,AOT)服务。其中,在线编译服务是指在计算图的执行过程中动态地调用编译装置对计算图中的算子进行编译,即边编译计算图,边存储编译结果,以及边执行计算图。因此,在线编译服务适用于云侧业务(即在云数据中心上完成的业务)的场景,尤其是业务需求变化大的场景,例如:语言翻译场景,该场景中每次需要翻译的语句的长短可能是不一致的,那么每次翻译所需要的AI模型在结构上也会存在差异,相应地,编译装置每次需要处理的计算图也不一致,在这种情况下,就需要编译装置根据实际情况动态地对计算图进行处理。离线编译服务是指提前编译好待执行的计算图,再将编译结果部署到硬件设备中执行。应理解,由于编译计算图和执行计算图都需要占用计算资源,因此相较于在线编译服务,离线编译服务可避免计算图执行过程中由计算图编译所带来的开销,也就是说,离线编译服务适用于边缘侧业务(即在边缘数据中心上完成的业务)的场景,尤其是算力或者软件栈受限的边缘侧业务的场景。除此之外,离线编译服务也可用于云侧业务的场景,尤其是业务需求变化不大的场景,即使用到的AI模型不会频繁发生变化的场景。
进一步地,编译装置具备的功能还可以与其他功能装置具备的功能共同作为一项云服务提供给租户。比如说,由于编译装置可提高计算图的执行效率,因此编译装置可作为计算图执行设备、AI训练设备或AI推理设备的一部分。那么,云服务提供商还可以直接向租户提供计算图执行的云服务、或者AI训练(AI推理)的云服务等。在具体实现中,这种云服务在向租户提供时,可作为一项完整的云服务,也可分为两部分:基础云服务和加速计算云服务。其中,加速计算云服务由编译装置提供,租户可根据业务需求选择是否购买该服务,以AI训练的云服务为例,当租户购买加速计算云服务时,租户可通过编译装置对待训练的AI模型的计算图进行编译,从而加速对该模型的训练。
在另一种实施例中,编译装置还可以部署在边缘数据中心,或者终端计算设备。另外,当编译装置可以在逻辑上划分成具备不同功能的多个部分时,编译装置还可以分布式地部署在云数据中心、边缘数据中心以及终端计算设备中的任意两个或三个环境中,而且部署在不同环境或设备的编译装置的各个部分协同工作来实现编译装置所具备的功能。需要说明的是,本申请实施例不对编译装置的哪些部分具体部署在什么环境进行限制性的划分,实际应用格式可根据终端计算设备的计算能力,以及边缘数据中心和云数据中心的资源占有情况或具体应用需求进行适应性的部署。应理解,当编译装置部署在边缘数据中心、或者分布式地部署在包括云数据中心或边缘数据中心的环境中时,编译装置可作为一项云服务提供给租户,也可与其他功能装置具备的功能共同作为一项云服务提供给租户。
下面结合图2示出的计算图编译方法,对上述编译装置的功能进行详细地描述。
S101:编译装置获取AI模型的计算图。
在一种实施例中,编译装置提供用户界面(user interface,UI)或应用程序编程接口(application programming interface,API),用户可通过在上述UI或API上操作来将AI模型的计算图上传至编译装置。这样,编译装置便可以获取AI模型的计算图。
在另一种实施例中,由于AI模型的计算图可以是AI开发框架(如Tensorflow、Prtorch、Caffe等)通过加载AI模型而形成的,因此编译装置可以通过接收AI开发框架发送的AI模型的计算图的方式来获取该计算图。
S102:编译装置根据计算图中算子之间的依赖关系对计算图中的算子进行融合,获得一个或多个第一级子图。
其中,每个第一级子图包括一个或多个计算密集型算子,以及与上述一个或多个计算密集型算子具有依赖关系的一个或多个访存密集型算子。计算密集型算子包括下述一种或多种:卷积算子、矩阵乘算子、卷积算子的变型算子(即在卷积算子的基础上,对卷积算子进行更改后得到的算子)、以及矩阵乘算子的变型算子(即在矩阵乘算子的基础上,对矩阵乘算子进行更改后得到的算子)等,访存密集型算子包括reduce算子、转置算子、简单操作算子(如element wise算子)等。关于计算密集型算子和访存密集型算子的具体描述可参见前文中术语解释部分的相关介绍。
可选的,当第一级子图包括多个计算密集型算子时,上述多个计算密集型算子之间不存在依赖关系。
需要说明的是,上述融合得到的一个或多个第一级子图中所包含的算子可能是计算图中的所有算子,也可能是计算图中的部分算子。
S103:编译装置将每个第一级子图编译成可在XPU上执行的一个或多个内核。
其中,此处的内核即为kernel,它是指可在XPU上执行的程序单元,关于它的具体描述可参见前文中术语解释部分的相关介绍。
本申请实施例中,编译装置是以第一级子图为单位展开编译的,即对一个第一级子图编译完成后,再对另一个第一级子图进行编译,而且编译装置对每个第一级子图的编译过程都是类似的,因此下面将以一个第一级子图为例对本步骤进行说明,具体可参见图3:
S1031:编译装置判断已完成编译的第一级子图中是否存在与当前正在编译的第一级子图具有相同结构的子图。如果存在,则执行S1032;如果不存在,则执行S1033-S1038。
其中,子图的结构包括该子图中算子的类型、数量以及算子之间的连接关系,此处算子的类型是按照算子所能实现的功能进行划分的,比如说:用于交换三维张量中的第一维和第二维的转置算子与用于交换三维张量中的第一维和第三维的转置算子的类型不同,或者,用于将三维张量中的第一维以累加的方式进行规约的reduce算子与用于将三维张量中的第二维以累加的方式进行规约的reduce算子的类型不同,又或者,用于将两个张量中对应位置的元素相加的element wise算子与用于将两个张量中对应位置的元素相乘的element wise算子的类型不同。因此当两个子图具有相同结构时,说明这两个子图中所包含的算子的类型、每种类型算子的数量以及算子之间的连接关系均相同,即这两个子图是相同的。
具体地,编译装置确定一个或多个已完成编译的第一级子图的结构以及当前正在编译的第一级子图的结构,将上述一个或多个已完成编译的第一级子图的结构与当前正在编译的第一级子图的结构进行比较,从而确定是否存在与当前正在编译的第一级子图具有相同结构的子图。在一种可能的实现方式中,编译装置可以按照距离当前正在编译的第一级子图的远近顺序实现本步骤,例如:先确定与当前正在编译的第一级子图相邻的(距离最近)、已完成编译的第一级子图的结构,然后将它与当前正在编译的第一级子图的结构进行比较,如果二者相同,则确定已完成编译的第一级子图中存在与当前正在编译的第一级子图具有相同结构的子图,如果二者不同,则继续确定下一个已完成编译(距离次近)的第一级子图的结构是否与当前正在编译的第一级子图的结构相同,以此类推,直至确定已完成编译的第一级子图中存在或不存在与当前正在编译的第一级子图具有相同结构的子图。
应理解,如果当前正在编译的第一级子图是计算图中第一个被编译的第一级子图,说明不存在已完成编译的第一级子图,那么编译装置可以不执行该步骤,直接执行S1033。
S1032:编译装置获取上述已完成编译的、且与当前正在编译的第一级子图具有相同结构的第一级子图对应的内核,确定该内核即为当前正在编译的第一级子图对应的内核,以及执行S1038。
由后文的S1038可知,在每个第一级子图编译完成后,编译装置会存储编译得到的内核,因此如果当前正在编译的第一级子图与已完成编译的某个第一级子图具有相同的结构,则编译装置可以无需对当前正在编译的第一级子图进行重复编译,从而提高计算图的编译效率。
S1033:编译装置将第一级子图划分成一个或多个第二级子图。
第一级子图有多种划分方式,对于不同的划分方式所得到的一个或多个第二级子图在编译完成后会得到不同的内核,相应地,在执行时便会体现出不同的性能,比如说:一种划分方式对应的执行效率低,而另一种划分方式对应的执行效率高。因此,编译装置所选择的划分方式体现出的性能(即划分得到的一个或多个第二级子图的总性能)应优于目标性能,其中,划分方式体现出的性能是指:对基于这种方式划分得到的一个或多个第二级子图进行编译后得到的所有代码的总体性能,例如:代码量、代码的执行效率等。目标性能可以是用户设置的,也可以是编译装置根据AI模型的应用场景所设置的,比如说:相较应用于数据备份业务的AI模型来说,应用于电商交易业务的AI模型对计算效率的要求更高,因此,相较应用于数据备份业务的AI模型来说,应用于电商交易业务的AI模型所设置的目标性能中对于代码执行效率的要求更高。
可选的,编译装置可采用下述一种或多种方式划分第一级子图:
方式1、编译装置确定第一级子图的多种划分方式,然后从多种划分方式中选择优于目标性能的任一种划分方式,并基于所选择的划分方式对第一级子图进行划分。
方式2、编译装置确定第一级子图的多种划分方式,以及每种划分方式体现的性能,然后将多种划分方式体现的性能进行对比,选择最优性能对应的划分方式,并基于所选择的划分方式对第一级子图进行划分。其中,最优性能应优于目标性能。
方式3、编译装置确定第一级子图的多种划分方式,然后根据专家经验从多种划分方式中选择一种划分方式。一般地,根据专家经验选择的划分方式体现的性能是上述多种划分方式中性能较优的,因此也会优于目标性能,换言之,根据专家经验选择的划分方式对第一级子图进行划分是可行的。
示例性的,专家经验可包括下述一条或多条规则:
规则1、将第一级子图中的计算密集型算子与后连接的简单操作算子和转置算子中的至少一种算子划分为一个第二级子图。
其中,为了方便描述,本实施例提出了epilog子图和转置子图。其中,epilog子图由一个或多个简单操作算子构成,当epilog子图包括多个简单操作算子时,这些简单操作算子之间具有依赖关系。每个简单操作算子的输入张量与输出张量的形状一致,且每个简单操作算子的输出张量仅作为一个算子的输入(即epilog子图中的简单操作算子后仅连接一个算子)。转置子图包括转置算子(一般是一个转置算子),可选的,还可以包括一个或多个简单操作算子。除此之外,本实施例还提出了“→”,该符号可以理解为计算图中的有向边,用于指示算子之间的依赖关系。规则1包括下述一种或多种情况:
①、如果第一级子图包括一个或多个“计算密集型算子→epilog子图”,则将上述一个或多个“计算密集型算子→epilog子图”划分为一个第二级子图。
②、如果第一级子图包括一个或多个“计算密集型算子→转置子图”,则将上述一个或多个“计算密集型算子→转置子图”划分为一个第二级子图。
③、如果第一级子图包括一个或多个“计算密集型算子→epilog子图→转置子图”,则将上述一个或多个“计算密集型算子→epilog子图→转置子图”划分为一个第二级子图。
规则2、将第一级子图中的reduce算子与其后连接的简单操作算子和转置算子中的至少一种算子划分为一个第二级子图。
其中,为了方便描述,本实施例还提出了reduce子图。其中,reduce子图包括reduce算子(一般是一个reduce算子),可选的,还可以包括一个或多个简单操作算子。规则2包括下述一种或多种情况:
①、如果第一级子图包括一个或多个“reduce子图→epilog子图”,则将上述一个或多个“reduce子图→epilog子图”划分为一个第二级子图。
②、如果第一级子图包括一个或多个“reduce子图→转置子图”,则将上述一个或多个“reduce子图→转置子图”划分为一个第二级子图。
③、如果第一级子图包括一个或多个“reduce子图→epilog子图→转置子图”,则将上述一个或多个“reduce子图→epilog子图→转置子图”划分为一个第二级子图。
需要说明的是,由规则1和规则2可知,本实施例会将第一级子图中的计算密集型算子和reduce算子划分到不同的第二级子图中,这是因为:①、计算图的执行是在XPU上完成的,因此计算密集型算子和reduce算子的计算需要利用XPU上的存储空间(如片上缓存)来完成。在这一过程中,计算密集型算子和reduce算子会访问XPU上的存储空间,而为了提高数据访问的效率,该存储空间中的数据可以按照指定的顺序排布成便于计算密集型算子和reduce算子访问的结构,换言之,如果计算密集型算子和reduce算子所需的数据不是按照指定的顺序排布的,则该数据的排布就需要进行更改。经研究发现,如果将计算密集型算子和reduce算子划分到同一个第二级子图中,且二者所要求的数据的排布顺序不同,则在实际计算时会带来更多的开销,即将二者划分到同一个第二级子图所带来的开销大于将二者划分到不同第二级子图所带来的开销。因此,针对这两种算子,本实施例提出了规则1和规则2以将它们划分到不同的第二级子图中。
规则3、在第一级子图中,除了与计算密集型算子连接的转置算子,与计算密集型算子后的简单操作算子连接的转置算子,与reduce算子连接的转置算子,以及与reduce算子后的简单操作算子连接的转置算子之外,将剩余的转置算子划分为一个或多个第二级子图。换言之,除了上述规则1和规则2中的转置子图所包含的转置算子之外,将第一级子图中剩余的转置算子划分为一个或多个第二级子图。
可选的,如果第一级子图中剩余的转置算子有多个,则将多个转置算子中具有相同转置顺序的转置算子划分为一个第二级子图,将具有不同转置顺序的转置算子划分为不同的第二级子图。其中,转置顺序是指转置算子指示的转置操作的顺序,例如:两个转置算子都用于指示将三维张量中的第一维元素和第二维元素交换,则这两个转置算子具有相同的转置顺序;相反地,如果一个转置算子用于指示将三维张量中的第一维元素和第三维元素交换,而另一个转置算子用于指示将三维张量中的第一维元素和第二维元素交换,则这两个转置算子不具有相同的转置顺序。
规则4、在第一级子图中,除了与计算密集型算子连接的简单操作算子,与计算密集型算子后的转置算子连接的简单操作算子,与reduce算子连接的简单操作算子,以及与reduce算子后的转置算子连接的简单操作算子之外,将剩余的简单操作算子划分为一个第二级子图。换言之,除了上述epilog子图中的简单操作算子之外,将第一级子图中剩余的简单操作算子划分为一个第二级子图。
S1034:编译装置将每个第二级子图编译成可在XPU上执行的一个内核。
与第一级子图类似,对于第一级子图中的每个第二级子图,编译装置也是以第二级子图为单位展开编译的,即对一个第二级子图编译完成后,再对另一个第二级子图进行编译,而且编译装置对每个第二级子图的编译过程都是类似的,因此下面将以一个第二级子图为例(S1034-1至S1034-3)对本步骤进行说明:
S1034-1:编译装置判断已完成编译的第二级子图中是否存在与当前正在编译的第二级子图具有相同结构的子图。如果存在,则执行S1034-2;如果不存在,则执行S1034-3。
其中,已完成编译的第二级子图包括前述S1031中的已完成编译的第一级子图中的第二级子图,以及当前正在编译的第一级子图中的、已完成编译的第二级子图。应理解,本步骤的具体实现过程与上述S1031的具体实现过程类似,因此这里不再对其进行描述。
S1034-2:编译装置获取上述已完成编译的、且与当前正在编译的第二级子图具有相同结构的第二级子图对应的内核,确定该内核即为当前正在编译的第二级子图对应的内核。
由后文的S1038可知,编译装置对第一级子图编译完成后会存储编译得到的内核,而且编译得到的每个内核对应该第一级子图中的一个第二级子图,相当于编译装置中存储有多个第二级子图对应的内核,那么如果当前正在编译的第二级子图与已完成编译的某个第二级子图具有相同的结构,则编译装置可以无需对当前正在编译的第二级子图进行重复编译,从而提高计算图的编译效率。
S1034-3:编译装置确定第二级子图中各算子对应的代码模板,根据各算子对应的代码模板得到第二级子图对应的内核。
具体地,编译装置根据第二级子图中算子之间的依赖关系对第二级子图中的算子进行搜索,将搜索到的算子与代码模板进行匹配,根据匹配到的代码模板得到该算子对应的代码,从而得到第二级子图中所有算子对应的代码,之后再将第二级子图中所有算子对应的代码编排到一起,得到第二级子图对应的内核。其中,第二级子图对应的内核包括第二级子图中各算子对应的代码。
可选的,一个算子对应一个或多个代码模板,编译装置根据不同的代码模板会得到不同的代码,这些代码虽然都可以实现该算子的功能,但不同的代码之间存在差异,例如:不同的代码的执行效率可能不同,或者不同的代码的代码量可能不同。因此,在具体实现中,当一个算子对应多个代码模板时,编译装置可根据实际需求选择合适的代码模板。
示例性的,由于前文主要涉及到的算子包括计算密集型算子、转置算子、reduce算子和element wise算子,因此下面将以这几种算子为例,对代码模板进行说明:
①、计算密集型算子对应的代码模板
为了提高计算效率,计算密集型算子一般会对输入张量进行分块处理,输入张量的分块尺寸不仅会影响计算单元访存数据的效率,还会影响计算单元计算数据的效率,因此针对输入张量的不同分块尺寸可设置不同的代码模板。其中,输入张量的分块尺寸包括输入张量在不同维的分块尺寸,例如:输入张量是一个三维张量,则该张量的分块尺寸包括下述一个或多个:该张量在第一维的分块尺寸(即在第一维方向上对该张量进行分块时的分块尺寸),该张量在第二维的分块尺寸(即在第二维方向上对该张量进行分块时的分块尺寸),该张量在第三维的分块尺寸(即在第三维方向上对该张量进行分块时的分块尺寸)。
进一步地,考虑到计算密集型算子的计算是由XPU完成的,因此输入张量的分块尺寸应结合XPU中计算单元的颗粒度和存储单元的颗粒度进行设置。理由如下:以GPU为例,GPU中的计算单元包括线程(thread)、线程束(wrap)和线程块(block),其中,一个线程块包括多个线程束,一个线程束包括多个线程,也即是说,将上述计算单元按照颗粒度从小到大的顺序进行排序可得到:线程<线程束<线程块,而且计算单元的颗粒度越小,所能完成的计算量就越少。在GPU执行计算密集型算子的相关计算时,会先将计算任务下发至线程块,因此输入张量的分块尺寸需要适应于线程块所能完成的计算量,即小尺寸的输入张量(假设为第一尺寸的输入张量)可以由一个线程块完成计算;之后,再由线程块将自身需要完成的计算任务下发至线程束,由于线程束的颗粒度小于线程块,因此需要对第一尺寸的输入张量继续分块,使得更小尺寸的输入张量(假设为第二尺寸的输入张量)能够适应于线程束所能完成的计算量;接下来,再由线程束将自身需要完成的计算任务下发至线程,由于线程的颗粒度小于线程束,因此需要对第二尺寸的输入张量继续分块,使得更小尺寸的输入张量(假设为第三尺寸的输入张量)能够适应于线程所能完成的计算量。类似的,GPU中的存储单元包括寄存器(register)、本地内存(local memory)、共享内存(shared memory)、全局内存(global memory)、常量内存(constant memory)、纹理内存(texture memory),不同颗粒度的存储单元对应的分块尺寸也不同。因此,输入张量的分块尺寸包括下述一个或多个:不同颗粒度的计算单元所适应的输入张量的不同维的分块尺寸,不同颗粒度的存储单元所适应的输入张量的不同维的分块尺寸。比如说:XPU是GPU,计算密集型算子的输入张量是三维张量,那么输入张量的分块尺寸包括下述一个或多个:当计算单元是线程时,输入张量分别在第一维、第二维和第三维的分块尺寸;当计算单元是线程束时,输入张量分别在第一维、第二维和第三维的分块尺寸;当计算单元是线程块时,输入张量分别在第一维、第二维和第三维的分块尺寸;当存储单元是寄存器时,输入张量分别在第一维、第二维和第三维的分块尺寸;当存储单元是本地内存时,输入张量分别在第一维、第二维和第三维的分块尺寸;当存储单元是共享内存时,输入张量分别在第一维、第二维和第三维的分块尺寸;当存储单元是全局内存时,输入张量分别在第一维、第二维和第三维的分块尺寸;当存储单元是常量内存时,输入张量分别在第一维、第二维和第三维的分块尺寸;当存储单元是纹理内存时,输入张量分别在第一维、第二维和第三维的分块尺寸。
另外,由上述S1033-S1034可知,第二级子图中可能包括多个计算密集型算子,而且这多个计算密集型算子可以被规划到同一个内核中。在实际应用中,上述多个计算密集型算子的输入张量的形状可能相同,也可能不同,这就导致处理这两种情况的代码有所不同。因此,还可以针对多个计算密集型算子的输入张量的形状(shape)是否相同来设置不同的代码模板。
除此之外,对于计算密集型算子中的矩阵乘算子来说,在计算过程中可以将该算子指示的矩阵乘操作分解成多个小矩阵乘操作,执行每个小矩阵乘操作会得到一个值,将每个小矩阵乘操作所得到的值相加即可得到该算子的最终计算结果。其中,“将每个小矩阵乘操作所得到的值相加”这一过程可以由以下任一种方式实现:①、当多个小矩阵乘操作均执行完成后,通过内核将多个小矩阵乘操作的执行结果相加,从而得到最终计算结果;②、通过原子指令将多个小矩阵乘操作的执行结果相加,从而得到最终计算结果。不难看出,相较于方式①,方式②无需生成一个专用于将多个小矩阵乘操作的执行结果相加的内核,从而具有更小的内存开销;但方式②中使用了原子指令,因此会存在使用原子指令所带来的开销。因此,还可以针对矩阵乘算子设置两个不同的代码模板,其中,一个是根据方式①设置的,能够将矩阵乘算子指示的矩阵乘操作分解成多个小矩阵乘操作,并在这多个小矩阵乘操作执行完成后,将多个小矩阵乘操作的执行结果相加;另一个是根据方式②设置的,能够将矩阵乘算子指示的矩阵乘操作分解成多个小矩阵乘操作,并通过原子指令将这多个小矩阵乘操作的执行结果相加。
②、转置算子
由前文可知,转置算子用于将输入张量的某些维进行交换,在交换过程中,每次交换的数据量会影响最终的交换效率,而每次交换的数据与输入张量的分块尺寸有关。因此针对输入张量的不同分块尺寸可设置不同的代码模板。
进一步地,在实际应用中,转置算子所指示的转置操作可以在片上缓存中实现的(如从片上缓存读取待转置的张量,以及将转置操作的中间结果存放至片上缓存),那么,关于转置算子的输入张量的分块尺寸主要包括当XPU的存储单元是片上缓存时,输入张量分别在不同维的分块尺寸,在实际应用中,该分块尺寸还可根据片上缓存的容量、结构等进行设置。
③、reduce算子
由前文可知,reduce算子用于将张量的若干维按某种方式进行规约。为了提高规约的效率,对张量的不同维度进行规约时应采用不同的实现方式,具体地:对张量中的低维数据进行规约时,可进行线程内规约或通过线程间寄存器的数据交换实现;对张量中的高维数据进行规约时,可采用原子指令实现。其中,对于二维张量来说,张量维度的高低依次是:列>行;对于三维张量来说,张量维度的高低排序依次是:第三维>第二维>第一维;对于四维张量来说,张量维度的高低排序依次是:第四维>第三维>第二维>第一维;以此类推,对于N维张量来说,张量维度的高低排序依次是:第N维>第N-1维>…>第二维>第一维。下面以对张量[1,2;3,4]的某一维以累加的方式进行规约为例,介绍上述不同的实现方式:
情况1、对张量[1,2;3,4]中的低维数据(即行数据)以累加的方式进行规约
如果通过线程内规约的方式实现上述规约过程,则需要两个线程,即:线程1和线程2,其中,线程1用于实现张量[1,2;3,4]中的第一行数据(即1,2)的累加,线程2用于实现张量[1,2;3,4]中的第二行数据(即3,4)的累加。在具体实现中,由于第一行数据是连续存放的,因此线程1可以连续读取到第一行中的2个数据,并对这2个数据进行累加,然后写出累加结果(即3);同样的,线程2也可以连续读取到第二行中的2个数据,并对其进行累加,然后写出累加结果(即7);如此,便可以得到对张量[1,2;3,4]中的低维数据以累加的方式进行规约后的结果[3;7]。
需要说明的是,上述举例中的张量[1,2;3,4]中的低维数据的数据量较小,因此通过线程内规约的方式即可实现低维数据的规约(即对于每一行数据采用一个线程进行规约)。但在实际应用中,待规约的张量中的低维数据的数据量可能较大,在这种情况下,需要通过线程间寄存器的数据交换的方式实现规约(即对于每一行数据采用多个线程进行规约)。比如说:需要对张量[x11,x12,…,x1n;x21,x22,…,x2n]中的低维数据以累加的方式进行规约,其中,n=10000,则对于该张量中的每一行数据,可采用10个线程实现规约,每个线程用于累加一行的一部分数据(1000个数据),最后利用线程的寄存器将各个部分的累加值再次进行累加,从而得到每行的累加结果。
如果采用原子指令实现上述规约过程,则具体的实现过程与上述通过线程内规约的方式实现的过程类似,因此这里不再重复描述。但值得注意的一点是,采用原子指令对低维数据进行规约的开销要大于通过线程内规约或通过线程间寄存器的数据交换实现低维数据规约的开销,因此对张量中的低维数据进行规约时,一般会通过线程内规约的方式或通过线程间寄存器的数据交换的方式来实现。
情况2、对张量[1,2;3,4]中的高维数据(即列数据)以累加的方式进行规约
如果采用原子指令实现上述规约过程,则需要2个线程,即:线程1和线程2,此处的线程1用于实现张量[1,2;3,4]中的第一列数据(即1,3)的累加,线程2用于实现张量[1,2;3,4]中的第二列数据(即2,4)的累加。在具体实现中,由于原子指令指示的操作是一旦开始就会一直运行到结束,因此线程1在执行时不会被其他线程打断,这样即便第一列中的数据不是连续存放的,线程1也可以连续读取到第一列中的2个数据,并对这2个数据进行累加,然后写出累加结果(即4);同样的,线程2也可以连续读取到第二列中的2个数据,并对其进行累加,然后写出累加结果(即6);如此,便可以得到对张量[1,2;3,4]中的高维数据以累加的方式进行规约后的结果[4,6]。
如果通过线程内规约的方式实现上述规约过程,则也需要2个线程,即:线程1和线程2,此处的线程1也用于实现张量[1,2;3,4]中的第一列数据(即1,3)的累加,线程2也用于实现张量[1,2;3,4]中的第二列数据(即2,4)的累加。在具体实现中,由于第一列数据不是连续存放的,因此线程1无法连续读取到第一列中的2个数据,也就是说,线程1会分开读取第一列中的2个数据,之后再对这2个数据进行累加,并写出累加结果(即4)。同样的,线程2也会分开读取第二列中的2个数据,之后再对其进行累加,并写出累加结果(即6)。虽然上述方式能够得到规约结果[4,6],但在线程1读取第一列的2个数据的过程中,可能被其他线程打断,这将降低线程1规约第一列数据的效率,同样的,在线程2读取第二列的2个数据的过程中,也可能被其他线程打断,从而降低线程2规约第二列数据的效率。
需要说明的是,上述举例中的张量[1,2;3,4]中的高维数据的数据量较小,因此通过线程内规约的方式即可实现高维数据的规约(此处是对于每一列数据采用一个线程进行规约)。但在实际应用中,待规约的张量中的高维数据的数据量可能较大,在这种情况下,需要通过线程间寄存器的数据交换的方式实现规约(此处是对于每一列数据采用多个线程进行规约)。
还需要说明的是,相较于通过线程内规约或通过线程间寄存器的数据交换的方式,采用原子指令可以实现数据的连续访存,具有更高的规约效率,因此对于张量中的高维数据而言,更适合采用原子指令实现规约。
基于上述理由,本申请实施例针对reduce算子设置三种代码模板,分别是:能够实现线程内规约的代码模板;能够通过线程间寄存器的数据交换实现规约的代码模板;能够采用原子指令实现规约的代码模板。
④、element wise算子
由前文可知,element wise算子用于对张量中的元素进行逐个计算,而且每个元素的计算也是相互独立的,因此element wise算子对应的代码模板可设置为能够实现可并行执行的循环代码,如此,可以提高该算子的执行效率。
S1035:编译装置获得第一级子图对应的内核。其中,第一级子图对应的内核包括第一级子图中所有第二级子图对应的内核。
S1036:编译装置判断第一级子图对应的内核的性能是否优于目标性能。如果第一级子图对应的内核的性能未优于目标性能,则执行S1037;如果第一级子图对应的内核的性能优于目标性能,则执行S1038。
S1037:编译装置对第一级子图对应的内核进行代码调优,之后再对调优后得到的第一级子图对应的内核执行S1036。
由于第一级子图对应的内核由一个或多个第二级子图对应的内核构成,而第二级子图对应的内核由该子图中的算子对应的代码构成,因此编译装置可以通过对算子对应的代码进行调优,从而达到对第一级子图对应的内核进行调优的目的。
根据上述S1034-3可知,计算密集型算子的输入张量的分块尺寸、第二级子图中包含的多个计算密集型算子的输入张量的形状是否相同、矩阵乘算子指示的矩阵乘操作的分解尺寸、reduce算子的输入张量中待规约的维度、转置算子的输入张量的分块尺寸、以及对element wise算子的输入张量进行循环计算时,向量化(即将连续的若干数据打包到一起进行计算)的长度、循环展开的次数以及循环合并的个数均会影响对应算子的执行效率,从而影响第一级子图的性能,因此,本申请实施例提出:编译装置可根据下述一个或多个参数对第一级子图对应的内核进行代码调优:计算密集型算子的输入张量的分块尺寸;多个计算密集型算子的输入张量的形状是否相同;矩阵乘算子指示的矩阵乘操作的分解尺寸;reduce算子的输入张量中待规约的维度;转置算子的输入张量的分块尺寸;对elementwise算子的输入张量进行循环计算时,向量化的长度、循环展开的次数以及循环合并的个数。
S1038:编译装置存储第一级子图对应的内核。
应理解,AI模型由多个网络层构成,这些网络层中有部分网络层的结构是重复的,以卷积神经网络为例,卷积神经网络一般包括多个卷积层和多个全连接层,卷积层可能由卷积算子、ReLU算子等构成,全连接层可能由矩阵乘算子、bias add算子、softmax算子等构成,多个卷积层中可能存在具有相同结构的卷积层,同样的,多个全连接层中也可能存在具有相同结构的全连接层。也就是说,AI模型的计算图中存在多个具有相同结构的第一级子图和第二级子图,那么,通过本步骤可以使得编译装置无需对具有相同结构的第一级子图和第二级子图进行重复编译,提供计算图的编译效率。
通过执行上述S1031-1038,编译装置可完成对第一级子图的编译,编译得到的内核即可调度到XPU上执行。针对编译装置如何将第一级子图对应的内核调度到XPU上执行,具体可参见下述S104-S106:
S104:编译装置给第一级子图对应的每个内核配置XPU上的一个或多个计算单元。
在一种实施例中,第一级子图对应的内核包括目标内核,目标内核包括第一代码和第二代码,下面以目标内核为例,通过情况1和情况2对本步骤进行说明:
情况1、在第一代码和第二代码之间存在依赖关系的情况下,由于存在依赖关系的代码在计算时是分先后顺序的,即第一代码执行完成后才能开始执行第二代码,因此如果第一代码和第二代码之间存在依赖关系,则编译装置可以给目标内核配置XPU上的第一计算单元和第二计算单元,其中,第一计算单元用于执行第一代码,第二计算单元用于执行第二代码。
可选的,在第一计算单元执行第一代码的过程中,第二计算单元可以预取本地执行(即在第二计算单元上执行第二代码)所需的数据(如网络参数)。这样,可以将后执行的第二代码的访存过程与先执行的第一代码的计算过程重叠,从而提高后执行的第二代码的执行效率。
进一步地,第一计算单元和第二计算单元满足下述一个或多个条件:第一计算单元和第二计算单元支持访存XPU上的同一个存储空间;第一计算单元和第二计算单元通过XPU内部的片上网络连接。应理解,当第一计算单元和第二计算单元支持访存XPU上的同一个存储空间时,第一计算单元可以将第一代码的执行结果存储至该存储空间,使得第二计算单元可以直接从该存储空间中获取第一代码的执行结果。当第一计算单元和第二计算单元通过XPU内部的片上网络连接时,第一计算单元可以将第一代码的执行结果通过上述片上网络发送至第二计算单元。上述两种方式均能减少片外访存(即通过访问XPU外的存储器来存储以及读取第一代码的执行结果)所带来的开销,从而提高第二代码的执行效率。
情况2、在第一代码和第二代码之间不存在依赖关系的情况下,由于不具有依赖关系的代码的计算过程和访存过程都是相当独立的,因此如果第一代码和第二代码之间不存在依赖关系,则编译装置可以给目标内核配置XPU上的第一计算单元和第二计算单元,其中,第一计算单元用于执行第一代码,第二计算单元用于执行第二代码。
可选的,第一计算单元和第二计算单元可以并发地执行第一代码和第二代码,从而提高目标内核的执行效率。
需要说明的是,根据前文可推断出:目标内核对应一个第二级子图,该第二级子图中可能包括计算密集型算子、epilog子图、转置子图以及reduce子图中的一种或多种,通过上述配置方式,编译装置可以根据计算量将计算密集型算子、epilog子图、转置子图以及reduce子图调度到多个计算单元上执行,例如:将计算密集型算子调度到一个计算单元上执行,将转置子图调度到另一个计算单元上执行。
应理解,上述两种配置方式虽然可提高目标内核的执行效率,但也会占用更多的资源,因此在实际应用中,编译装置还应结合XPU中资源的使用情况进行合理的配置。另外,还需考虑XPU的硬件架构,比如说:当XPU支持高效地数据搬运时,通过XPU上的存储空间(如共享缓存)或片上网络传输第一代码的执行结果的速度才能较快,也就是说,给第一代码和第二代码配置不同的计算单元是可以提高目标内核的执行效率的一种配置方式。
S105:编译装置存储第一级子图对应的每个内核的配置结果。
S106:编译装置根据第一级子图对应的每个内核的配置结果,将第一级子图对应的各个内核调度到XPU上相应的计算单元上执行。
以目标内核为例,由于编译装置给目标内核配置了第一计算单元和第二计算单元,因此编译装置会根据该配置结果,将目标内核调度到第一计算单元和第二计算单元上执行,也就是说,将第一代码调度到第一计算单元上执行,将第二代码调度到第二计算单元上执行。应理解,通过上述S104-S106可以推断出,编译装置还可以将第一代码中调度多个第一计算单元上执行,将第二代码调度到多个第二计算单元上执行,如此,可以占用XPU上更多的计算单元来执行目标内核,从而提高目标内核的执行效率,以及XPU的资源利用率。
下面通过几个具体示例,进一步描述上述计算图编译方法。
示例1、如图4所示,第一级子图包括2个卷积算子(即CONV1和CONV2)、2个ReLU算子(即ReLU1和ReLU2)和1个转置算子(即transpose1),其中,这些算子之间的连接关系是:CONV1→ReLU1→transpose1,CONV2→ReLU2,CONV1与CONV2之间不存在依赖关系。利用上述编译装置对第一级计算图进行编译的过程包括:首先,编译装置执行划分第一级子图的操作,此处仅得到一个第二级子图(即为第一级子图);之后,编译装置对该第二级子图进行编译得到一个内核,该内核即为第一级子图对应的内核,该内核包括两部分代码:一部分用于实现CONV1→ReLU1→transpose1的计算,另一部分用于实现CONV2→ReLU2的计算;接下来,编译装置给上述编译得到的内核配置XPU上的两个计算单元(即计算单元1和计算单元2),以将CONV1→ReLU1→transpose1的计算调度到计算单元1上执行,将CONV2→ReLU2的计算调度到计算单元2上执行。
示例2、如图5所示,第一级子图包括矩阵乘算子(即GEMM)、bias add算子、softmax算子,其中,这3个算子的连接关系是:GEMM→bias add算子→softmax算子。利用上述编译装置对第一级计算图进行编译的过程包括:首先,编译装置将第一级子图划分为两个第二级子图,其中,一个第二级子图包括GEMM和bias add算子,另一个第二级子图包括softmax算子;之后,编译装置对这两个第二级子图进行编译,得到内核1和内核2,第一级子图对应的内核包括内核1和内核2。接下来,编译装置给内核1配置XPU上的一个计算单元(即计算单元1),给内核2配置XPU上的一个计算单元(即计算单元2),以将GEMM→bias add算子的计算调度到计算单元1上执行,将softmax算子的计算调度到计算单元2上执行。
示例3、如图6所示,第一级子图包括矩阵乘算子(即GEMM)、bias add算子、3个转置算子(即transpose1、transpose2和transpose3)、softmax算子、element wise算子(如损失函数),其中,这6个算子的连接关系是:GEMM→bias add算子→transpose1→softmax算子→transpose2→element wise算子→transpose3。利用上述编译装置对第一级子图进行编译的过程包括:首先,编译装置将第一级子图划分为三个第二级子图,其中,一个第二级子图包括GEMM、bias add算子和transpose1,一个第二级子图包括softmax算子、transpose2和element wise算子,一个第二级子图包括transpose3;之后,编译装置对这三个第二级子图进行编译,得到内核1、内核2和内核3,第一级子图对应的内核包括内核1、内核2和内核3。接下来,编译装置给内核1配置XPU上的两个计算单元(即计算单元1和计算单元2),其中,计算单元1和计算单元2通过XPU内部的片上网络连接,或者计算单元1和计算单元2支持访存XPU上的同一块共享缓存,在计算单元1执行GEMM→bias add算子的计算时,计算单元2支持提前从XPU的存储器上读取执行transpose1的相关计算所需的数据,在计算单元1完成GEMM→bias add算子的计算后,计算单元1可以将GEMM→bias add算子的计算结果通过片上网络发送给计算单元2,或者存储至共享缓存使得计算单元2可以直接从共享缓存中读取GEMM→bias add算子的计算结果,以用于执行transpose1的计算;除此之外,编译装置还给内核2配置XPU上的一个计算单元(即计算单元3),给内核3配置XPU上的一个计算单元(即计算单元4),以将GEMM→bias add算子的计算调度到计算单元1上执行,将transpose1的计算调度到计算单元2上执行,将softmax算子→transpose2→element wise算子的计算调度到计算单元3上执行,将transpose4的计算调度到计算单元4上执行。
前文详细描述了编译装置的功能,下面结合图7-图10,从编译装置的结构以及部署有该编译装置的硬件设备的结构方面对其展开详细地描述。
图7示例性地展示了编译装置的结构示意图。如图7所示,编译装置100包括融合模块110和编译模块120,可选的,该装置还包括获取模块130、存储模块140和调度模块150中的一个或多个。其中,上述几个模块之间协同工作以实现上述方法实施例中编译装置所执行的步骤。具体地,融合模块110用于执行上述S102;编译模块120用于执行上述S103中的S1031-S1037;获取模块130用于执行上述S101;存储模块140用于执行上述S103中的S1038,以及上述S105;调度模块150用于执行上述S104和S106。
本申请实施例中,融合模块110、编译模块120、获取模块130、存储模块140以及调度模块150均可以通过软件实现,或者可以通过硬件实现。示例性的,接下来以编译模块120为例,介绍编译模块120的实现方式。类似的,融合模块110、获取模块130、存储模块140以及调度模块150的实现方式可以参考编译模块120的实现方式。
作为软件功能单元的一种举例,编译模块120可以包括运行在计算实例上的代码。其中,计算实例可以包括物理主机(计算设备)、虚拟机、容器中的至少一种。进一步地,上述计算实例可以是一台或者多台。例如,编译模块120可以包括运行在多个主机/虚拟机/容器上的代码。需要说明的是,用于运行该代码的多个主机/虚拟机/容器可以分布在相同的区域(region)中,也可以分布在不同的region中。进一步地,用于运行该代码的多个主机/虚拟机/容器可以分布在相同的可用区(availability zone,AZ)中,也可以分布在不同的AZ中,每个AZ包括一个数据中心或多个地理位置相近的数据中心。其中,通常一个region可以包括多个AZ。
同样,用于运行该代码的多个主机/虚拟机/容器可以分布在同一个虚拟私有云(virtual private cloud,VPC)中,也可以分布在多个VPC中。其中,通常一个VPC设置在一个region内,同一region内两个VPC之间,以及不同region的VPC之间跨区通信需在每个VPC内设置通信网关,经通信网关实现VPC之间的互连。
作为硬件功能单元的一种举例,编译模块120可以包括至少一个计算设备,如服务器等。或者,编译模块120也可以是利用专用集成电路(application-specific integratedcircuit,ASIC)实现、或可编程逻辑器件(programmable logic device,PLD)实现的设备等。其中,上述PLD可以是复杂程序逻辑器件(complex programmable logical device,CPLD)、现场可编程门阵列(field-programmable gate array,FPGA)、通用阵列逻辑(generic array logic,GAL)或其任意组合实现。
编译模块120包括的多个计算设备可以分布在相同的region中,也可以分布在不同的region中。编译模块120包括的多个计算设备可以分布在相同的AZ中,也可以分布在不同的AZ中。同样,编译模块120包括的多个计算设备可以分布在同一个VPC中,也可以分布在多个VPC中。其中,所述多个计算设备可以是服务器、ASIC、PLD、CPLD、FPGA和GAL等计算设备的任意组合。
需要说明的是,在其他实施例中,融合模块110可以用于执行上述S101-S106中的任意步骤;编译模块120可以用于执行上述S101-S106中的任意步骤;获取模块130可以用于执行上述S101-S106中的任意步骤;存储模块140可以用于执行上述S101-S106中的任意步骤;调度模块150可以用于执行上述S101-S106中的任意步骤。融合模块110、编译模块120、获取模块130、存储模块140以及调度模块150负责实现的步骤可根据需要进行指定,通过融合模块110、编译模块120、获取模块130、存储模块140以及调度模块150分别实现上述计算图编译方法中不同的步骤来实现编译装置100的全部功能。
本申请实施例还提供一种计算设备。如图8所示,计算设备200包括总线210、处理器220、存储器230以及通信接口240。处理器220、存储器230和通信接口240之间通过总线210通信。计算设备200可以是服务器或终端设备。应理解,本申请实施例不限定计算设备200中的处理器、存储器的个数。
总线210可以是外设部件互连标准(peripheral component interconnect,PCI)总线或扩展工业标准结构(extended industry standard architecture,EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图8中仅用一条线表示,但并不表示仅有一根总线或一种类型的总线。总线210可包括在计算设备200各个部件(例如:存储器230、处理器220、通信接口240)之间传送信息的通路。
处理器220可以包括CPU、GPU、TPU、微处理器(micro processor,MP)或者数字信号处理器(digital signal processor,DSP)等处理器中的任意一种或多种。
存储器230可以包括易失性存储器(volatile memory),例如随机存取存储器(random access memory,RAM)。存储器230还可以包括非易失性存储器(non-volatilememory),例如只读存储器(read-only memory,ROM),快闪存储器,机械硬盘(hard diskdrive,HDD)或固态硬盘(solid state drive,SSD)。
存储器230中存储有可执行的程序代码,处理器220执行该可执行的程序代码以分别实现前述融合模块110、编译模块120、获取模块130、存储模块140以及调度模块150的功能,从而实现前文所描述的计算图编译方法。也即,存储器230上存有用于执行前文所描述的计算图编译方法的指令。
通信接口240使用例如但不限于网络接口卡、收发器一类的收发模块,来实现计算设备200与其他设备或通信网络之间的通信,例如:计算设备200通过通信接口240向XPU发送已编译完成的内核,使得XPU能够执行计算图,或者通过通信接口240获取待编译的计算图。
本申请实施例还提供了一种计算设备集群。该计算设备集群包括一个或多个计算设备。该计算设备可以是服务器,例如是中心服务器、边缘服务器,或者是本地数据中心中的本地服务器。在一些实施例中,计算设备也可以是台式机、笔记本电脑或者智能手机等终端设备。
如图9所示,所述计算设备集群包括一个或多个计算设备200。计算设备集群中的一个或多个计算设备200中的存储器230中可以存有相同的用于执行上述计算图编译方法的指令。或者,该计算设备集群中的一个或多个计算设备200的存储器230中也可以分别存有用于执行上述计算图编译方法的部分指令。换言之,一个或多个计算设备200的组合可以共同执行用于执行上述计算图编译方法的指令。
需要说明的是,上述计算设备集群中的不同的计算设备200中的存储器230可以存储不同的指令,分别用于执行编译装置100的部分功能。也即,不同的计算设备200中的存储器230存储的指令可以实现前述融合模块110、编译模块120、获取模块130、存储模块140以及调度模块150中的一个或多个模块的功能。
在一些实施例中,计算设备集群中的一个或多个计算设备可以通过网络连接。其中,所述网络可以是广域网或局域网等等。图10示出了一种可能的实现方式,如图10所示,两个计算设备200(即图10中的计算设备200A和计算设备200B)之间通过网络进行连接,具体可通过设备中的通信接口与所述网络进行连接。在一种可能的实现方式中,计算设备200A中的存储器230中存有执行融合模块110和获取模块130的功能的指令。同时,计算设备200B中的存储器230中存有执行编译模块120、存储模块140和调度模块150的功能的指令。应理解,图10示出的计算设备集群之间的连接方式是考虑到上述计算图编译方法中关于计算图中算子融合的步骤(即上述S102)和对融合得到的第一级子图进行编译的步骤(即S103)都需要进行大量的计算,而且,对计算图中的算子融合前需要先获取计算图(即S101),对第一级子图编译完成后需要存储编译得到的内核,以及给编译得到的内核配置计算单元和调度到XPU上执行,因此可以将融合模块110和获取模块130交由计算设备200A执行,将编译模块120、存储模块140和调度模块150交由计算设备200B执行。
应理解,图10中示出的计算设备200A的功能也可以由多个计算设备200完成。同样,计算设备200B的功能也可以由多个计算设备200完成。
本申请实施例还提供了一种包含指令的计算机程序产品。该计算机程序产品可以是包含指令的、能够运行在计算设备上或被储存在任何可用介质中的软件或程序产品。当该计算机程序产品在至少一个计算设备上运行时,使得至少一个计算设备执行前文所描述的计算图编译方法。
本申请实施例还提供了一种计算机可读存储介质。该计算机可读存储介质可以是计算设备能够存储的任何可用介质或者是包含一个或多个可用介质的数据中心等数据存储设备,其中,可用介质可以是磁性介质(如软盘、硬盘、磁带)、光介质(如DVD)、或者半导体介质(如SSD)等。该计算机可读存储介质包括指令,其中,指令指示计算设备执行前文所描述的计算图编译方法,或指示计算设备执行前文所描述的计算图编译方法。
最后应说明的是:以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的保护范围。
Claims (16)
1.一种计算图编译方法,其特征在于,包括:
对所述计算图中的算子进行融合得到多个第一级子图;
将每个第一级子图编译成多个内核,每个内核被配置为在人工智能加速器XPU上的一个或多个计算单元上执行。
2.根据权利要求1所述的方法,其特征在于,所述将每个第一级子图编译成多个内核,包括:
将所述每个第一级子图划分成多个第二级子图,划分得到的所述多个第二级子图的总性能优于目标性能;
将每个第二级子图编译成一个内核。
3.根据权利要求1或2所述的方法,其特征在于,所述每个第一级子图包括一个或多个计算密集型算子、以及与所述一个或多个计算密集型算子具有依赖关系的一个或多个访存密集型算子。
4.根据权利要求3所述的方法,其特征在于,所述访存密集型算子包括转置算子、element wise算子和reduce算子中的一种或多种,满足所述划分得到的所述多个第二级子图的总性能优于目标性能的划分方式包括下述一种或多种:
将所述第一级子图中的计算密集型算子与其后连接的elementwise算子和转置算子中的至少一种算子划分为一个所述第二级子图;
将所述第一级子图中的reduce算子与其后连接的elementwise算子和转置算子中的至少一种算子划分为一个所述第二级子图;
在所述第一级子图中,除了与计算密集型算子连接的转置算子,与计算密集型算子后的elementwise算子连接的转置算子,与reduce算子连接的转置算子,以及与reduce算子后的elementwise算子连接的转置算子之外,将剩余的转置算子划分为一个或多个所述第二级子图;
在所述第一级子图中,除了与计算密集型算子连接的elementwise算子,与计算密集型算子后的转置算子连接的elementwise算子,与reduce算子连接的elementwise算子,以及与reduce算子后的转置算子连接的elementwise算子之外,将剩余的elementwise算子划分为一个所述第二级子图。
5.根据权利要求4所述的方法,其特征在于,所述计算密集型算子包括卷积算子和矩阵乘算子中的一种或多个,所述方法还包括:
根据下述一个或多个参数对编译得到的所述多个内核进行代码调优:所述计算密集型算子的输入张量的分块尺寸;所述第二级子图中的多个所述计算密集型算子的输入张量的形状是否相同;所述矩阵乘算子指示的矩阵乘操作的分解尺寸;所述reduce算子的输入张量中待规约的维度;所述转置算子的输入张量的分块尺寸;对所述element wise算子的输入张量进行循环计算时,向量化的长度、循环展开的次数以及循环合并的个数。
6.根据权利要求1-5任一项所述的方法,其特征在于,编译得到的所述多个内核包括目标内核,所述目标内核被配置为在所述XPU上的第一计算单元和第二计算单元上执行;
当所述第一计算单元上执行的部分所述目标内核与所述第二计算单元上执行的部分所述目标内核之间存在依赖关系时,在所述第一计算单元执行部分所述目标内核的过程中,第二计算单元支持预取本地执行所需的数据。
7.根据权利要求6所述的方法,其特征在于,所述第一计算单元和所述第二计算单元支持访问所述XPU上的同一个存储空间,使得所述第一计算单元将执行结果存储至所述存储空间,所述第二计算单元从所述存储空间获取所述执行结果;或者,所述第一计算单元和所述第二计算单元通过所述XPU内部的片上网络连接,使得所述第一计算单元将所述执行结果通过所述片上网络发送至所述第二计算单元。
8.一种编译装置,其特征在于,用于对计算图进行编译,所述装置包括:
融合模块,对所述计算图中的算子进行融合得到多个第一级子图;
编译模块,用于将每个第一级子图编译成多个内核,每个内核被配置为在人工智能加速器XPU上的一个或多个计算单元上执行。
9.根据权利要求8所述的装置,其特征在于,
所述编译模块,用于将所述每个第一级子图划分成多个第二级子图,划分得到的所述多个第二级子图的总性能优于目标性能,以及将每个第二级子图编译成一个内核。
10.根据权利要求8或9所述的装置,其特征在于,所述每个第一级子图包括一个或多个计算密集型算子、以及与所述一个或多个计算密集型算子具有依赖关系的一个或多个访存密集型算子。
11.根据权利要求10所述的装置,其特征在于,所述访存密集型算子包括转置算子、element wise算子和reduce算子中的一种或多种,满足所述划分得到的所述多个第二级子图的总性能优于目标性能的划分方式包括下述一种或多种:
将所述第一级子图中的计算密集型算子与其后连接的elementwise算子和转置算子中的至少一种算子划分为一个所述第二级子图;
将所述第一级子图中的reduce算子与其后连接的elementwise算子和转置算子中的至少一种算子划分为一个所述第二级子图;
在所述第一级子图中,除了与计算密集型算子连接的转置算子,与计算密集型算子后的elementwise算子连接的转置算子,与reduce算子连接的转置算子,以及与reduce算子后的elementwise算子连接的转置算子之外,将剩余的转置算子划分为一个或多个所述第二级子图;
在所述第一级子图中,除了与计算密集型算子连接的elementwise算子,与计算密集型算子后的转置算子连接的elementwise算子,与reduce算子连接的elementwise算子,以及与reduce算子后的转置算子连接的elementwise算子之外,将剩余的elementwise算子划分为一个所述第二级子图。
12.根据权利要求11所述的装置,其特征在于,所述计算密集型算子包括卷积算子和矩阵乘算子中的一种或多个,
所述编译装置,还用于根据下述一个或多个参数对编译得到的所述多个内核进行代码调优:所述计算密集型算子的输入张量的分块尺寸;所述第二级子图中的多个所述计算密集型算子的输入张量的形状是否相同;所述矩阵乘算子指示的矩阵乘操作的分解尺寸;所述reduce算子的输入张量中待规约的维度;所述转置算子的输入张量的分块尺寸;对所述element wise算子的输入张量进行循环计算时,向量化的长度、循环展开的次数以及循环合并的个数。
13.根据权利要求8-12任一项所述的装置,其特征在于,编译得到的所述多个内核包括目标内核,所述目标内核被配置为在所述XPU上的第一计算单元和第二计算单元上执行;
当所述第一计算单元上执行的部分所述目标内核与所述第二计算单元上执行的部分所述目标内核之间存在依赖关系时,在所述第一计算单元执行部分所述目标内核的过程中,第二计算单元支持预取本地执行所需的数据。
14.根据权利要求13所述的装置,其特征在于,所述第一计算单元和所述第二计算单元支持访问所述XPU上的同一个存储空间,使得所述第一计算单元将执行结果存储至所述存储空间,所述第二计算单元从所述存储空间获取所述执行结果;或者,所述第一计算单元和所述第二计算单元通过所述XPU内部的片上网络连接,使得所述第一计算单元将所述执行结果通过所述片上网络发送至所述第二计算单元。
15.一种计算设备,其特征在于,包括处理器和存储器,所述处理器执行所述存储器中的计算机程序代码以实现前述权利要求1-7任一项所述的方法。
16.一种计算机可读存储介质,其特征在于,存储有计算机程序代码,当所述计算机程序代码被计算设备执行时,所述计算设备执行前述权利要求1-7任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211390372.0A CN118034696A (zh) | 2022-11-08 | 2022-11-08 | 计算图编译方法、编译装置、计算设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211390372.0A CN118034696A (zh) | 2022-11-08 | 2022-11-08 | 计算图编译方法、编译装置、计算设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN118034696A true CN118034696A (zh) | 2024-05-14 |
Family
ID=90993836
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211390372.0A Pending CN118034696A (zh) | 2022-11-08 | 2022-11-08 | 计算图编译方法、编译装置、计算设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN118034696A (zh) |
-
2022
- 2022-11-08 CN CN202211390372.0A patent/CN118034696A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111242321B (zh) | 一种数据处理方法及相关产品 | |
US20220391678A1 (en) | Neural network model processing method and apparatus, computer device, and storage medium | |
US11500959B2 (en) | Multiple output fusion for operations performed in a multi-dimensional array of processing units | |
Ben-Nun et al. | Memory access patterns: The missing piece of the multi-GPU puzzle | |
EP4036810A1 (en) | Neural network processing method and apparatus, computer device and storage medium | |
CN110674936A (zh) | 一种神经网络处理方法、装置、计算机设备及存储介质 | |
US20200004514A1 (en) | High parallelism computing system and instruction scheduling method thereof | |
CN114450661A (zh) | 用于可重配置架构的编译器流程逻辑 | |
Wang et al. | Deep learning at scale and at ease | |
CN111860807B (zh) | 分形计算装置、方法、集成电路及板卡 | |
WO2022047423A1 (en) | Memory processing unit architecture mapping techniques | |
CN111831582A (zh) | 用于智能处理器的内存管理装置、方法及电子设备 | |
CN115756478A (zh) | 计算图的算子自动融合方法及相关产品 | |
Korol et al. | Synergistically exploiting cnn pruning and hls versioning for adaptive inference on multi-fpgas at the edge | |
CN116089895A (zh) | 一种算子融合方法及装置 | |
Liu et al. | Establishing high performance AI ecosystem on Sunway platform | |
Sun et al. | Efficient tensor cores support in tvm for low-latency deep learning | |
WO2023030507A1 (zh) | 编译优化方法、装置、计算机设备以及存储介质 | |
US12001382B2 (en) | Methods, apparatus, and articles of manufacture to generate command lists to be offloaded to accelerator circuitry | |
CN118034696A (zh) | 计算图编译方法、编译装置、计算设备及存储介质 | |
Yu et al. | Hypergef: A framework enabling efficient fusion for hypergraph neural network on gpus | |
CN111831333B (zh) | 用于智能处理器的指令分解方法、装置及电子设备 | |
CN116185377A (zh) | 计算图的优化方法、计算装置及相关产品 | |
CN116185378A (zh) | 计算图的优化方法、数据处理方法及相关产品 | |
CN115840894A (zh) | 一种用于处理多维张量数据的方法及其相关产品 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication |