CN114580653A - 机器学习计算优化方法和编译器 - Google Patents

机器学习计算优化方法和编译器 Download PDF

Info

Publication number
CN114580653A
CN114580653A CN202210032157.7A CN202210032157A CN114580653A CN 114580653 A CN114580653 A CN 114580653A CN 202210032157 A CN202210032157 A CN 202210032157A CN 114580653 A CN114580653 A CN 114580653A
Authority
CN
China
Prior art keywords
operator
operators
access
backbone
intensive
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
Application number
CN202210032157.7A
Other languages
English (en)
Inventor
郑祯
朱凯
林伟
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Alibaba Cloud Computing Ltd
Original Assignee
Alibaba Cloud Computing Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Alibaba Cloud Computing Ltd filed Critical Alibaba Cloud Computing Ltd
Priority to CN202210032157.7A priority Critical patent/CN114580653A/zh
Publication of CN114580653A publication Critical patent/CN114580653A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N20/00Machine learning
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/76Architectures of general purpose stored program computers
    • G06F15/78Architectures of general purpose stored program computers comprising a single central processing unit
    • G06F15/7807System on chip, i.e. computer system on a single chip; System in package, i.e. computer system on one or more chips in a single package
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/20Processor architectures; Processor configuration, e.g. pipelining

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Computing Systems (AREA)
  • Microelectronics & Electronic Packaging (AREA)
  • Artificial Intelligence (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Data Mining & Analysis (AREA)
  • Evolutionary Computation (AREA)
  • Medical Informatics (AREA)
  • Mathematical Physics (AREA)
  • Machine Translation (AREA)

Abstract

本发明公开了一种机器学习计算优化方法和编译器。该方法包括:识别机器学习计算图中的访存密集型算子,得到多个子图;识别子图中包括的骨干算子,并基于骨干算子对子图进行分组;将索引信息从每个分组的骨干算子向其前序算子进行传播;并将访存密集型算子子图中的算子融合到一个GPU核函数中。本发明的编译优化方案通过计算图的依赖关系特性、GPU多层次存储架构上的数据局部性、以及不同数据尺寸之下的线程并发性等方面的联合考虑,自动化地为大粒度的复杂访存密集算子子图生成高效的GPU代码,降低GPU核函数的调用及框架层算子调度的额外开销,避免不必要的重复计算,减少片外访存,同时适配各种数据尺寸以得到优化的并行效率。

Description

机器学习计算优化方法和编译器
技术领域
本发明涉及机器学习领域,尤其涉及一种机器学习计算优化方法和编译器。
背景技术
近年来,随着具有高度并行能力的芯片及其配套计算架构的提出,诸如卷积和矩阵乘的高强度并行计算已经不再成为机器学习模型的掣肘。在现有技术中,由于自动优化能力有限,难以针对复杂的访存密集算子子图高效生成代码,使得算子调度和数据存取带来的额外开销降低了整体计算效率。换句话说,访存密集型的计算由于其频繁的存取而变为当今机器学习模型的一个性能瓶颈。
为此,需要一种改进的机器学习计算优化方案。
发明内容
为了解决上述至少一个问题,本发明提出了一种针机器学习计算优化方案。该方案利用计算图的依赖关系特性和GPU多层次存储架构上的数据局部性,将一个访存密集型子图融合为一个GPU核函数,以降低深度计算模型实际使用过程中GPU核函数的调用及框架层算子调度的额外开销,由此提升整体计算效率。
根据本公开的第一方面,提出了一种机器学习计算优化方法,包括:识别机器学习计算图中的访存密集型算子,得到多个访存密集型算子子图;识别所述访存密集型算子子图中包括的骨干算子,并对所述访存密集型算子子图进行分组,其中,将骨干算子及其前序算子归为一个分组中;以及将索引信息从每个分组的骨干算子向其前序算子进行传播;以及将所述访存密集型算子子图中的算子融合到一个GPU核函数中。
可选地,所述访存密集型算子包括机器学习计算图中计算密集型算子之外的其他算子,并且得到的多个访存密集型算子子图包括由计算密集型算子隔开的多个访存密集型算子子图。
可选地,识别所述访存密集型算子子图中包括的骨干算子包括:识别所述访存密集型算子子图中包括的reduce算子作为骨干算子。
可选地,识别所述访存密集型算子子图中包括的骨干算子,并对所述访存密集型算子子图进行分组还包括:判定两个骨干算子之间是否包括能够进行索引信息传播的其他路径;响应于判定两个骨干算子之间包括能够进行索引信息传播的其他路径,将所述两个骨干算子之一识别为次骨干算子;以及将这两个算子以及这两个算子的前序算子分入同一个分组。
可选地,将索引信息从每个分组的骨干算子向其前序算子进行传播包括:骨干算子根据待处理的数据形状,自适应地生成线程映射策略;以及将所述线程映射策略传播给同一分组内的其他算子。
可选地,骨干算子根据待处理的数据形状,自适应地生成线程映射策略包括:设置线程映射规则,所述线程映射规则用于根据数据形状的维度大小和GPU实时运行状况,对线程块进行拼接或是切割。
可选地,所述方法还包括:检查所述访存密集型算子子图中骨干算子与后续算子之间的数据依赖关系,并且进行如下操作:响应于数据依赖关系为线程级别,通过寄存器传播中间数据;响应于数据依赖关系为线程块级别,通过共享内存传播中间数据;以及响应于数据依赖关系为跨线程块级别,通过全局内存传播中间数据。
可选地,所述方法还包括:分析每个访存密集型算子子图中各个算子对共享内存的申请和使用关系;以及使得同一访存密集型算子子图中的后续算子的共享内存申请优先选择复用前序算子的共享内存申请。
根据本公开的第二方面,提出了一种机器学习编译器,包括:子图获取模块,用于从机器学习计算图中识别访存密集型算子,得到多个访存密集型算子子图;子图处理模块,包括:算子分组子模块,用于识别所述访存密集型算子子图中包括的骨干算子,并对所述访存密集型算子子图进行分组,其中,将骨干算子及其前序算子归为一个分组中;以及传播子模块,用于将索引信息从每个分组的骨干算子向其前序算子进行传播;以及算子融合模块,用于将每个分组中经传播的算子融合到一个GPU核函数中。
根据本公开的第三方面,提出了一种计算设备,包括:处理器;以及存储器,其上存储有可执行代码,当所述可执行代码被所述处理器执行时,使所述处理器执行如第一方面所述的方法。
根据本公开的第四方面,提出了一种非暂时性机器可读存储介质,其上存储有可执行代码,当所述可执行代码被电子设备的处理器执行时,使所述处理器执行如第一方面所述的方法。
由此,提出了一种大粒度计算融合的优化方案,通过计算图的依赖关系特性、GPU多层次存储架构上的数据局部性、以及不同数据尺寸之下的线程并发性等方面的联合考虑,自动化地为大粒度的复杂访存密集算子子图生成高效的GPU代码,大幅减少GPU核函数的调用及框架层算子调度的额外开销,避免不必要的重复计算,大幅减少片外访存,同时适配各种数据尺寸以得到优化的并行效率。
附图说明
通过结合附图对本公开示例性实施方式进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施方式中,相同的参考标号通常代表相同部件。
图1示出了CUDA的软件和硬件结构。
图2示出了根据本发明一个实施例的机器学习计算优化方法的示意性流程图。
图3示出了reduce算子降低张量维度的例子。
图4示出了对访存密集型算子子图进行分组的例子。
图5示出了根据本发明的输入数据形状自适应操作的例子。
图6示出了算子分组、线程映射传播与跨线程数据重用的例子。
图7示出了根据本发明一个实施例的机器学习编译器的组成示意图。
图8示出了基于本发明的一个机器学习编译器的组成例。
图9示出了根据本发明一实施例可用于实现上述机器学习计算优化方法的计算设备的结构示意图。
具体实施方式
下面将参照附图更详细地描述本公开的优选实施方式。虽然附图中显示了本公开的优选实施方式,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
当前,机器学习被广泛地应用于图像处理、自然语言处理、搜索、推荐及广告等领域中。机器学习的任务往往需要消耗巨大的计算机算力,常被部署在GPU等加速器上进行计算。为了适配机器学习计算,业已提出了诸如CUDA的并行计算架构。CUDA是一种新的操作GPU计算的硬件和软件架构,它将GPU视作一个数据并行计算设备,无需把这些计算映射到图形API,并且可以利用图形处理器中的多颗计算核进行通用计算处理工作。图1示出了CUDA的软件和硬件结构。
从硬件上看,如图1右侧所示,SP(Streaming Processor,即,流处理器)是GPU最基本的处理单元。SP也可以被称为是CUDA core(CUDA核)。
多个CUDA core可以组成一个SM(Streaming MultiProcessor,即,多处理器)。每个SM(也可称为每个“核组”)根据GPU架构不同有不同数量的CUDA core,例如,一个SM可以包括64个CUDA core。SM可以具有自己的特殊运算单元(SFU)、共享内存(shared memory)、寄存器文件(Register File)和线程束调度器(Warp Scheduler)等。寄存器和共享内存是稀缺资源,这些有限的资源使每个SM中有效线程束有非常严格的限制,也就限制了并行能力。
一个GPU芯片设备可以包括多个SM(多个核组),例如,一颗市售GPU芯片可以包括60个核组,每个核组包括64个CUDAcore,因此该芯片b包含3840个CUDAcore。
从软件上看,如图1左侧所示,线程(thread)是CUDA程序的执行单位。一个CUDA的并行程序会被以许多个线程来执行。
数个线程会被群组成一个线程块(block)。同一个线程块中的线程可以同步,也可以通过共享内存进行通信。多个块可以构成网格(grid)。
在针对机器学习模型进行运算时,SM采用SIMT(Single-Instruction,Multiple-Thread,单指令多线程)架构,warp(线程束)是最基本的执行单元,一个warp包含32个并行线程,这些线程以不同数据资源执行相同的指令。
当一个GPUkernel(GPU核函数)被执行时,网格中的线程块被分配到SM上,一个线程块的线程只能在一个SM上调度,SM一般可以调度多个线程块,大量的线程可能被分到不同的SM上。每个线程拥有它自己的程序计数器和状态寄存器,并且用该线程自己的数据执行指令,这就是所谓的SIMT。
一个CUDA core可以执行一个线程,一个SM的CUDA core会分成几个warp(即CUDAcore在SM中分组),由Warp Scheduler负责调度。一个warp中的线程必然在同一个线程块。尽管warp中的线程遵从同一程序地址,但可能具有不同的行为,比如分支结构,因为GPU规定warp中所有线程在同一周期执行相同的指令,warp发散会导致性能下降。一个SM同时并发的warp是有限的,因为资源限制,SM要为每个线程块分配共享内存,而也要为每个线程束中的线程分配独立的寄存器,所以SM的配置会影响其所支持的线程块和warp并发数量。
在机器学习模型的计算中,采用计算图来实现模型网络结构的表达。计算图是一个以算子(operators)为节点的有向图所表达的计算函数。在机器学习框架里,这个计算函数对输入数据(例如,流入的张量,即tensor)依次调用执行有向图中的算子节点,并得到最终的输出数据。在本申请中,可以基于性能开销将计算图中的算子拆解为计算密集型算子和访存密集型算子两个种类。在此,计算密集型算子可以理解为需要大量并行计算的算子,例如GEMM(通用矩阵乘)和Convolution(卷积)。在实际计算中,上述算子涉及指定函数库的调用,不在本发明的算子融合优化的考虑范围内。而访存密集型算子则可以指代相比于计算,其访问和存储操作更为耗时,例如Elementwise Add,BN等操作。关于计算图过于灵活带来的框架开销,也可以归类到访存密集型算子开销占比中。换句话说,可以将计算图中例如GEMM(通用矩阵乘)和Convolution(卷积)的计算密集型算子之外的其他算子都看作是访存密集型算子。
随着机器学习模型的迭代与发展,访存密集型的计算开始在机器学习模型端到端的执行中占据很大的比重,甚至超过计算密集型的计算。对于机器学习任务中的访存密集型计算,现有的机器学习编译优化工具(XLA、TVM等)会通过计算融合的方法,将多个访存密集型的机器学习算子融合为一个GPU kernel(GPU核函数)来执行,在一定程度上缓解访存密集型计算带来的性能问题。然而,现有的计算融合仍然存在如下问题:
首先,由于计算融合的程度有限,一个访存密集型计算子图往往被分割为若干个不同的GPU kernel,带来了显著的GPU kernel调用时间开销,与此同时,大量的GPU kernel带来了严重的机器学习框架调度开销。
第二,每个GPU kernel需要从片外存储读取数据,最后再写回片外存储以供下一个GPU kernel读取,大量的片外存储访问引入了显著的时间开销。
第三,在已有的技术方案中,两个算子之间传递数据时,不支持跨线程通信,不同的线程即使需要相同的数据,也需要独立地重复计算出来,带来了大量的重算开销。
最后,已有的技术方案往往针对形状比较规则的输入数据进行优化,然而在工业应用中存在大量的不规则的输入数据,已有方案面对这些不规则的输入数据时表现出明显的欠优化。
由上可知,当前的计算融合技术只能够应对简单的计算模式,难以将复杂的计算子图融合为同一个GPU kernel,无法难以满足用户对机器学习任务的性能要求。
为此,本发明提出一种改进的机器学习计算优化方案,通过优化机器学习中访存密集型计算的性能提升机器学习任务在GPU上的执行效率。
图2示出了根据本发明一个实施例的机器学习计算优化方法的示意性流程图。该方法可由基于本发明实现的编译器执行,例如具有图8所示组成模块的编译器执行。
在步骤S210,识别机器学习计算图中的访存密集型算子,得到访存密集型算子子图。
如前所述,在机器学习模型的计算中,采用计算图来实现模型网络结构的表达,并且计算图中包括诸如GEMM和Conv的计算密集型算子以及其他的访存密集型算子。于是,对于给定的机器学习计算图,可以识别计算图中全部的访存密集型算子。在不引入环的前提下,将连通的访存密集型算子子图圈出来。即,可以将被计算密集型算子分隔开的一块块访存密集型算子子图看作是一个个独立的访存密集型算子子图。
也就是说,访存密集型算子可以包括机器学习计算图中计算密集型算子之外的其他算子,并且得到的多个访存密集型算子子图包括由计算密集型算子隔开的多个访存密集型算子子图。
在步骤S220,识别访存密集型算子子图中包括的骨干算子,并基于骨干算子对所述访存密集型算子子图进行分组,其中,将骨干算子及其前序算子归为一个分组中。在此,可以基于每个访存密集型算子子图中的骨干算子,来对该访存密集型算子子图进行算子分组。在此,骨干算子可以是由于张量的形状变化而导致线程无法被继续向下传播的算子。在一个实施例中,骨干算子可以是reduce(降维)算子。reduce算子可以指代对输入的多维张量(Tensor)数据,在某一维上执行特定的计算(比如sum、求Max/Min),从而达到降低维度的目的的算子。常见的reduce算子可以包括TensorFlow框架下的tf.reduce_sum、MNN框架中的ArgMax/ArgMin。
图3示出了reduce算子降低张量维度的例子。如图3左侧所示,输入reduce算子的张量是三维矩阵(N,H,W),其中N=5,H=4,W=6。随后进行reduce操作,在Axis=1,即,在H维度方向上做reduce,例如,求取H维度上的最小值。由此可以得到如图右侧所示的H维度减小到1的(N,W)维度的输出张量。
将reduce节点选择作为骨干节点(即,步骤S240中算子融合得到的核函数范围内的“骨干”节点)的好处是在其它节点处,在同一个线程内需要计算的索引(index)会由骨干节点的索引以辐射传播的方式推导计算得到,索引的传播过程和数值的计算过程在整个核函数(由该访存密集型算子子图的算子融合得到)的范围内进行高速缓存,通过以上机制最大化的避免冗余的索引计算和数值计算。由此,在基于骨干算子的分组之后,就可以执行步骤S230,将索引信息从每个分组的骨干算子向其前序算子进行传播。在此,传播的索引信息是指某个线程计算一个张量数据中的哪一部分的索引值。
在索引传播之后,就能够在步骤S240,将每个分组中经传播的算子融合到一个GPU核函数中。换句话说,可以基于骨干算子分组和索引传播,使得计算图中每个访存密集型算子子图将通过自动代码生成技术被优化为一个GPU核函数。例如,在计算图中包括由9个计算密集型算子隔开的10个访存密集型算子子图,可以通过对每个访存密集型算子子图内部的基于骨干算子的分组和索引传播,来实现对每个访存密集型算子子图的融合,即在编译过程中融合得到10个对应的GPU核函数。
由此,本申请通过将任何连通的访存密集型算子融合到同一个GPU核函数中,极大地减少机器学习程序执行时的GPU核函数数量,避免不必要的GPU核函数调用以及算子调度时间。
在某些情况下,某些分组中可以包括一个以上的reduce算子。为此,识别所述访存密集型算子子图中包括的骨干算子,并对所述访存密集型算子子图进行分组还包括:判定两个骨干算子之间是否包括能够进行索引信息传播的其他路径;响应于判定两个骨干算子之间包括能够进行索引信息传播的其他路径,将所述两个骨干算子之一识别为次骨干算子;以及将这两个算子以及这两个算子的前序算子分入同一个分组。
图4示出了对访存密集型算子子图进行分组的例子。图4左侧示出了访存密集型算子子图的一个例子。上述子图可以是在步骤S210中圈出的,由位于两个计算密集型算子之间的所有连通的访存密集型算子构成的子图。图中包括四个骨干算子(为了方便说明,将其标号为1、2、3、4)。但由于1号和2号骨干算子能够通过其间的算子传播索引信息,因此可以将2号骨干算子及其前序算子也并入1号骨干算子所在的分组。进一步地,由于3号和4号骨干算子能够通过其间的算子传播索引信息,因此可以将4号骨干算子及其前序算子也并入3号骨干算子所在的分组。由于输入在后骨干算子的数据形状肯定要小于输入在前骨干算子的数据形状(例如,送入2号算子的数据时经过1号算子reduce的形状),因此可以将同一分组中的在前骨干算子仍然视为进行索引传播(以及后续的自适应形状线程映射)的“骨干算子”,将在后的算子视为“次骨干算子”。为此,在图4的例子中,可以将并入的2号和4号骨干算子分别看作是所在分组的次骨干算子(在图4右侧由灰色圆圈表示),并将子图分成由虚线框出的两个分组。
进一步地,由于实际应用中输入数据的形状未知,因此本发明还包括基于输入数据的形状(即,输入算子的“tensor”的“shape”),自适应的确定要映射的线程(即,要使用多少线程来进行当前算子的计算)。为此,索引传播步骤230还可以包括:对于每个骨干算子,根据其要处理的数据形状,自适应地生成可高并发的线程映射策略,进而将该线程映射策略传播给之前划分的同一个分组内的其他算子。
在现有的XLA/TVM的方案中,对于关键的reduce算子,如果被规约的数据维度较小,其形成的线程块维度过小,无法占满GPU的计算资源,从而表现出并行度欠佳的问题;如果非规约的维度较小,则其形成的线程块数量过小,同样无法占满GPU的计算资源。由此,为了提升对GPU计算资源的利用率,可以设置线程映射规则,所述线程映射规则用于根据数据形状的维度大小和GPU实时运行状况,对线程块进行拼接或是切割。
图5示出了根据本发明的输入数据形状自适应操作的例子。如图所示,在输入reduce任务的数据张量维度过小时,线程块内单次计算的计算量太少,此时可以对线程块要处理的数据进行例如图5中a)所示的横向和/或纵向拼接。而在输入reduce任务的数据张量维度过大时,线程块需要执行的计算次数过多,此时可以对线程块要处理的数据进行例如图5中b)所示的切割。换句话说,通过二维的线程块拼接,将单个维度过小的线程块拼接为维度大的线程块,可以解决因输入数据维度过小导致GPU计算资源控制的问题;通过将单个线程块切成若干个,则可以增加线程块的数量,可以解决因输入数据维度过大导致GPU计算资源控制的问题。对于给定的数据输入,本方案会根据数据维度大小来决定线程块的拼接或切割,以达到优化的并行度。
由于上述自适应的线程映射是在机器学习模型实际运行中进行的,因此上述线程映射规则可以包括或是实现为条件判断,由此可以在实际执行时根据当前条件进行判断。具体地判断条件与张量形状和GPU的当前并行度都有关系。例如,某个骨干算子要进行的操作是把一个[4x2048]的矩阵(即,输入的张量)reduce为一个[4x1]的矩阵,然后GPU上有16个空闲的SM,因此可以如图5的b)所示的对线程块进行切割,使得每4个SM做[1x2048]的reduce,16个SM一起完成全部的[4x2048]到[4x1]的reduce操作。
进一步地,由于可以认为骨干算子与其前序算子具有相同形状的数据形状输入,因此可以使用相同的线程块来执行骨干算子与其前序算子。但对于骨干算子与其后续算子,则需要检查骨干算子与其后续算子之间的数据依赖关系,并进行数据重用规划。如果数据依赖关系为线程级别,通过寄存器传播中间数据;如果数据依赖关系为线程块级别,通过共享内存传播中间数据;如果数据依赖关系为跨线程块级别,通过全局内存传播中间数据。如果通过的是共享内存和全局内存,则表明涉及到跨线程的数据传输。另外,在包括次骨干算子的算子分组中,由于涉及到数据张量的形状变化,因此在同一分组内也可能包括通过共享内存或是全局内存的中间数据传播,并且同样需要检查次骨干算子与其后续算子之间的数据依赖关系,并进行数据重用规划。
另外,在使用全局内存做数据重用时,需要做GPU上的全局同步,这需要GPU上发射的最大线程不能超过GPU在一波之内可以调度的最大线程数量。为此,可以控制GPU核函数的并行维度设置,使其位于GPU一波内可以调度的最大线程限度之内。
图6示出了算子分组、线程映射传播与跨线程数据重用的例子。图6的左侧与图4所示相同,根据reduce算子以及reduce算子之间是否能够进行索引信息传播,在步骤1)将图示的访存密集型算子子图划分为上下两个分组。随后,在步骤2)可以从上部分组的骨干算子(即,1号算子)开始进行该分组内的线程映射传播,从下部分组的骨干算子(即,3号算子)开始进行该分组内的线程映射传播,如图6中的灰色粗箭头所示。在步骤3),则可进行骨干算子和次骨干算子与其后续算子间的数据重用规划。例如,带圆点的线指示1号算子与其后续算子之间通过共享内存传播中间数据,箭头则指示2号算子与其后续算子之间、3号算子与其后续算子之间通过全局内存传播中间数据。
如上的数据重用规划用于确定使用何种类型的介质来做读写。其后,还可以通过片上访存优化来进一步节省被确定为使用共享内存时的内存分配。由此,本发明的机器学习计算优化方法还可以包括:分析每个访存密集型算子子图中各个算子对共享内存的申请和使用关系;以及使得同一访存密集型算子子图中的后续算子的共享内存申请优先选择复用前序算子的共享内存申请。例如,在进行a→b→c的计算时,通过在前的一系列操作,知道需要通过共享内存来进行其间的数据传播。即,已经知晓a→[共享内存-X]→b→[共享内存-Y]→c,则可以通过片上访存优化来分析共享内存-X和共享内存-Y是否可以只分配一次(即,使用共享内存-Y这一次的存储分配),从而节省资源分配。
由此,本发明提出了一种基于算子分组、线程映射传播和跨线程数据重用规划为核心的大粒度算子融合技术,并且可以对于机器学习算子生成自适应于不同数据形状的高并发线程映射方法。
在一个实施例中,本发明还可以实现为一种机器学习计算编译器。图7示出了根据本发明一个实施例的机器学习编译器的组成示意图。如图7所示,机器学习编译器700可以包括子图获取模块710、子图处理模块720和算子融合模块730。
具体地,子图获取模块710可以用于从机器学习计算图中识别访存密集型算子,得到多个访存密集型算子子图。子图处理模块720可以包括:算子分组子模块,用于识别所述访存密集型算子子图中包括的骨干算子,并对所述访存密集型算子子图进行分组,其中,将骨干算子及其前序算子归为一个分组中;以及传播子模块,用于将索引信息从每个分组的骨干算子向其前序算子进行传播。算子融合模块730用于将每个分组中经传播的算子融合到一个GPU核函数中。
在一个实施例中,本发明的机器学习编译器可以实现为具有图8所示的组成。图8示出了基于本发明的一个机器学习编译器的组成例。如图所示,在获取了机器学习计算图之后,可以进行访存密集型算子子图圈图,即,对应于子图获取模块710和如上步骤S210,对访存密集型算子子图进行识别。在识别出访存密集型算子子图之后,可以在自动代码生成模块中进行子图优化,具体可以包括基于骨干算子的算子分组、自适应形状的线程映射与传播、以及跨线程数据重用规划,最后可以对片上访存使用进行优化(即,尽量复用共享内存分配),在进行了如上优化之后,可以自动生成代码,由此得到各个子图的可执行二进制文件。上述可执行二进制文件是整个计算图经编译后得到的可执行二进制文件的一部分。随后,就可以将整个计算图编译后得到可执行二进制文件交由GPU进行执行,以实现由于现有技术的计算性能。
图9示出了根据本发明一实施例可用于实现上述机器学习计算优化方法的计算设备的结构示意图。
参见图9,计算设备900包括存储器910和处理器920。
处理器920可以是一个多核的处理器,也可以包含多个处理器。在一些实施例中,处理器920可以包含一个通用的主处理器以及一个或多个特殊的协处理器,例如图形处理器(GPU)、数字信号处理器(DSP)等等。在一些实施例中,处理器920可以使用定制的电路实现,例如特定用途集成电路(ASIC,Application Specific Integrated Circuit)或者现场可编程逻辑门阵列(FPGA,Field Programmable Gate Arrays)。
存储器910可以包括各种类型的存储单元,例如系统内存、只读存储器(ROM),和永久存储装置。其中,ROM可以存储处理器920或者计算机的其他模块需要的静态数据或者指令。永久存储装置可以是可读写的存储装置。永久存储装置可以是即使计算机断电后也不会失去存储的指令和数据的非易失性存储设备。在一些实施方式中,永久性存储装置采用大容量存储装置(例如磁或光盘、闪存)作为永久存储装置。另外一些实施方式中,永久性存储装置可以是可移除的存储设备(例如软盘、光驱)。系统内存可以是可读写存储设备或者易失性可读写存储设备,例如动态随机访问内存。系统内存可以存储一些或者所有处理器在运行时需要的指令和数据。此外,存储器910可以包括任意计算机可读存储媒介的组合,包括各种类型的半导体存储芯片(DRAM,SRAM,SDRAM,闪存,可编程只读存储器),磁盘和/或光盘也可以采用。在一些实施方式中,存储器910可以包括可读和/或写的可移除的存储设备,例如激光唱片(CD)、只读数字多功能光盘(例如DVD-ROM,双层DVD-ROM)、只读蓝光光盘、超密度光盘、闪存卡(例如SD卡、min SD卡、Micro-SD卡等等)、磁性软盘等等。计算机可读存储媒介不包含载波和通过无线或有线传输的瞬间电子信号。
存储器910上存储有可执行代码,当可执行代码被处理器920处理时,可以使处理器920执行上文述及的机器学习计算优化方法。
本发明提出了一种大粒度计算融合的编译优化手段,通过计算图的依赖关系特性、GPU多层次存储架构上的数据局部性、以及不同数据尺寸之下的线程并发性等三个方面的联合考虑,自动化地为大粒度的复杂访存密集算子子图生成高效的GPU代码,大幅减少GPU核函数的调用及框架层算子调度的额外开销,避免不必要的重复计算,大幅减少片外访存,同时适配各种数据尺寸以得到优化的并行效率。
本方案支持将同一子图中的访存密集型算子融合到同一个GPU核函数中,因此可以极大地减少机器学习程序执行时的GPU核函数数量,避免不必要的核函数调用以及算子调度时间;本方案通过数据重用规划,最大限度地使计算过程的中间数据保留在寄存器和共享内存等片上存储中,避免不必要的片外存储的访问;本方案通过跨线程的数据重用,避免了不同线程之间独立地进行重复的计算;本方案通过对输入形状自适应地做线程映射的方法,可以支持在处理各种输入性状时都达到较高的并发度。
此外,根据本发明的方法还可以实现为一种计算机程序或计算机程序产品,该计算机程序或计算机程序产品包括用于执行本发明的上述方法中限定的上述各步骤的计算机程序代码指令。
或者,本发明还可以实施为一种非暂时性机器可读存储介质(或计算机可读存储介质、或机器可读存储介质),其上存储有可执行代码(或计算机程序、或计算机指令代码),当所述可执行代码(或计算机程序、或计算机指令代码)被电子设备(或计算设备、服务器等)的处理器执行时,使所述处理器执行根据本发明的上述方法的各个步骤。
本领域技术人员还将明白的是,结合这里的公开所描述的各种示例性逻辑块、模块、电路和算法步骤可以被实现为电子硬件、计算机软件或两者的组合。
附图中的流程图和框图显示了根据本发明的多个实施例的系统和方法的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标记的功能也可以以不同于附图中所标记的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,本发明中使用的“第一”、“第二”旨在表明不同对象,而非对执行次序等的限制,例如,文中涉及的“第一部分数据”和“第二部分数据”旨在表明同属于特征图的不同部分。而“第一后续操作”和“第二后续操作”仅用于区别两个后续操作是不同的后续操作。
以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。

