数据处理方法、装置、设备及存储介质与流程

文档序号:29642746发布日期:2022-04-13 19:00阅读:90来源:国知局
数据处理方法、装置、设备及存储介质与流程

1.本技术涉及数据处理技术领域,尤其涉及一种数据处理方法、装置、设备及存储介质。


背景技术:

2.相关技术中,深度学习算子通常采用硬件指令编写成平台可执行代码。然而,由于不同的硬件平台需要专门的代码生成后端进行可执行代码的编写,导致深度学习算子的平台通用性不佳。此外,由于每新增一个硬件平台后需要增加一个代码生成后端用于编写该新增硬件平台的可执行代码,导致整个算子开发框架过于庞大,框架维护非常复杂。


技术实现要素:

3.本技术实施例提供了一种数据处理方法、装置、设备及存储介质,用于自定义算子开发,从而解决算子开发框架过于庞大,框架维护非常复杂的问题。
4.为达到上述目的,本技术实施例提供如下技术方案:
5.第一方面,提供了一种数据处理方法,包括:获取自定义算子的源代码,自定义算子包括至少两个基础算子;其中,待执行自定义算子的目标硬件平台的算子库中预先存储有至少两个基础算子,基础算子是多个硬件平台通用的基础算子,多个硬件平台包括目标硬件平台;解析源代码,得到自定义算子的拓扑结构文件,拓扑结构文件用于指示目标硬件平台执行自定义算子时从算子库中调用至少两个基础算子,以及至少两个基础算子的计算逻辑。
6.由于自定义算子的源代码通过各个硬件平台通用的基础算子组成,使得自定义算子的源代码与硬件平台的特性无关,进而实现自定义算子的源代码可以适用于不同的硬件平台。进一步地,通过解析源代码得到自定义算子的拓扑结构文件,该拓扑结构文件可以指示目标硬件平台从算子库中获取至少两个基础算子并依照拓扑结构文件指示的计算逻辑执行该至少两个基础算子,也即,不同硬件平台都可以通过该拓扑结构文件实现自定义算子的运行,从而实现了自定义算子的多平台通用。进一步地,由于硬件平台基于拓扑结构文件和自身的算子库便可以执行自定义算子,因此,不必再为每一个硬件平台增加一个代码生成后端,大大降低了算子开发框架的代码量,代码维护简单。
7.在一种可能的实现方式中,拓扑结构文件包括每个基础算子的参数信息,参数信息用于确定目标硬件平台调用的至少两个基础算子的参数。
8.该种可能的实施方式,有助于保证在至少两个基础算子配置有参数的情况下,避免缺少至少两个基础算子的参数,从而保证每个基础算子的准确性,进而保证自定义算子的准确性。
9.在一种可能的实现方式中,方法还包括:在确定自定义算子中包括不属于算子库的目标算子的情况下,发出提示信息;其中,提示信息用于指示用户修改目标算子。
10.该种可能的实现方式,通过在硬件平台的算子库不包括基础算子时,发出提示信
息,提醒算子开发人员进行重新编写,有助于避免硬件平台无法执行自定义算子。
11.在一种可能的实现方式中,算子开发框架包括预先配置的基础算子调用接口库,基础算子调用接口库包括多个硬件平台通用的基础算子的调用接口;获取自定义算子的源代码,包括:获取基于算子调用接口库生成的自定义算子的源代码,源代码包括至少两个基础算子的调用接口;解析源代码,得到自定义算子的拓扑结构文件,包括:解析源代码,得到至少两个基础算子的调用接口之间的拓扑关系;至少两个基础算子的调用接口,用于目标硬件平台执行自定义算子时,从算子库中调用至少两个基础算子。
12.该种可能的实现方式,通过为用户提供基础算子调用接口库,使得用户无需掌握硬件平台的特性,也无需熟悉算子开发编程语言,即可编写自定义算子的源代码,算子开发难度低,开发效率高。
13.在一种可能的实现方式中,源代码还包括目标硬件平台的平台标识;拓扑结构文件还包括平台标识,以指示目标硬件平台在运行自定义算子之前,获取拓扑结构文件。
14.该种可能的实现方式,通过在拓扑结构文件中配置平台标识,以便硬件平台设备在获取拓扑结构文件时,可以根据硬件平台的平台标识,获取对应的拓扑结构文件,从而保证了硬件平台获取拓扑结构文件的准确性。
15.在一种可能的实现方式中,在解析源代码,得到自定义算子的拓扑结构文件之后,方法还包括:确定神经网络中的自定义算子;获取预先存储的自定义算子的拓扑结构文件;基于拓扑结构文件,从目标硬件平台的算子库调用至少两个基础算子,并基于拓扑结构文件指示的至少两个基础算子的计算逻辑,运行至少两个基础算子。
16.该种可能的实现方式,实现了对硬件平台底层驱动加速库(即算子库)的二次利用,进而实现极致利用硬件平台的性能,并且有助于提高的自定义算子的性能。
17.第二方面,提供了一种数据处理装置,用于算子开发框架,装置包括:用于执行第一方面提供的任意一种方法的功能单元,各个功能单元所执行的动作通过硬件实现或通过硬件执行相应的软件实现。例如,数据处理装置可以包括:算子编程单元和代码解析单元;算子编程单元,用于获取自定义算子的源代码,自定义算子包括至少两个基础算子;其中,待执行自定义算子的目标硬件平台的算子库中预先存储有至少两个基础算子,基础算子是多个硬件平台通用的基础算子,多个硬件平台包括目标硬件平台;代码解析单元,用于解析源代码,得到自定义算子的拓扑结构文件,拓扑结构文件用于指示目标硬件平台执行自定义算子时从算子库中调用至少两个基础算子,以及至少两个基础算子的计算逻辑。
18.第三方面,提供了一种计算机设备,包括:处理器和存储器。处理器与存储器连接,存储器用于存储计算机执行指令,处理器执行存储器存储的计算机执行指令,从而实现第一方面提供的任意一种方法。
19.第四方面,提供了一种芯片,该芯片包括:处理器和接口电路;接口电路,用于接收代码指令并传输至处理器;处理器,用于运行代码指令以执行第一方面提供的任意一种方法。
20.第五方面,提供了一种计算机可读存储介质,包括计算机执行指令,当计算机执行指令在计算机上运行时,使得计算机执行第一方面提供的任意一种方法。
21.第六方面,提供了一种计算机程序产品,包括计算机执行指令,当计算机执行指令在计算机上运行时,使得计算机执行第一方面提供的任意一种方法。
22.第二方面至第六方面中的任一种实现方式所带来的技术效果可参见第一方面中对应实现方式所带来的技术效果,此处不再赘述。
附图说明
23.图1为本技术实施例提供的一种相关技术中的算子开发方案的示意图;
24.图2为本技术实施例提供的另一种相关技术中的算子开发方案的示意图;
25.图3为本技术实施例提供的另一种相关技术中的算子开发方案的示意图;
26.图4为本技术实施例提供的一种计算机设备的示意图;
27.图5为本技术实施例提供的另一种计算机设备的示意图;
28.图6为本技术实施例提供的一种数据处理方法的流程示意图;
29.图7为本技术实施例提供的一种数据处理方法的原理图;
30.图8为本技术实施例提供的一种数据处理方法的示意图;
31.图9为本技术实施例提供的一种数据处理方法的原理图;
32.图10为本技术实施例提供的一种算子函数图像示意图;
33.图11为本技术实施例提供的一种拓扑关系示意图;
34.图12为本技术实施例提供的另一种数据处理方法的流程示意图;
35.图13为本技术实施例提供的另一种数据处理方法的示意图;
36.图14为本技术实施例提供的另一种数据处理方法的示意图;
37.图15为本技术实施例提供的一种数据处理装置的组成示意图。
具体实施方式
38.在本技术的描述中,除非另有说明,“/”表示“或”的意思,例如,a/b可以表示a或b。本文中的“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。此外,“至少一个”是指一个或多个,“多个”是指两个或两个以上。“第一”、“第二”等字样并不对数量和执行次序进行限定,并且“第一”、“第二”等字样也并不限定一定不同。
39.需要说明的是,本技术中,“示例性的”或者“例如”等词用于表示作例子、例证或说明。本技术中被描述为“示例性的”或者“例如”的任何实施例或设计方案不应被解释为比其他实施例或设计方案更优选或更具优势。确切而言,使用“示例性的”或者“例如”等词旨在以具体方式呈现相关概念。
40.首先,对本技术涉及的应用场景进行简单介绍。
41.算子是一个函数空间到函数空间上的映射。广义的讲,对任何函数进行某一项操作都可以算是一个算子,例如,加、减、乘、除或开方都是一个算子。基于此,在深度学习领域,计算层可以看作是深度学习网络的深度学习算子,例如卷积层,池化层等。
42.相关技术中,深度学习算子通常采用硬件指令编写成平台可执行代码。然而,由于不同的硬件平台需要专门的代码生成后端进行可执行代码的编写,导致深度学习算子的平台通用性不佳。此外,由于每新增一个硬件平台后需要增加一个代码生成后端用于编写该新增硬件平台的可执行代码,导致整个算子开发框架过于庞大,框架维护非常复杂。
43.例如,如图1所示,在第一种相关的算子开发方案中,如图1中的(a)所示,该方案使
用算子开发框架提供的算子指令集开发自定义算子,由于使用算子指令集开发自定义算子,输出的是硬件平台的算子指令集实现代码,因此,不同的硬件平台需要生成不同的算子实现代码进行运行,才能实现自定义算子的功能。具体地,如图1中的(b)所示,为了实现该算子开发方案,将算子开发分为了计算表达、计算调度和代码生成三个独立步骤,由于代码生成需要独立的模块实现,那么,每次新增硬件平台,就需要提前开发代码生成模块。进一步地,如图1中的(c)所示,该方案还设计了一种中间表示(即张量表示语言,tensor expression language,又称tvm ir),用于表达算子的计算逻辑。进一步地,用于实现该算子开发方案的算子开发框架包括计算表达模块、调度优化模块和代码生成模块。其中,计算表达模块,用于使用中间表示描述算子的基本计算逻辑(如卷积算子的计算逻辑),即准确地描述算子需要完成什么任务,输入是什么,输出是什么。调度优化模块,用于根据不同硬件平台的特性,对中间表示进行调度优化,明确给出算子的具体计算或执行过程,以便此算子在此类硬件平台能获得最优的运行效率,例如,如图2所示的调度优化模块。代码生成模块,其将调度优化后的中间表示转换为特定硬件平台的可执行代码。
44.下面,对图2中的llvm、gpu、opencl、caffe2、cntk、core ml进行解释:
45.llvm(low level virtual machine):是构架编译器(compiler)的框架系统,以c++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
46.gpu(graphics processing unit):图形处理器,又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上做图像和图形相关运算工作的微处理器。
47.opencl(open computing language):开放运算语言,是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(cpu)、图形处理器(gpu)、cell类型架构以及数字信号处理器(dsp)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景。
48.caffe2(convolutional architecture for fast feature embedding):是一个计算cnn(convolutional neural networks)相关算法的框架,用c++和python实现的。
49.cntk(computational network toolkit):是微软出品的开源深度学习工具包,它支持cpu和gpu模式。
50.core ml:是apple提供的一机器学习框架,core ml支持多种机器学习模型,其中包括了神经网络(neural network)、组合树(tree ensemble)、支持向量机(support vector machine)以及广义线性模型(generalized linear model)。
51.该种算子开发方案,对于用户来说,由于使用算子开发框架提供的算子指令集开发自定义算子,且需要针对不同的硬件平台进行不同策略的调度优化,因此,就需要用户深入掌握硬件特性、熟悉算子开发编程语法,从而才能使用指定语法根据硬件特性编程开发出算子的计算逻辑和调度逻辑,并且需要使用算子开发框架提供的算子指令集,过于依赖第三方提供的库,且操作繁琐。此外,不仅需要完成算子指令集开发,还需要实现算子的计算逻辑(即中间表示)以及必要的调度优化,开发工作量大,算子开发效率低。
52.该种算子开发方案,对用开发方案的技术人员来说,由于调度优化环节与具体硬件平台耦合较深,导致调度优化代码难以在多个硬件平台复用,也即,同一个算子在多个硬件平台进行调度优化时,需要针对每一个硬件平台开发调度优化代码,算子开发框架的开发效率低下。进一步地,由于每接入一种新硬件平台,都需要手动编写一套代码生成模块,代码开发量大,且需要针对不同的硬件特性设定多种调度优化模板,工序繁琐,代码生成模块代码量大,维护起来不方便。
53.进一步地,由于不同硬件平台的结构存在不同,所以不同硬件平台的可执行代码也不相同,因此,该种算子开发方案的算子开发框架需要为不同的硬件平台配置不同的代码生成模块,这就导致算子开发框架的通用性不佳,且整个算子开发框架非常庞大,约占用数百兆存储空间,代码维护起来非常困难。
54.例如,如图3所示,在第二种相关的算子开发方案中,对多个硬件平台进行抽象,将硬件平台的硬件功能抽象为计算核接口,使得调度优化代码可以在多个硬件平台复用。但是,仍然需要为不同的硬件平台配置不同的代码生成模块,导致算子开发框架的通用性不佳,且整个算子开发框架非常庞大,约占用数百兆存储空间,代码维护起来非常困难。
55.此外,由于上述两个算子开发方案中,通过自定义的中间表示生成硬件平台的可执行代码,并通过调度优化模块的调度优化代码优化自定义的中间示,以提高算子在硬件平台的性能,因此,需要不断地进行优化模板的设计以及大量的调度优化计算,不仅工作量极大,而且效率非常低。
56.针对上述问题,本技术提供了一种数据处理方法,通过使用多个硬件平台通用的基础算子组成自定义算子,使得自定义算子与硬件平台的特性无关,从而实现自定义算子可以适用于不同的硬件平台。进一步地,通过解析源代码得到自定义算子的拓扑结构文件,该拓扑结构文件可以指示目标硬件平台从自带的算子库中获取至少两个基础算子并依照拓扑结构文件指示的计算逻辑执行该指示两个基础算子,从而实现自定义算子的运行,进而实现了自定义算子的多硬件平台通用。进一步地,由于硬件平台基于拓扑结构文件和自身的算子库便可以执行自定义算子,因此,不必再为每一个硬件平台增加一个代码生成后端,大大降低了算子开发框架的代码量,框架维护简单。
57.进一步地,由于硬件平台使用自身的算子库中的基础算子执行自定义算子,而自身算子库中的基础算子必然与平台契合度最高,因此,不再需要针对每个硬件平台的特性设定自定义算子的调度优化模板,大大降低了工作量。
58.最后,对本技术涉及的实施环境(实施架构)进行简单介绍。
59.本技术实施例提供了一种数据处理方法,可应用于计算机设备。本技术实施例对计算机设备的具体形式不作任何限制。例如,计算机设备具体可以是终端装置,也可以是网络设备。其中,终端装置可以被称为:终端、用户设备(user equipment,ue)、终端设备、接入终端、用户单元、用户站、移动站、远方站、远程终端、移动设备、用户终端、无线通信设备、用户代理或用户装置等。终端装置具体可以是手机、增强现实(augmented reality,ar)设备、虚拟现实(virtual reality,vr)设备、平板电脑、笔记本电脑、超级移动个人计算机(ultra-mobile personal computer,umpc)、上网本、个人数字助理(personal digital assistant,pda)等。网络设备具体可以是服务器等。其中,服务器可以是一个物理或逻辑服务器,也可以是有两个或两个以上分担不同职责的物理或逻辑服务器、相互协同来实现服
务器的各项功能。
60.在硬件实现上,上述计算机设备可以通过如图4所示的计算机设备实现。如图4所示,为本技术实施例提供的一种计算机设备400的硬件结构示意图。计算机设备400可以用于实现上述计算机设备的功能。
61.图4所示的计算机设备400可以包括:处理器401、存储器402、通信接口403以及总线404。处理器401、存储器402以及通信接口403之间可以通过总线404连接。
62.处理器401是计算机设备400的控制中心,可以是一个通用中央处理单元(central processing unit,cpu),也可以是其他通用处理器等。其中,通用处理器可以是微处理器或者是任何常规的处理器等。
63.作为示例,处理器401可以包括一个或多个cpu,例如图4中所示的cpu 0和cpu 1。
64.存储器402可以是只读存储器(read-only memory,rom)或可存储静态信息和指令的其他类型的静态存储设备,随机存取存储器(random access memory,ram)或者可存储信息和指令的其他类型的动态存储设备,也可以是电可擦可编程只读存储器(electrically erasable programmable read-only memory,eeprom)、磁盘存储介质或者其他磁存储设备、或者能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。
65.一种可能的实现方式中,存储器402可以独立于处理器401存在。存储器402可以通过总线404与处理器401相连接,用于存储数据、指令或者程序代码。处理器401调用并执行存储器402中存储的指令或程序代码时,能够实现本技术实施例提供的数据处理方法。
66.另一种可能的实现方式中,存储器402也可以和处理器401集成在一起。
67.通信接口403,用于计算机设备400与其他设备通过通信网络连接,该通信网络可以是以太网,无线接入网(radio access network,ran),无线局域网(wireless local area networks,wlan)等。通信接口403可以包括用于接收数据的接收单元,以及用于发送数据的发送单元。
68.总线404,可以是工业标准体系结构(industry standard architecture,isa)总线、外部设备互连(peripheral component interconnect,pci)总线或扩展工业标准体系结构(extended industry standard architecture,eisa)总线等。该总线可以分为地址总线、数据总线、控制总线等。为便于表示,图4中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
69.需要指出的是,图4中示出的结构并不构成对计算机设备400的限定,除图4所示部件之外,计算机设备400可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
70.在一种可能的实现方式中,如图5所示,算子开发框架包括算子编程层、代码解析层、拓扑存储层以及算子运行层。
71.算子编程层,用于直接与用户(即算子开发人员)进行交互,用于获取用户编写的自定义算子的源代码。其中,源代码是用户根据从算子编程层的基础算子调用接口库中获取的基础算子调用接口,以及自定义算子的计算逻辑编写的。
72.代码解析层,用于解析用户编写的自定义算子的源代码,从而得到源代码中的多个基础算子的调用接口之间的拓扑关系以及每个基础算子的参数信息。
73.拓扑存储层,用于将多个基础算子的调用接口之间的拓扑关系以及每个基础算子的参数信息保存到拓扑结构文件中,并将拓扑结构文件传递到算子运行层。
74.算子运行层,用于根据拓扑结构文件中的信息,调用硬件平台的算子库中基础算子,同时按照拓扑结构文件中的参数信息填充基础算子的参数,从而运行自定义算子,实现自定义算子的功能。
75.如图6所示,为本技术提供的一种数据处理方法的流程图,该方法用于算子开发框架。该方法包括:
76.s601:获取自定义算子的源代码,自定义算子包括至少两个基础算子;待执行自定义算子的目标硬件平台的算子库中预先存储有至少两个基础算子。
77.其中,基础算子是多个硬件平台通用的基础算子,多个硬件平台包括目标硬件平台。例如,基础算子可以是加(add)、减(sub)、乘(mul)、除(div)以及激活算子(relu)等。
78.可选地,硬件平台至少包括图形处理器(graphics processing unit,gpu)平台,数字信号处理(digital signal processing,dsp)平台以及处理器(advanced risc machine,arm)、特殊应用集成电路(application specific integrated circuit,asic)专用加速器平台。
79.在一种实施方式中,神经网络模型包括多个算子,该神经网络模型在目标硬件平台运行前,需要先对神经网络模型的多个算子进行分析,以确定目标硬件平台不支持运行的算子,例如,可以由用户进行人工分析,或者由计算机设备进行自动分析。其中,目标硬件平台不支持运行算子,即为用户需要开发的自定义算子。
80.可选地,算子开发框架包括预先配置的基础算子调用接口库,基础算子调用接口库包括多个硬件平台通用的基础算子的调用接口。
81.在一种实施方式中,如图7所示,计算机设备预先对多个硬件平台的基础算子的调用接口进行封装,得到基础算子调用接口库,从而为用户提供大量的基础算子的调用接口。该基础算子调用接口库预先存储在算子开发框架的算子编程层,使得用户可以直接从基础算子调用接口库中调用基础算子的调用接口进行编程使用。由于基础算子调用接口库中的基础算子的调用接口,不受硬件平台的特性的影响,从而使得利用基础算子调用接口库中的基础算子的调用接口编写的源代码能够在多个硬件平台通用。
82.进一步地,基础算子调用接口库中的调用接口可以使用统一的编程语言进行调用,例如,python、c或c++等通用编程语言。用户使用通用编程语言进行编程,调用基础算子调用接口库中的基础算子的调用接口,编写自定义算子的源代码。
83.需要说明的,由于不同的硬件平台对于基础算子的参数个数需求基本一致,例如,不同硬件平台的加法算子的输入都是两个参数,因此,通过对硬件平台的基础算子调用接口进行统一封装,得到的基础算子调用接口库适用于多个硬件平台。
84.可选地,获取自定义算子的源代码,包括:获取基于算子调用接口库生成的自定义算子的源代码,源代码包括至少两个基础算子的调用接口。由于至少两个基础算子的调用接口是各个硬件平台通用的,从而实现通过多个硬件平台通用的基础算子的调用接口组合得到自定义算子,进而实现自定义算子能够在各平台通用,也即,实现了自定义算子的“白盒”化,提高了自定义算子的开发效率,降低了自定义算子的开发难度。
85.在一种实施方式中,用户调用基础算子调用接口库中的基础算子的调用接口进行
编程,得到自定义算子的源代码。例如,通过调用基础算子1的调用接口、基础算子2的调用接口、基础算子3的调用接口和基础算子4的调用接口编写自定义算子的源代码,该自定义算子包括基础算子1、基础算子2、基础算子3和基础算子4。进一步地,用户完成自定义算子的源代码的编写后,算子开发框架的算子编程层获取到该自定义算子的源代码。
86.需要说明的,使用本技术的数据处理方法进行自定义算子的开发,用户只需进行自定义算子的源代码的编写,后续的其他步骤全部由算子开发框架完成。
87.在该方案中,由于自定义算子的源代码是通过调用基础算子的调用接口编写而成,从而实现通过基础算子组合得到自定义算子,并且,由于基础算子的调用接口是多个硬件平台通用的,因此,自定义算子的源代码适用于多个硬件平台,进而实现了为用户提供多硬件平台通用的自定义算子的源代码。
88.可选地,源代码还包括目标硬件平台的平台标识。数据处理方法还包括:获取运行目标硬件平台的平台标识。
89.在一种实施方式中,用户编写完自定义算子的源代码后,指定运行自定义算子的目标硬件平台,例如,可以通过在源代码中写入该目标硬件平台的平台标识,也即,源代码还包括目标硬件平台的平台标识,从而使得算子开发框架能够获取到该目标硬件平台的平台标识。
90.例如,目标硬件平台a需要使用自定义算子,用户在编写自定义算子的源代码时,在该源代码中写入目标硬件平台a的平台标识a。
91.需要说明的,由于自定义算子的源代码是多个硬件平台通用的,因此,在源代码中写入平台标识a后,当目标硬件平台b需要使用自定义算子的源代码时,用户只需将源代码中的平台标识a修改为目标硬件平台b的平台标识b即可,其他部分不需要改动。因此,在自定义算子的源代码中写入目标硬件平台的平台标识,并不会影响自定义算子的源代码的通用性。
92.通过在源代码中配置平台标识,从而指定用于运行自定义算子的目标硬件平台,有助于自定义算子的拓扑结构文件能够准确传输至目标硬件平台,进而保证目标硬件平台能够顺利运行自定义算子。
93.s602:解析源代码,得到自定义算子的拓扑结构文件,拓扑结构文件用于指示目标硬件平台执行自定义算子时从算子库中调用至少两个基础算子,以及至少两个基础算子的计算逻辑。
94.可选地,解析源代码,得到自定义算子的拓扑结构文件,包括:解析源代码,得到至少两个基础算子的调用接口之间的拓扑关系。其中,至少两个基础算子的调用接口,用于目标硬件平台执行自定义算子时,从算子库中调用至少两个基础算子。
95.可选地,拓扑关系用于表征至少两个基础算子的调用接口对应的至少两个基础算子之间的计算逻辑或执行顺序。例如,拓扑关系可以是基础算子1