Claims (11)

1.一种机器学习计算优化方法,包括:
识别机器学习计算图中的访存密集型算子,得到访存密集型算子子图;
识别所述访存密集型算子子图中包括的骨干算子,并基于所述骨干算子对所述访存密集型算子子图进行分组,其中,将骨干算子及其前序算子归为一个分组中;
将索引信息从每个分组的骨干算子向其前序算子进行传播;以及
将所述访存密集型算子子图中的算子融合到一个GPU核函数中。
2.如权利要求1所述的方法,其中,所述访存密集型算子包括机器学习计算图中计算密集型算子之外的其他算子,并且
得到的访存密集型算子子图包括由计算密集型算子隔开的多个访存密集型算子子图。
3.如权利要求1所述的方法,其中,识别所述访存密集型算子子图中包括的骨干算子包括:
识别所述访存密集型算子子图中包括的reduce算子作为骨干算子。
4.如权利要求3所述的方法,其中,识别所述访存密集型算子子图中包括的骨干算子,并基于所述骨干算子对所述访存密集型算子子图进行分组还包括:
判定两个骨干算子之间是否包括能够进行索引信息传播的其他路径;
响应于判定两个骨干算子之间包括能够进行索引信息传播的其他路径,将所述两个骨干算子之一识别为次骨干算子;以及
将这两个算子以及这两个算子的前序算子分入同一个分组。
5.如权利要求1所述的方法,其中,将索引信息从每个分组的骨干算子向其前序算子进行传播包括:
骨干算子根据待处理的数据形状,自适应地生成线程映射策略;以及
将所述线程映射策略传播给同一分组内的其他算子。
6.如权利要求5所述的方法,其中,骨干算子根据待处理的数据形状,自适应地生成线程映射策略包括:
设置线程映射规则,所述线程映射规则用于根据数据形状的维度大小和GPU实时运行状况,对线程块进行拼接或是切割。
7.如权利要求1所述的方法,还包括:
检查所述访存密集型算子子图中骨干算子与后续算子之间的数据依赖关系,并且进行如下操作:
响应于数据依赖关系为线程级别,通过寄存器传播中间数据;
响应于数据依赖关系为线程块级别,通过共享内存传播中间数据;以及
响应于数据依赖关系为跨线程块级别,通过全局内存传播中间数据。
8.如权利要求1所述的方法,还包括:
分析每个访存密集型算子子图中各个算子对共享内存的申请和使用关系;以及
使得同一访存密集型算子子图中的后续算子的共享内存申请优先选择复用前序算子的共享内存申请。
9.一种机器学习编译器,包括:
子图获取模块,用于从机器学习计算图中识别访存密集型算子,得到多个访存密集型算子子图;
子图处理模块,包括:
算子分组子模块,用于识别所述访存密集型算子子图中包括的骨干算子,并对所述访存密集型算子子图进行分组,其中,将骨干算子及其前序算子归为一个分组中;以及
传播子模块,用于将索引信息从每个分组的骨干算子向其前序算子进行传播;以及
算子融合模块,用于将每个分组中经传播的算子融合到一个GPU核函数中。
10.一种计算设备,包括:
处理器;以及
存储器,其上存储有可执行代码,当所述可执行代码被所述处理器执行时,使所述处理器执行如权利要求1-8中任一项所述的方法。
11.一种非暂时性机器可读存储介质,其上存储有可执行代码,当所述可执行代码被电子设备的处理器执行时,使所述处理器执行如权利要求1-8中任一项所述的方法。
CN202210032157.7A 2022-01-12 2022-01-12 机器学习计算优化方法和编译器 Pending CN114580653A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210032157.7A CN114580653A (zh) 2022-01-12 2022-01-12 机器学习计算优化方法和编译器

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210032157.7A CN114580653A (zh) 2022-01-12 2022-01-12 机器学习计算优化方法和编译器