基础算子3

基础算子2

基础算子4,也即,先执行基础算子1,基础算子3次之,基础算子2再次,最后执行基础算子4。
96.在一种实施方式中,拓扑结构文件包括至少两个算子基础算子的调用接口之间的拓扑关系。用户基于基础算子调用接口库中的至少两个基础算子的调用接口编写自定义算子的源代码,算子开发框架在解析源代码时,得到自定义算子的拓扑结构文件,也即,得到
至少两个算子基础算子的调用接口之间的拓扑关系。其中,至少两个算子基础算子的调用接口,用于指示目标硬件平台从算子库中调用至少两个基础算子以及至少两个基础算子调用路径,拓扑关系用于指示至少两个基础算子的计算逻辑,从而使得拓扑结构文件能够指示目标硬件平台执行自定义算子时从算子库中调用至少两个基础算子,以及至少两个基础算子的计算逻辑。
97.本技术中,基础算子调用接口库包括多个硬件平台通用的基础算子的调用接口,用户基于基础算子调用接口库中的基础算子的调用接口生成自定义算子的源代码。算子开发框架解析源代码得到至少两个基础算子的调用接口之间的拓扑关系,从而得到能够被多个硬件平台通用的至少两个算子基础算子的调用接口以及拓扑关系,也即,得到能够被多个硬件平台通用的拓扑结构文件。
98.可选地,拓扑结构文件还包括每个基础算子的参数信息,也即,算子开发框架在解析元代时,还会得到每个基础算子的参数信息。参数信息用于确定目标硬件平台调用的至少两个基础算子的参数。通过设置拓扑结构文件包括参数信息,能够保证在至少两个基础算子配置有参数的情况下,避免缺少至少两个基础算子的参数,从而保证每个基础算子的准确性,进而保证自定义算子的准确性。
99.在一种实施方式中,目标硬件平台在基于拓扑结构文件执行自定义算子时,先基于拓扑关系中的至少两个基础算子的调用接口,从自带的算子库中调用至少两个基础算子,并基于每个基础算子的参数信息对至少两个基础算子进行参数填充,之后再基于拓扑关系指示的至少两个基础算子之间的计算逻辑或执行顺序,执行至少两个基础算子,从而实现运行自定义算子。
100.在一种实施方式中,如图8所示,算子开发框架的算子编程层获取到源代码,算子开发框架的拓扑解析层对源代码进行拓扑解析,得到至少两个基础算子的调用接口之间的拓扑关系和每个基础算子的参数信息。
101.在一个示例中,算子开发框架的算子编程层获取到该自定义算子的源代码后,算子开发框架的代码解析层自动对源代码进行解析,得到至少两个基础算子的调用接口之间的拓扑关系和每个基础算子的参数信息。
102.在另一个示例中,算子编程层获取到该自定义算子的源代码后,需要用户调用算子编译指令启动代码解析层,使得代码解析层开始对源代码进行解析,得到至少两个基础算子的调用接口之间的拓扑关系和每个基础算子的参数信息。
103.在一种实施方式中,如图9中(a)所示,用户调用基础算子调用接口库中的基础算子的调用接口op1、op2、op3、op4、op5、op6进行编程,得到自定义算子的源代码,算子开发框架对源代码进行拓扑解析,得到如图9中(b)所示的前述多个基础算子调用接口之间的拓扑关系,以及每个基础算子的参数信息。在这个过程中,由于使用的是,python、c或c++等通用编程语言,用户不需要熟悉其他的算子开发编程语法,并且,由于是通过调用基础算子调用接口库中的基础算子的调用接口进行编程,用户无需掌握任何硬件平台的特性,只需了解组成自定义算子的各个基础算子的计算逻辑即可,开发难度低,工作量小,开发效率高。
104.在一种实施方式中,当新的硬件平台需要使用已开发的自定义算子,只需将该新的硬件平台的基础算子调用接口与基础算子调用接口库进行匹配,无需开发该新的硬件平台的代码生成后端,也无需修改自定义算子的生成逻辑,原有的自定义算子的源代码依然
有用,真正的实现了一套源代码多硬件平台复用的有益效果。
105.在一种实施方式中,以gelu(高斯误差线性单元)算子开发为例进行说明,其中,gelu是一个非初等函数形式的激活函数,是relu的变种,其计算公式如下:
[0106][0107]
其中,gelu、relu以及elu的算子函数图像如图10所示。
[0108]
gelu是深度学习算法中一种新型激活函数,不属于常见的深度学习算子,目前很少有硬件平台支持该类算子的运行,因此需要手动开发该算子。如果按照现有技术中的算子开发方案,需要熟悉算子开发编程语法,以使用开发框架提高的算子指令集进行该算子的开发,并且,还需要了解硬件平台的硬件特性,以针对不同的硬件平台进行不同策略的调度优化,开发难度比较大。
[0109]
然而,使用本技术的数据处理方法开发该算子时,算子开发人员直接调用基础算子调用接口库中的基础算子的调用接口进行编程,例如,编写如下所示的gelu的源代码,并输入到算子开发框架的算子编程模块,即可完成该算子的开发。算子开发框架的代码解析模块对gelu的源代码进行解析,得到如图11所示的拓扑关系,以及每个基础算子的参数信息,例如,b=multiply(a,0.044715)中multiply算子的参数信息为0.044715。可以看出,整个算子开发过程无需了解硬件平台的任何硬件特性,开发难度显著下降。同时,本技术提出的算子开发方法语法非常简单,直接调用基础算子调用接口库中的基础算子调用接口进行编程,开发效率非常高。
[0110]
其中,在图11中,power表征开方算子的调用接口,mul表征乘法算子的调用的接口,add表征加法算子的调用接口,tanh表征双曲正切算子的调用接口。
[0111]
gelu的源代码如下所示:
[0112]
def grelu_demo(a):
[0113]
a=power(a,3)
[0114]
b=multiply(a,0.044715)
[0115]
c=add(a,b)
[0116]
d=multiply(c,0.797884)
[0117]
e=tanh(d)
[0118]
f=add(e,1)
[0119]
g=multiply(f,a)
[0120]
h=multiply(g,0.5)
[0121]
return h
[0122]
上述实施例中,通过为用户提供基础算子调用接口库,使得用户无需掌握硬件平台的特性,也无需熟悉算子开发编程语言,即可编写自定义算子的源代码,算子开发难度低,开发效率高。
[0123]
在一种实施方式中,算子开发框架在得到自定义算子的拓扑结构文件后,将该拓扑结构文件发送至算子运行层,例如,算子运行层可以是神经网络模型的推理框架,算子运行层调用目标硬件平台自带的算子库中的基础算子1、基础算子2、基础算子3和基础算子4,
按照拓扑结构文件中的参数信息填充基础算子参数,并基于拓扑结构文件中的拓扑关系(即基础算子1

基础算子3

基础算子2

基础算子4)依次执行四个基础算子,进而实现自定义算子的运行,也即,实现神经网络模型中目标硬件平台原本不支持运行的算子的运行。
[0124]
在一个示例中,代码解析层在得到至少两个基础算子的调用接口之间的拓扑关系和每个基础算子的参数信息后,将至少两个基础算子的调用接口之间的拓扑关系和每个基础算子的参数信息存储在拓扑结构文件中,并将拓扑结构文件发送至算子运行层,以供算子运行层使用。此外,代码解析层还可以将拓扑结构文件存储在代码解析层,由算子运行层主动调用。
[0125]
在一个示例中,在代码解析层从自定义算子的源代码中解析出至少两个基础算子的调用接口之间的拓扑关系和每个基础算子的参数信息后,拓扑存储层将至少两个基础算子的调用接口之间的拓扑关系和每个基础算子的参数信息存储至拓扑存储层的拓扑结构文件中,并将拓扑结构文件发送至算子运行层,以供算子运行层使用。此外,拓扑存储层还可以将拓扑结构文件存储在拓扑存储层,由算子运行层主动调用。
[0126]
在该方案中,数据处理方法屏蔽了底层硬件结构信息,不依赖任何硬件平台的硬件结构信息,通过生成能够指示目标硬件平台从算子库中调用至少两个基础算子以及至少两个基础算子的计算逻辑的拓扑结构文件,使得目标硬件平台根据拓扑结构文件即可运行自定义算子,从而不再需要基于不同硬件平台的特性为不同硬件平台生成不同的可执行代码,进而实现了高效开发多硬件平台通用的自定义算子。
[0127]
进一步地,由于不需要为每个硬件平台生成专有的可执行代码,算子开发框架不再需要配置每个硬件平台的代码生成层,从而实现了算子开发框架的轻量化,大大减少代码量,框架维护更加简单、方便。
[0128]
可选地,拓扑结构文件还包括平台标识,以指示目标硬件平台在运行自定义算子之前,获取拓扑结构文件。
[0129]
在一种实施方式中,算子开发框架通过解析源代码,获取平台标识,并将平台标识存储在拓扑结构文件中。
[0130]
在一种实施方式中,算子开发框架在解析源代码并得到拓扑结构文件后,将拓扑结构文件发送至与平台标识对应的目标硬件平台。例如,可以是算子开发框架的代码解析层或拓扑存储层将拓扑结构文件发送至与平台标识对应的目标硬件平台。
[0131]
在另一种实施方式中,算子运行层在运行自定义算子前,从算子开发框架获取拓扑结构文件,例如,从算子开发框架的代码解析层或拓扑存储层中获取。具体地,在获取拓扑结构文件时,算子运行层读取拓扑结构文件中的平台标识,以确定包括目标硬件平台的平台标识的拓扑结构文件,从而获取该拓扑结构文件。
[0132]
通过在拓扑结构文件中配置平台标识,有助于提高硬件平台设备获取拓扑结构文件时的准确性,使得硬件平台能够获取到与待执行的自定义算子对应的拓扑结构文件,从而保证了目标硬件平台能够顺利运行自定义算子。
[0133]
上述实施例中,通过使用多个硬件平台通用的基础算子组成自定义算子,使得自定义算子不受硬件平台的特性的影响,从而实现自定义算子可以适用于不同的硬件平台。进一步地,通过解析源代码得到自定义算子的拓扑结构文件,该拓扑结构文件可以指示目标硬件平台从自带的算子库中获取至少两个基础算子,并依照拓扑结构文件指示的计算逻
辑执行该至少两个基础算子,从而实现自定义算子的运行,进而实现了自定义算子的多硬件平台通用。进一步地,由于硬件平台基于拓扑结构文件和自身的算子库便可以执行自定义算子,因此,不必再为每一个硬件平台增加一个代码生成后端,大大降低了算子开发框架的代码量,框架维护简单。
[0134]
进一步地,由于硬件平台使用自身的算子库中的基础算子执行自定义算子,而自身算子库中的基础算子必然与平台契合度最高的,因此,不再需要针对每个硬件平台的特性设定自定义算子的调度优化模板,大大降低了工作量。
[0135]
在一种可能的实施方式中,数据处理方法还包括:
[0136]
在确定自定义算子中包括不属于算子库的目标算子的情况下,发出提示信息。
[0137]
其中,提示信息用于指示用户修改目标算子。
[0138]
可选地,提示信息包括目标算子。通过在提示信息中包括目标算子,有助于用户快速定位不属于算子库中的目标算子,而不必逐一排查自定义算子中算子,提高了效率。
[0139]
在一种实施方式中,确定自定义算子中包括的每个算子,例如,有算子1、算子2、算子3和算子4。并确定目标硬件平台的算子库中包括的基础算子,例如,有算子1、算子2和算子4,因此,算子3为不属于算子库中的目标算子,此时,计算机设备发出提示信息,以指示用于修改目标算子,也即,修改算子3。
[0140]
在另一种实施方式中,将自定义算子中包括的每个算子分别与目标硬件平台的算子库中的算子进行逐一匹配,在每个算子中包括与算子库中的算子不匹配的目标算子情况下,发出提示信息,以提示用户使用了不属于目标硬件平台的算子库中的算子组合自定义算子,从而保证自定义算子中的基础算子全部预先存储在目标硬件平台的算子库。
[0141]
上述实施例中,在确定自定义算子中包括不属于算子库的目标算子的情况下,发出提示信息,提示用户使用了不属于目标硬件平台的算子库中的算子组合自定义算子,进而指示用于修改该目标算子,从而避免目标硬件平台无法执行自定义算子。
[0142]
在一种可能的实施方式中,结合图6,如图12所示,数据处理方法还包括:
[0143]
s121:确定神经网络中的自定义算子。
[0144]
在一种实施方式中,如图13所示,神经网络模型运行前,在神经网络模型的推理阶段,神经网络模型的推理框架对神经网络模型的结构进行构图。在构图过程中,将硬件平台不支持运行的算子确定为自定义算子,例如,custom op。
[0145]
s122:获取预先存储的自定义算子的拓扑结构文件。
[0146]
在一种实施方式中,如图13所示,在确定自定义算子后,代码运行层获取预先存储的自定义算子的拓扑结构文件,自动解析该自定义算子的拓扑结构文件,得到组成该自定义算子的基础算子的调用接口之间的拓扑关系和每个基础算子的参数信息,进而根据拓扑关系和参数信息构建自定义算子的拓扑图,并根据自定义算子的拓扑图对神经网络模型进行重新构图。在完成神经网络模型的重新构图后,神经网络模型会进入图优化器进行图优化操作,最终调用硬件平台的算子库中的基础算子运行神经模型网络。
[0147]
s123:基于拓扑结构文件,从目标硬件平台的算子库调用至少两个基础算子,并基于拓扑结构文件指示的至少两个基础算子的计算逻辑,运行至少两个基础算子,以实现自定义算子的运行。
[0148]
在一种实施方式中,如图14所示,算子运行层在运行自定义算子时,从目标硬件平
台的算子库调用组成该自定义算子的基础算子。例如,目标硬件平台1运行自定义算子时,算子运行层从目标硬件平台1的算子库调用组成自定义算子的基础算子,目标硬件平台n运行自定义算子时,算子运行层从目标硬件平台n的算子库调用组成自定义算子的基础算子。
[0149]
上述实施例中,通过基于预先存储的自定义算子的拓扑结构文件,从目标硬件平台的算子库中调用基础算子,用于自定义算子的执行,从而实现对目标硬件平台底层驱动加速库的二次利用,进而实现极致利用目标硬件平台的性能。进一步地,由于执行自定义算子时,使用的是目标硬件平台自身的算子库中基础算子,相对于现有技术中的使用算子开发平台提供的算子,目标硬件平台自身的算子库中的基础算子与目标硬件平台的契合度更高,因此,执行的自定义算子的性能更优。
[0150]
上述主要从方法的角度对本技术实施例的方案进行了介绍。可以理解的是,计算机设备为了实现上述功能,其包含了执行各个功能相应的硬件结构和软件模块中的至少一个。本领域技术人员应该很容易意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,本技术能够以硬件或硬件和计算机软件的结合形式来实现。某个功能究竟以硬件还是计算机软件驱动硬件的方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本技术的范围。
[0151]
本技术实施例可以根据上述方法示例对数据处理装置进行功能单元的划分,例如,可以对应各个功能划分各个功能单元,也可以将两个或两个以上的功能集成在一个处理单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。需要说明的是,本技术实施例中对单元的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。
[0152]
示例性的,图15示出了上述实施例中所涉及的数据处理装置(记为数据处理装置1500)的一种可能的结构示意图,该数据处理装置1500包括算子编程单元1501和代码解析单元1502。算子编程单元,用于获取自定义算子的源代码,自定义算子包括至少两个基础算子;其中,待执行自定义算子的目标硬件平台的算子库中预先存储有至少两个基础算子,基础算子是多个硬件平台通用的基础算子,多个硬件平台包括目标硬件平台。例如,图6中所示的s601。代码解析单元,用于解析源代码,得到自定义算子的拓扑结构文件,拓扑结构文件用于指示目标硬件平台执行自定义算子时从算子库中调用至少两个基础算子,以及至少两个基础算子的计算逻辑。例如,图6中所示的s602。
[0153]
可选地,拓扑结构文件包括每个基础算子的参数信息,参数信息用于确定目标硬件平台调用的至少两个基础算子的参数。
[0154]
可选地,代码解析单元1502还用于:在确定自定义算子中包括不属于算子库的目标算子的情况下,发出提示信息;其中,提示信息用于指示用户修改目标算子。
[0155]
可选地,算子编程单元1501还用于:算子开发框架包括预先配置的基础算子调用接口库,基础算子调用接口库包括多个硬件平台通用的基础算子的调用接口;获取自定义算子的源代码,包括:获取基于算子调用接口库生成的自定义算子的源代码,源代码包括至少两个基础算子的调用接口;解析源代码,得到自定义算子的拓扑结构文件,包括:解析源代码,得到至少两个基础算子的调用接口之间的拓扑关系;至少两个基础算子的调用接口,用于目标硬件平台执行自定义算子时,从算子库中调用至少两个基础算子。
[0156]
可选地,源代码还包括目标硬件平台的平台标识,拓扑结构文件还包括平台标识,以指示目标硬件平台在运行自定义算子之前,获取拓扑结构文件。
[0157]
可选地,装置还包括算子运行单元1503,用于在解析源代码,得到自定义算子的拓扑结构文件之后,确定神经网络中的自定义算子;获取预先存储的自定义算子的拓扑结构文件;基于拓扑结构文件,从目标硬件平台的算子库调用至少两个基础算子,并基于拓扑结构文件指示的至少两个基础算子的计算逻辑,运行至少两个基础算子。
[0158]
关于上述可选方式的具体描述可以参见前述的方法实施例,此处不再赘述。此外,上述提供的任一种数据处理装置1500的解释以及有益效果的描述均可参考上述对应的方法实施例,不再赘述。
[0159]
作为示例,结合图4,数据处理装置中的算子编程单元1501和代码解析单元1502中的部分或全部实现的功能可以通过图4中的处理器401执行图4中的存储器402中的程序代码实现。
[0160]
本技术实施例还提供了一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,当该计算机程序在计算机上运行时,使得该计算机执行上文提供的任一种计算机设备所执行的方法。
[0161]
关于上述提供的任一种计算机可读存储介质中相关内容的解释及有益效果的描述,均可以参考上述对应的实施例,此处不再赘述。
[0162]
本技术实施例还提供了一种芯片。该芯片中集成了用于实现上述数据处理装置1500的功能的控制电路和一个或者多个端口。可选的,该芯片支持的功能可以参考上文,此处不再赘述。本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可通过程序来指令相关的硬件完成。所述的程序可以存储于一种计算机可读存储介质中。上述提到的存储介质可以是只读存储器,随机接入存储器等。上述处理单元或处理器可以是中央处理器,通用处理器、特定集成电路(application specific integrated circuit,asic)、微处理器(digital signal processor,dsp),现场可编程门阵列(field programmable gate array,fpga)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。
[0163]
本技术实施例还提供了一种包含指令的计算机程序产品,当该指令在计算机上运行时,使得计算机执行上述实施例中的任意一种方法。该计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行计算机程序指令时,全部或部分地产生按照本技术实施例的流程或功能。计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,计算机指令可以从一个网站站点、计算机、服务器或者数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可以用介质集成的服务器、数据中心等数据存储设备。可用介质可以是磁性介质(例如,软盘、硬盘、磁带),光介质(例如,dvd)、或者半导体介质(例如ssd)等。
[0164]
应注意,本技术实施例提供的上述用于存储计算机指令或者计算机程序的器件,例如但不限于,上述存储器、计算机可读存储介质和通信芯片等,均具有非易失性(non-transitory)。
[0165]
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件程序实现时,可以全部或部分地以计算机程序产品的形式来实现。该计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行计算机程序指令时,全部或部分地产生按照本技术实施例的流程或功能。计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,计算机指令可以从一个网站站点、计算机、服务器或者数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可以用介质集成的服务器、数据中心等数据存储设备。可用介质可以是磁性介质(例如,软盘、硬盘、磁带),光介质(例如,dvd)、或者半导体介质(例如固态硬盘(solid state disk,ssd))等。
[0166]
尽管在此结合各实施例对本技术进行了描述,然而,在实施所要求保护的本技术过程中,本领域技术人员通过查看附图、公开内容、以及所附权利要求书,可理解并实现公开实施例的其他变化。在权利要求中,“包括”(comprising)一词不排除其他组成部分或步骤,“一”或“一个”不排除多个的情况。单个处理器或其他单元可以实现权利要求中列举的若干项功能。相互不同的从属权利要求中记载了某些措施,但这并不表示这些措施不能组合起来产生良好的效果。
[0167]
尽管结合具体特征及其实施例对本技术进行了描述,显而易见的,在不脱离本技术的精神和范围的情况下,可对其进行各种修改和组合。相应地,本说明书和附图仅仅是所附权利要求所界定的本技术的示例性说明,且视为已覆盖本技术范围内的任意和所有修改、变化、组合或等同物。显然,本领域的技术人员可以对本技术进行各种改动和变型而不脱离本技术的精神和范围。这样,倘若本技术的这些修改和变型属于本技术权利要求及其等同技术的范围之内,则本技术也意图包含这些改动和变型在内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1