Publications (1)

Publication Number Publication Date
CN114580653A true CN114580653A (zh) 2022-06-03

Family

ID=81772560

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210032157.7A Pending CN114580653A (zh) 2022-01-12 2022-01-12 机器学习计算优化方法和编译器

Country Status (1)

Country Link
CN (1) CN114580653A (zh)

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116166275A (zh) * 2023-04-24 2023-05-26 之江实验室 一种深度学习任务构图方法、装置、介质
CN116610424A (zh) * 2023-03-06 2023-08-18 北京科技大学 一种基于gpu合并访存的模板计算二维线程块选择方法
CN116756589A (zh) * 2023-08-16 2023-09-15 北京壁仞科技开发有限公司 匹配算子的方法、计算设备和计算机可读存储介质
CN117008916A (zh) * 2023-07-06 2023-11-07 清华大学 张量程序优化方法和装置
CN117170685A (zh) * 2023-11-02 2023-12-05 腾讯科技(深圳)有限公司 一种数据处理方法、装置、设备及介质
CN117591776A (zh) * 2024-01-18 2024-02-23 北京壁仞科技开发有限公司 用于计算的方法、计算装置、介质和程序产品
WO2024065525A1 (en) * 2022-09-29 2024-04-04 Intel Corporation Method and apparatus for optimizing deep learning computation graph
WO2024082679A1 (zh) * 2022-10-19 2024-04-25 华为技术有限公司 计算图的处理方法和装置

Cited By (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2024065525A1 (en) * 2022-09-29 2024-04-04 Intel Corporation Method and apparatus for optimizing deep learning computation graph
WO2024082679A1 (zh) * 2022-10-19 2024-04-25 华为技术有限公司 计算图的处理方法和装置
CN116610424A (zh) * 2023-03-06 2023-08-18 北京科技大学 一种基于gpu合并访存的模板计算二维线程块选择方法
CN116610424B (zh) * 2023-03-06 2024-04-26 北京科技大学 一种基于gpu合并访存的模板计算二维线程块选择方法
CN116166275A (zh) * 2023-04-24 2023-05-26 之江实验室 一种深度学习任务构图方法、装置、介质
CN117008916A (zh) * 2023-07-06 2023-11-07 清华大学 张量程序优化方法和装置
CN116756589A (zh) * 2023-08-16 2023-09-15 北京壁仞科技开发有限公司 匹配算子的方法、计算设备和计算机可读存储介质
CN116756589B (zh) * 2023-08-16 2023-11-17 北京壁仞科技开发有限公司 匹配算子的方法、计算设备和计算机可读存储介质
CN117170685A (zh) * 2023-11-02 2023-12-05 腾讯科技(深圳)有限公司 一种数据处理方法、装置、设备及介质
CN117170685B (zh) * 2023-11-02 2024-02-23 腾讯科技(深圳)有限公司 一种数据处理方法、装置、设备及介质
CN117591776A (zh) * 2024-01-18 2024-02-23 北京壁仞科技开发有限公司 用于计算的方法、计算装置、介质和程序产品
CN117591776B (zh) * 2024-01-18 2024-05-03 北京壁仞科技开发有限公司 用于计算的方法、计算装置、介质和程序产品

Similar Documents

Publication Publication Date Title
CN114580653A (zh) 机器学习计算优化方法和编译器
US20200249998A1 (en) Scheduling computation graph heterogeneous computer system
US8209703B2 (en) Apparatus and method for dataflow execution in a distributed environment using directed acyclic graph and prioritization of sub-dataflow tasks
US9424038B2 (en) Compiler-controlled region scheduling for SIMD execution of threads
US11609792B2 (en) Maximizing resource utilization of neural network computing system
US20070038987A1 (en) Preprocessor to improve the performance of message-passing-based parallel programs on virtualized multi-core processors
US20140333638A1 (en) Power-efficient nested map-reduce execution on a cloud of heterogeneous accelerated processing units
EP3391214B1 (en) Processing data using dynamic partitioning
US20150149744A1 (en) Data processing apparatus and method for performing vector processing
CN110717574B (zh) 一种神经网络运行方法、装置及异构智能芯片
CN110308982B (zh) 一种共享内存复用方法及装置
US11556756B2 (en) Computation graph mapping in heterogeneous computer system
CN114418127B (zh) 机器学习计算优化方法和平台
CN111399911B (zh) 一种基于多核异构计算的人工智能开发方法及装置
US20210073625A1 (en) Partitioning control dependency edge in computation graph
US8615770B1 (en) System and method for dynamically spawning thread blocks within multi-threaded processing systems
CN114416045A (zh) 自动生成算子的方法和装置
EP4040295A1 (en) Memory bandwidth allocation for multi-tenant fpga cloud infrastructures
US8959497B1 (en) System and method for dynamically spawning thread blocks within multi-threaded processing systems
CN113326137B (zh) 深度学习计算方法、装置、芯片及介质
KR20230058621A (ko) 메모리-한도 스케줄링
CN111045959A (zh) 一种基于存储优化的复杂算法变量映射方法
Okamura et al. DAG scheduling considering parallel execution for high-load processing on clustered many-core processors
CN112711478B (zh) 基于神经网络的任务处理方法、装置、服务器和存储介质
WO2021098105A1 (en) Method and apparatus for functional unit assignment

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination