深度学习模型的执行代码的确定方法、装置及存储介质
文献发布时间:2023-06-19 11:35:49
技术领域
本申请涉及数据处理技术领域,特别涉及一种深度学习模型的执行代码的确定方法、装置及存储介质。
背景技术
随着数据处理技术的快速发展,深度学习模型广泛应用于计算机视觉、自然语言处理等领域。一般来说,深度学习模型的源代码无法适用于不同类型的硬件平台,为此在使用过程中通常需要将深度学习模型的源代码转换为中间代码,再基于具体的硬件平台的配置文件,将中间代码转换为该硬件平台的可执行代码,得到可运行于硬件平台中的深度学习模型的执行代码。
然而,上述提供的代码转换过程是按照固定模式进行的,深度学习模型的执行代码的确定方式比较单一,使得深度学习模型的执行代码的运行效率较差。
发明内容
本申请提供了一种深度学习模型的执行代码的确定方法、装置、设备及存储介质,可以解决相关技术的深度学习模型的执行代码的运行效率较差的问题。
所述技术方案如下:
一方面,提供了一种深度学习模型的执行代码的确定方法,所述方法包括:
基于深度学习模型的中间代码的数据处理方式,确定所述中间代码对应的至少一个预处理中间代码,所述数据处理方式包括数据重复使用和/或数据不重复使用,所述至少一个预处理中间代码互不相同;
将每个预处理中间代码转换成可执行代码,得到至少一个可执行代码;
从所述至少一个可执行代码中确定所述深度学习模型的执行代码。
在本申请一种可能的实现方式中,所述方法应用于目标检测、目标跟踪、语义分割、语音识别、文字识别、自然语言处理中的任一场景。
在本申请一种可能的实现方式中,所述中间代码包括多个中间代码块,每个中间代码块分别用于处理不同的张量数据,所述基于深度学习模型的中间代码的数据处理方式,确定所述中间代码对应的至少一个预处理中间代码,包括:
将所述中间代码作为一个预处理中间代码;和/或,
基于各个中间代码块的数据处理方式,对所述多个中间代码块中的至少一个中间代码块进行缓存优化处理;
将缓存优化处理后的至少一个中间代码块和未进行缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
在本申请一种可能的实现方式中,所述基于各个中间代码块的数据处理方式,对所述多个中间代码块中的至少一个中间代码块进行缓存优化处理,包括:
当所述多个中间代码块的数据处理方式均包括数据不重复使用时,对所述多个中间代码块中的至少一个中间代码块进行双缓存优化处理;
所述将缓存优化处理后的至少一个中间代码块和未进行缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码,包括:
将双缓存优化处理后的至少一个中间代码块和未进行双缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
在本申请一种可能的实现方式中,所述基于各个中间代码块的数据处理方式,对所述多个中间代码块中的至少一个中间代码块进行缓存优化处理,包括:
当所述多个中间代码块中的部分中间代码块的数据处理方式包括数据重复使用,以及所述多个中间代码块中的部分中间代码块的数据处理方式包括数据不重复使用时,对所述多个中间代码块中数据处理方式包括数据不重复使用的至少一个中间代码块进行双缓存优化处理,以及对所述多个中间代码块中数据处理方式包括数据重复使用的至少一个中间代码块进行环形缓存优化处理;
所述将缓存优化处理后的至少一个中间代码块和未进行缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码,包括:
将双缓存优化处理后的至少一个中间代码块、环形缓存优化处理后的至少一个中间代码块和未进行缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
在本申请一种可能的实现方式中,所述基于各个中间代码块的数据处理方式,对所述多个中间代码块中的至少一个中间代码块进行缓存优化处理,包括:
当所述多个中间代码块的数据处理方式均包括数据重复使用时,对所述多个中间代码块中的至少一个中间代码块进行环形缓存优化处理;
所述将缓存优化处理后的至少一个中间代码块和未进行缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码,包括:
将环形缓存优化处理后的至少一个中间代码块和未进行环形缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
在本申请一种可能的实现方式中,所述从所述至少一个可执行代码中确定所述深度学习模型的执行代码,包括:
基于待测试张量数据,确定每个可执行代码的执行性能指标;
基于每个可执行代码的执行性能指标,从所述至少一个可执行代码中确定所述深度学习模型的执行代码。
在本申请一种可能的实现方式中,对所述中间代码中的一个中间代码块进行双缓存优化处理的操作包括如下步骤:
更改语法树中的部分节点信息,以使更改后的一个中间代码块支持如下操作:
交替缓存输入数据至两个输入缓存中,并在每次缓存数据的同时使用所述两个输入缓存中当前未执行缓存操作的输入缓存内进行计算处理;
记录输入的第一个数据在所述两个输入缓存中的缓存位置;
交替将计算处理后的数据缓存至两个输出缓存中,并在每次缓存的同时输出所述两个输出缓存中当前未执行缓存操作的输出缓存内的数据;
其中,所述语法树用于指示所述一个中间代码块的运行逻辑,所述语法树中的每个节点信息用于指示所述一个中间代码块的一个运行步骤。
在本申请一种可能的实现方式中,对所述中间代码中的一个中间代码块进行环形缓存优化处理的操作包括如下步骤:
更改语法树中的部分节点信息,以使更改后的一个中间代码块支持如下操作:
对输入数据进行环形缓存处理;
交替缓存经过环形缓存处理后的数据至两个输出缓存中,并在每次缓存的同时输出所述两个输出缓存中当前未执行缓存操作的输出缓存内的数据;
其中,所述语法树用于指示所述一个中间代码块的运行逻辑,所述语法树中的每个节点信息用于指示所述一个中间代码块的一个运行步骤。
另一方面,提供了一种深度学习模型的执行代码的确定装置,所述装置包括:
第一确定模块,用于基于深度学习模型的中间代码的数据处理方式,确定所述中间代码对应的至少一个预处理中间代码,所述数据处理方式包括数据重复使用和/或数据不重复使用,所述至少一个预处理中间代码互不相同;
转换模块,用于将每个预处理中间代码转换成可执行代码,得到至少一个可执行代码;
第二确定模块,用于从所述至少一个可执行代码中确定所述深度学习模型的执行代码。
在本申请一种可能的实现方式中,所述装置应用于目标检测、目标跟踪、语义分割、语音识别、文字识别、自然语言处理中的任一场景。
在本申请一种可能的实现方式中,所述中间代码包括多个中间代码块,每个中间代码块分别用于处理不同的张量数据,所述第一确定模块用于:
将所述中间代码作为一个预处理中间代码;和/或,
基于各个中间代码块的数据处理方式,对所述多个中间代码块中的至少一个中间代码块进行缓存优化处理;
将缓存优化处理后的至少一个中间代码块和未进行缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
在本申请一种可能的实现方式中,所述第一确定模块用于:
当所述多个中间代码块的数据处理方式均包括数据不重复使用时,对所述多个中间代码块中的至少一个中间代码块进行双缓存优化处理;
将双缓存优化处理后的至少一个中间代码块和未进行双缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
在本申请一种可能的实现方式中,所述第一确定模块用于:
当所述多个中间代码块中的部分中间代码块的数据处理方式包括数据重复使用,以及所述多个中间代码块中的部分中间代码块的数据处理方式包括数据不重复使用时,对所述多个中间代码块中数据处理方式包括数据不重复使用的至少一个中间代码块进行双缓存优化处理,以及对所述多个中间代码块中数据处理方式包括数据重复使用的至少一个中间代码块进行环形缓存优化处理;
将双缓存优化处理后的至少一个中间代码块、环形缓存优化处理后的至少一个中间代码块和未进行缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
在本申请一种可能的实现方式中,所述第一确定模块用于:
当所述多个中间代码块的数据处理方式均包括数据重复使用时,对所述多个中间代码块中的至少一个中间代码块进行环形缓存优化处理;
将环形缓存优化处理后的至少一个中间代码块和未进行环形缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
在本申请一种可能的实现方式中,所述第二确定模块用于:
基于待测试张量数据,确定每个可执行代码的执行性能指标;
基于每个可执行代码的执行性能指标,从所述至少一个可执行代码中确定所述深度学习模型的执行代码。
在本申请一种可能的实现方式中,第一确定模块用于:
更改语法树中的部分节点信息,以使更改后的一个中间代码块支持如下操作:
交替缓存输入数据至两个输入缓存中,并在每次缓存数据的同时使用所述两个输入缓存中当前未执行缓存操作的输入缓存内进行计算处理;
记录输入的第一个数据在所述两个输入缓存中的缓存位置;
交替将计算处理后的数据缓存至两个输出缓存中,并在每次缓存的同时输出所述两个输出缓存中当前未执行缓存操作的输出缓存内的数据;
其中,所述语法树用于指示所述一个中间代码块的运行逻辑,所述语法树中的每个节点信息用于指示所述一个中间代码块的一个运行步骤。
在本申请一种可能的实现方式中,第一确定模块用于:
更改语法树中的部分节点信息,以使更改后的一个中间代码块支持如下操作:
对输入数据进行环形缓存处理;
交替缓存经过环形缓存处理后的数据至两个输出缓存中,并在每次缓存的同时输出所述两个输出缓存中当前未执行缓存操作的输出缓存内的数据;
其中,所述语法树用于指示所述一个中间代码块的运行逻辑,所述语法树中的每个节点信息用于指示所述一个中间代码块的一个运行步骤。
另一方面,提供了一种电子设备,所述电子设备包括处理器、通信接口、存储器和通信总线,所述处理器、所述通信接口和所述存储器通过所述通信总线完成相互间的通信,所述存储器用于存放计算机程序,所述处理器用于执行所述存储器上所存放的程序,以实现上述所述一方面所述的深度学习模型的执行代码的确定方法的步骤。
另一方面,提供了一种计算机可读存储介质,所述存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现上述所述一方面所述的深度学习模型的执行代码的确定方法的步骤。
本申请提供的技术方案至少可以带来以下有益效果:
深度学习模型的中间代码的数据处理方式可以包括数据重复使用和/或数据不重复使用,根据中间代码的数据处理方式不同可以确定该中间代码对应的至少一个互不相同的预处理中间代码。将每个预处理中间代码转换成可执行代码,可以得到至少一个可执行代码,如此即可从该至少一个可执行代码中确定一个运行效率较高的深度学习模型的执行代码,避免只能按照固定模式确定深度学习模型的执行代码的问题。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请实施例提供的一种深度学习模型的执行代码的确定方法的流程图;
图2是本申请实施例提供的一种双缓存优化处理的示意图;
图3是本申请实施例提供的另一种双缓存优化处理的示意图;
图4是本申请实施例提供的另一种双缓存优化处理的示意图;
图5是本申请实施例提供的另一种双缓存优化处理的示意图;
图6是本申请实施例提供的一种环形缓存优化处理的示意图;
图7是本申请实施例提供的另一种环形缓存优化处理的示意图;
图8是本申请实施例提供的一种深度学习模型的执行代码的确定装置的结构示意图;
图9是本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
在对本申请实施例提供的深度学习模型的执行代码的确定方法进行详细的解释说明之前,先对本申请实施例提供的相关术语、执行主体和应用场景进行介绍。
首先,对本申请实施例涉及的相关术语进行简单介绍。
深度学习编译器:可以用于对深度学习模型的源代码进行转换等处理,以得到能够应用于具体硬件平台的可执行代码。进一步地,该深度学习编译器可以用于进行代码优化处理,使得输出的深度学习模型的执行代码的运行效率更高。
中间代码:或称IR(Intermediate Representation,中间表示)、也可以被称为中间表达式或中间语言,是一个在计算机行业中广泛使用的术语,它指的是易于被转换为可执行代码,可以等效替代源代码的内部表示代码。
语法树:语法树是代码结构的图形表示,它表示了代码的运算逻辑。
节点:节点是语法树中用来表示运算关系的点。
缓存优化:缓存优化是对代码做的一种优化,可以使数据搬移和数据计算并行,达到隐藏访存时间,提高芯片利用率的效果。
双缓冲优化处理:双缓冲优化处理是对代码进行的一种处理方式,使其可以实现通过两片缓存并行处理数据。
环形缓存优化处理:环形缓存优化处理是对代码进行的一种处理方式,使其可以实现数据的复用。
DSP(Digital Signal Processing,数字信号处理器):一种通用芯片,常被用作信号处理与图像处理。
接下来,对本申请实施例涉及的执行主体进行简单介绍。
本申请实施例提供的深度学习模型的执行代码的确定方法可以由电子设备来执行,该电子设备中可以设有深度学习编译器,该电子设备可以通过该深度学习编译器来实现该深度学习模型的执行代码的确定方法。作为一种实例,该电子设备可以为笔记本电脑、便携式计算机、台式计算机等,本申请实施例对此不做限定。
为了便于理解,接下来针对深度学习编译器的大体工作过程进行介绍,深度学习编译器的工作过程一般包括以下几步:
1、词法分析,也就是对由字符组成的单词进行处理,从左至右逐个字符地对源代码进行扫描,产生一个个的单词符号。
2、语法分析,以单词符号作为输入,分析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,按该语言使用的语法规则分析检查每条语句是否有正确的逻辑结构。
3、语义检查和中间代码生成,中间代码是源代码的一种内部表示。中间代码可以使得代码结构在逻辑上更为简单明确。
4、代码优化,代码优化是指对中间代码进行等价变换,使得变换后中间代码生成的可执行代码运行效率更高,即使得可执行代码的运行时间更短,以及占用的存储空间更小。在本申请实施例中,该步骤为可选步骤。
5、可执行代码生成,可执行代码生成是编译的最后一个阶段。把语法分析后或优化后的中间代码转换成可执行代码。
然后,对本申请实施例涉及的应用场景进行简单介绍。
本申请实施例提供的深度学习模型的执行代码的确定方法可以应用于目标检测、目标跟踪、语义分割、语音识别、文字识别、自然语言处理等任一场景下的深度学习模型的加速运算。
在介绍完本申请实施例涉及的相关术语和执行主体后,接下来将结合附图对本申请实施例提供的深度学习模型的执行代码的确定方法进行详细介绍。
请参考图1,图1是本申请实施例提供的一种深度学习模型的执行代码的确定方法的流程图,该方法可以由上述执行主体来实现,该方法可以包括如下几个实现步骤。
步骤101:基于深度学习模型的中间代码的数据处理方式,确定该中间代码对应的至少一个预处理中间代码,该数据处理方式包括数据重复使用和/或数据不重复使用,该至少一个预处理中间代码互不相同。
其中,深度学习模型可以为在硬件平台中通过训练得到的模型,硬件平台可以为ARM(Advanced RISC Machine,第一款RISC(Reduced Instruction Set Computing,精简指令集运算)微处理器)、DSP等,深度学习模型可以为Caffe、TensorFlow、PyTorch等,本实施例对此不做限定。
在本实施例中,数据处理方式包括数据重复使用和/或数据不重复使用,也就是说数据处理方式可以包括数据重复使用,也可以包括数据不重复使用,还可以包括数据重复使用和数据不重复使用。其中,数据重复使用指的是在该中间代码被实际运行(或者可以理解为该中间代码对应的可执行代码在运行)时,一个输入数据可能被用于多次运算,也就是会对一个输入数据进行多次处理。数据不重复使用指的是在该中间代码被实际运行时,每个输入数据只被用于一次运算,也就是对每个输入数据只进行一次处理。
一般来说,深度学习模型的源代码无法适用于不同类型的硬件平台。为此,当需要在具体的硬件平台中运行该深度学习模型时,通常可以将该深度学习模型的源代码先转换为中间代码,也就是转换为等效于源代码的一种内部表示代码。得到中间代码之后,可以对该中间代码做进一步的处理,以生成预处理中间代码。
在本实施例中,可以根据中间代码的数据处理方式不同,确定该中间代码对应的至少一个互不相同的预处理中间代码,作为一种示例,其具体实现可以包括:当中间代码包括多个中间代码块,每个中间代码块分别用于处理不同的张量数据时,将该中间代码作为一个预处理中间代码。和/或,基于各个中间代码块的数据处理方式,对该多个中间代码块中的至少一个中间代码块进行缓存优化处理。将缓存优化处理后的至少一个中间代码块和未进行缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
也即是,该中间代码可以包括多个中间代码块,该多个中间代码块可以用于对多个张量数据进行并行处理,这里以中间代码中包括多个中间代码块为例,对确定中间代码对应的至少一个预处理中间代码的过程进行介绍。
其中,输入数据一般是以张量数据的形式存在的,在本实施例中,张量数据可以被认为是一种三维的数据集合,每次的输入数据可以为数据集合中的一行数据,也可以为数据集合中的一个数据。
在中间代码块的数据处理方式不同的情况下,得到的至少一个预处理中间代码可以分为两类。第一类是对中间代码中所有中间代码块都不进行缓存优化处理,即直接将该中间代码作为一个预处理中间代码。第二类是对中间代码的多个中间代码块中的部分中间代码块进行缓存优化处理,以及其他部分中间代码块不进行缓存优化处理,将处理后的中间代码作为预处理中间代码,其中,每个中间代码块可以进行缓存优化处理的方式可以有一种,也可以有多种,如此,第二类预处理中间代码也就相应的可以有一种,也可以有多种。
所以,该至少一个预处理中间代码可以包括第一类预处理中间代码,也可以包括第二类预处理中间代码中的任一种或多种,还可以包括第一类预处理中间代码和第二类预处理中间代码中的任一种或多种。
譬如,当中间代码包括两个中间代码块a和b,缓存优化处理的方式分为1、2两种时。可以直接将该中间代码作为一个预处理中间代码。按照缓存优化处理1对中间代码块a进行缓存优化处理,以及按照缓存优化处理1对中间代码块b进行缓存优化处理,将处理后的中间代码作为一个预处理中间代码。按照缓存优化处理1对中间代码块a进行缓存优化处理,以及按照缓存优化处理2对代码块b进行缓存优化处理,将处理后的中间代码作为一个预处理中间代码。按照缓存优化处理1对中间代码块a进行缓存优化处理,不对中间代码块b进行缓存优化处理,将仅对中间代码块a进行缓存优化处理的中间代码作为一个预处理中间代码,等等,如此可以得到多个第二类的预处理中间代码。
作为一种示例,上述缓存优化处理方式可以包括双缓存优化处理和环形缓存优化处理,此时,对于中间代码包括多个中间代码块的情况,确定该中间代码对应的至少一个预处理中间代码可以包括如下几种具体实现方式:
第一种实现方式:基于各个中间代码块的数据处理方式,对该多个中间代码块中的至少一个中间代码块进行缓存优化处理的具体实现方式可以为:当该多个中间代码块的数据处理方式均包括数据不重复使用时,对该多个中间代码块中的至少一个中间代码块进行双缓存优化处理。相应地,该将缓存优化处理后的至少一个中间代码块和未进行缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码的具体实现方式可以为:将双缓存优化处理后的至少一个中间代码块和未进行双缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
当多个中间代码块的数据处理方式均为数据不重复使用时,当需要对中间代码中的至少一个中间代码块进行缓存优化处理时,可以进行双缓存优化处理,然后再确定第二类的预处理中间代码块。譬如,当中间代码中包括两个中间代码块a和中间代码块b时,可以对中间代码块a进行双缓存优化处理以及对中间代码块b进行双缓存优化处理,将处理后的中间代码作为一个第二类预处理中间代码。进一步地,可以仅对中间代码块a进行双缓存优化处理,然后将经过双缓存优化处理后的中间代码块a和未经过双缓存优化处理的中间代码块b组成的中间代码作为一个第二类预处理中间代码。进一步地,可以仅对中间代码块b进行双缓存优化处理,然后将经过双缓存优化处理后的中间代码块b和未经过双缓存优化处理的中间代码块a组成的中间代码作为一个第二类预处理中间代码。
第二种实现方式:基于各个中间代码块的数据处理方式,对该多个中间代码块中的至少一个中间代码块进行缓存优化处理的具体实现方式可以为:当该多个中间代码块中的部分中间代码块的数据处理方式包括数据重复使用,以及该多个中间代码块中的部分中间代码块的数据处理方式包括数据不重复使用时,对该多个中间代码块中数据处理方式包括数据不重复使用的至少一个中间代码块进行双缓存优化处理,以及对该多个中间代码块中数据处理方式包括数据重复使用的至少一个中间代码块进行环形缓存优化处理。相应地,将缓存优化处理后的至少一个中间代码块和未进行缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码的具体实现方式可以为:将双缓存优化处理后的至少一个中间代码块、环形缓存优化处理后的至少一个中间代码块和未进行缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
可以认为中间代码中存在第一部分中间代码块,该第一部分中间代码块的数据处理方式为数据不重复使用,相应的该第一部分中间代码块可以进行双缓存优化处理。同样的可以认为中间代码中除第一部分中间代码块之外的中间代码块为第二部分中间代码块,该第二部分中间代码块的数据处理方式为数据重复使用,相应的该第二部分中间代码块可以进行环形缓存优化处理。
也就是说,可以对第一部分中间代码块中的至少一个中间代码块进行双缓存优化处理,对第二部分中间代码块中的至少一个中间代码块进行环形缓存优化处理,如此可以确定至少一个第二类的预处理中间代码块。譬如,当中间代码包括两个中间代码块a和中间代码块b,可以对中间代码块a进行双缓存优化处理以及对中间代码块b进行环形缓存优化处理,将处理后的中间代码作为一个第二类预处理中间代码。进一步地,可以仅对中间代码块a进行双缓存优化处理,然后将经过双缓存优化处理后的中间代码块a和未经过缓存优化处理的中间代码块b组成的中间代码作为一个第二类预处理中间代码。进一步地,可以仅对中间代码块b进行环形缓存优化处理,然后将经过环形缓存优化处理后的中间代码块b和未经过缓存优化处理的中间代码块a组成的中间代码作为一个第二类预处理中间代码。
第三种实现方式:基于各个中间代码块的数据处理方式,对该多个中间代码块中的至少一个中间代码块进行缓存优化处理的具体实现方式可以为:当该多个中间代码块的数据处理方式均包括数据重复使用时,对该多个中间代码块中的至少一个中间代码块进行环形缓存优化处理。相应地,将缓存优化处理后的至少一个中间代码块和未进行缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码的具体实现方式可以为:将环形缓存优化处理后的至少一个中间代码块和未进行环形缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
当多个中间代码块的数据处理方式均为数据重复使用时,当需要对中间代码中的至少一个中间代码块进行缓存优化处理时,可以进行环形缓存优化处理,然后再确定第二类的预处理中间代码块。譬如,当中间代码中包括两个中间代码块a和中间代码块b时,可以对中间代码块a进行环形缓存优化处理以及对中间代码块b进行环形缓存优化处理,将处理后的中间代码作为一个第二类预处理中间代码。进一步地,可以仅对中间代码块a进行环形缓存优化处理,然后将经过环形缓存优化处理后的中间代码块a和未经过环形缓存优化处理的中间代码块b组成的中间代码作为一个第二类预处理中间代码。进一步地,可以仅对中间代码块b进行环形缓存优化处理,然后将经过环形缓存优化处理后的中间代码块b和未经过环形缓存优化处理的中间代码块a组成的中间代码作为一个第二类预处理中间代码。
介绍完多种生成第二类预处理中间代码后,接下来将对双缓存优化处理和环形缓存优化处理的具体过程进行介绍。
1、对该中间代码中的一个中间代码块进行双缓存优化处理的操作包括如下步骤:更改语法树中的部分节点信息,以使更改后的一个中间代码块支持如下操作:(1)交替缓存输入数据至两个输入缓存中,并在每次缓存数据的同时使用该两个输入缓存中当前未执行缓存操作的输入缓存内进行计算处理。(2)记录输入的第一个数据在该两个输入缓存中的缓存位置。(3)交替将计算处理后的数据缓存至两个输出缓存中,并在每次缓存的同时输出该两个输出缓存中当前未执行缓存操作的输出缓存内的数据。其中,该语法树用于指示该一个中间代码块的运行逻辑,该语法树中的每个节点信息用于指示该一个中间代码块的一个运行步骤。
语法树一般是基于在源代码中提取的用于运行的代码信息建立的一种抽象的树状结构,用于表示源代码的运行逻辑,由于中间代码是由源代码转换得到的,则语法树也可以用于表示中间代码的运行逻辑。需要说明的是,不同的中间代码块的运行逻辑可以由不同的语法树来表示,即在一种可能的实现方式中,一个中间代码块可以对应一个语法树。
一般来说,语法树中包括多个节点,每个节点可以表示一个运行步骤,多个运行步骤构成了语法树中的运行逻辑。其中,节点信息可以包括节点类型、节点位置等信息,对节点信息进行更改实际上就是对中间代码中的部分代码进行修改。
也就是说,中间代码块的双缓存优化处理,即更改相应的语法树中的部分节点信息,实际就是对中间代码块中的部分代码做一定修改。具体地,可以修改用于实现分配输入缓存的部分代码,使得输入缓存由一个变为两个。修改用于实现输入循环的部分代码,使得输入数据可以交替输入至两个输入缓存中,使一个输入缓存用于输入数据的同时,另一个输入缓存用于计算数据,实现数据的输入与计算并行进行。增加用于指示初始输入缓存的部分代码,也就是在两个输入缓存中确定一个输入缓存,用于缓存第一个输入数据。修改用于分配输出缓存的部分代码,使得输出缓存由一个变为两个。修改用于执行输出循环的部分代码,使得数据可以交替由两个输出缓存中输出,使一个输出缓存用于输出数据的同时,另一个输出缓存用于存储输入缓存计算后得到的数据,实现数据的输出与计算并行进行。
譬如,设定第一片输入缓存标记为a,第二片输入缓存标记为b,第一片输出缓存标记为c,第二片输出缓存标记为d。如图2所示,在T=1时,第1次数据输入a,在T=2时,第2次数据输入b,第1次数据在a中计算并输出至c,在T=3时,第3次数据输入a,第2次数据在b中计算并输出至d,第1次数据由c输出,之后由a、b交替输入数据,c、d交替输出数据。如图3所示,在T=N时,第n次数据输入b,第n-1次数据在a中计算并输出至c,第n-2次数据由d输出,在T=N+1时,第n次数据在b中计算并输出至d,第n-1次数据由c输出,在T=N+2时,第n次数据由d输出。相比较于图4、图5所示的有两个输入缓存、一个输出缓存的双缓存优化处理方式,可以明显看出,图2、图3所示的双缓存优化处理方式可以实现更高的数据处理效率。
2、对该中间代码中的一个中间代码块进行环形缓存优化处理的操作包括如下步骤:更改语法树中的部分节点信息,以使更改后的一个中间代码块支持如下操作:(1)对输入数据进行环形缓存处理。(2)交替缓存经过环形缓存处理后的数据至两个输出缓存中,并在每次缓存的同时输出该两个输出缓存中当前未执行缓存操作的输出缓存内的数据。其中,该语法树用于指示该一个中间代码块的运行逻辑,该语法树中的每个节点信息用于指示该一个中间代码块的一个运行步骤。
一般来说,当中间代码块的数据处理方式为数据重复使用时,该中间代码块可以进行环形缓存优化处理。当在运行该中间代码块的过程中,存在输入数据在多个运行过程中被使用的情况时,对该中间代码块进行环形缓存优化处理,使得被多个运行过程使用的数据可以只进行一次输入,避免数据进行多次输入,提高数据处理效率。
中间代码块的环形缓存优化处理,即更改相应的语法树中的部分节点信息,实际就是对中间代码块中的部分代码做一定修改。具体地,可以修改用于实现分配输入缓存的部分代码,使得输入缓存可以有多个。修改用于执行输入循环的部分代码,确定一个起始输入缓存,使得多个输入数据可以从该起始输入缓存开始依次输入至多个输入缓存中。增加用于指示第一个输入数据输入缓存的部分代码,也就是在多个输入缓存中确定一个输入缓存,用于缓存第一个输入数据。修改用于分配输出缓存的部分代码,使得输出缓存由一个变为两个。修改用于执行输出循环的部分代码,使得数据可以交替由两个输出缓存中输出,使一个输出缓存用于输出数据的同时,另一个输出缓存用于存储输入缓存计算后得到的数据,实现数据的输出与计算并行进行。
其中,输入缓存的个数可以根据用于计算的输入缓存的个数和用于计算的输入缓存的移动跨度确定。如图6所示,在T=4时,a、b、c用于计算,也就是用于计算的输入缓存的个数为3,在T=5时,b、c、d用于计算,可以看出用于计算的输入缓存的移动跨度为1。由于用于计算的输入缓存的个数为3,用于计算的输入缓存的移动跨度为1,相应的可以确定输入缓存的个数为4。
通常起始输入缓存可以通过循环变量、输入缓存的个数确定。设起始输入缓存为index,输入缓存的个数为n,循环变量为i。通过index=i%n,也就是对循环变量和输入缓存的个数求余,可以起始输入缓存的位置。譬如,如图6所示,在T=1时,循环变量为1,1%4=1,可以确定起始输入缓存为第一个输入缓存,也就是第1次数据缓存至a中。
譬如,设定输入缓存分为a、b、c、d四个缓存,输出缓存分为e、f两个缓存时。如图6所示,在T=1时,第1次数据输入a,在T=2时,第2次数据输入b。在T=3时,第3次数据输入c,在T=4时,第4次数据输入d,a、b、c用于计算,a中输出第1次数据至e,在T=5时,第5次数据输入a,b、c、d用于计算,b中输出第2次数据至f,e中输出第1次数据,之后由a、b、c、d交替输入数据,e、f交替输出数据。如图7所示,在T=N时,最后一个数据第n次数据输入d,a、b、c用于计算,a中输出第n-3次数据至e,f输出第n-4次数据,在T=N+1时,b、c、d用于计算,b中输出第n-2次数据至f,f输出第n-3次数据,在T=N+2时,c、d用于计算,c中输出第n-1次数据至e,f输出第n-2次数据,在T=N+3时,d用于计算并输出第n次数据至f,e输出第n-1次数据,在T=N+4时,f输出第n次数据。
步骤102:将每个预处理中间代码转换成可执行代码,得到至少一个可执行代码。
通过至少一个预处理中间代码,可以转换得到至少一个可执行代码。当同一个预处理中间代码运行于不同的硬件平台时,其转换得到的可执行代码也会有所不同。具体地,将预处理中间代码转换成可执行代码的实现方式可以为:
1、解析预处理中间代码中用于实现数据输入输出的拷贝代码,在该拷贝代码中确定拷贝的原地址和目的地址、以及输入数据长度等信息,设该信息为第一参数信息。
其中,由于输入数据可以为张量数据中的一行数据,也可以为张量数据中的一个数据,根据输入数据不同,相应的该输入数据长度也不同。
2、获取具体硬件平台的硬件接口代码,解析用于指示该硬件接口代码中参数信息的配置文件,通过字符匹配等方式确定配置文件中用于指示拷贝的目的地址、原地址以及输入数据长度等信息,设该信息为第二参数信息。
其中,具体的硬件平台的硬件接口代码和配置文件一般是确定的、由生产厂商提供的,而不同的硬件平台的硬件接口代码和配置文件有所不同。
3、用第一参数信息替换相应的第二参数信息。
也就是,将配置文件中用于指示拷贝的目的地址更改为从中间代码中解析出的的目的地址,将配置文件中用于指示拷贝的原地址更改为从中间代码中解析出的的原地址,将配置文件中用于指示数据长度的输入数据长度更改为从中间代码中解析出的输入数据长度。
配置文件的第二参数信息替换后,将换后的硬件接口代码替换预处理中间代码中的拷贝代码,由此得到能够运行于具体的硬件平台的可执行代码。
步骤103:从该至少一个可执行代码中确定该深度学习模型的执行代码。
该至少一个可执行代码都可以在具体的硬件平台中运行,一般来说,用户会根据实际情况在该至少一个可执行代码中选择一个可执行代码,用于在具体的硬件平台上运行该深度学习模型。
其中,从该至少一个可执行代码中确定该深度学习模型的执行代码的具体实现方式可以为:基于待测试张量数据,确定每个可执行代码的执行性能指标。基于每个可执行代码的执行性能指标,从该至少一个可执行代码中确定该深度学习模型的执行代码。
一般来说,张量数据的大小会影响可执行代码在具体的硬件平台中的执行性能,对于同样大小的张量数据,张量数据中的数据不同不会影响可执行代码在具体的硬件平台中的执行性能,因此,该待测试张量数据的大小可以与该深度学习模型待处理的张量数据大小相同。
其中,执行性能指标可以包括执行时间指标、执行内存指标与综合指标,综合指标可以根据执行时间指标与执行内存指标进行计算得出。
也就是该至少一个可执行代码依次在具体的硬件平台中运行,得到每个可执行代码的执行时间、执行内存及综合指标。对比该至少一个可执行代码的执行性能指标,选出执行时间最短的可执行代码、执行内存最小的可执行代码和综合指标最高的可执行代码。由此,可以根据实际情况在上述选出的执行时间最短的可执行代码、执行内存最小的可执行代码和综合指标最高的可执行代码中进一步选择一个可执行代码确定为该深度学习模型的执行代码。
需要说明的是,可能存在一个可执行代码,该可执行代码执行时间最短、执行内存最少且综合指标最高,也可能存在多个执行代码的执行时间相同且最短。
譬如,当中间代码中包括两个中间代码块,两个中间代码块的数据处理方式都为数据不重复使用时。由该中间代码可以得到四个预处理中间代码,相应的可以转换为四个可执行代码,即第1可执行代码、第2可执行代码、第3可执行代码、第4可执行代码,依次在具体的硬件平台中运行,确定这四个可执行代码的执行时间、执行内存和综合指标,从而可以根据实际需求从中确定一个可执行代码作为深度学习模型的执行代码。
在本申请实施例中,深度学习模型的中间代码的数据处理方式可以包括数据重复使用和/或数据不重复使用,根据中间代码的数据处理方式不同可以确定该中间代码对应的至少一个互不相同的预处理中间代码。将每个预处理中间代码转换成可执行代码,可以得到至少一个可执行代码,如此即可从该至少一个可执行代码中确定一个运行效率较高的深度学习模型的执行代码,避免只能按照固定模式确定深度学习模型的执行代码的问题。
图8是本申请实施例提供的一种深度学习模型的执行代码的确定装置的结构示意图,该深度学习模型的执行代码的确定装置可以由软件、硬件或者两者的结合实现。该深度学习模型的执行代码的确定装置包括:
第一确定模块810,用于基于深度学习模型的中间代码的数据处理方式,确定所述中间代码对应的至少一个预处理中间代码,所述数据处理方式包括数据重复使用和/或数据不重复使用,所述至少一个预处理中间代码互不相同;
转换模块820,用于将每个预处理中间代码转换成可执行代码,得到至少一个可执行代码;
第二确定模块830,用于从所述至少一个可执行代码中确定所述深度学习模型的执行代码。
在本申请一种可能的实现方式中,所述装置应用于目标检测、目标跟踪、语义分割、语音识别、文字识别、自然语言处理中的任一场景。
在本申请一种可能的实现方式中,所述中间代码包括多个中间代码块,每个中间代码块分别用于处理不同的张量数据,所述第一确定模块810用于:
将所述中间代码作为一个预处理中间代码;和/或,
基于各个中间代码块的数据处理方式,对所述多个中间代码块中的至少一个中间代码块进行缓存优化处理;
将缓存优化处理后的至少一个中间代码块和未进行缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
在本申请一种可能的实现方式中,所述第一确定模块810用于:
当所述多个中间代码块的数据处理方式均包括数据不重复使用时,对所述多个中间代码块中的至少一个中间代码块进行双缓存优化处理;
将双缓存优化处理后的至少一个中间代码块和未进行双缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
在本申请一种可能的实现方式中,所述第一确定模块810用于:
当所述多个中间代码块中的部分中间代码块的数据处理方式包括数据重复使用,以及所述多个中间代码块中的部分中间代码块的数据处理方式包括数据不重复使用时,对所述多个中间代码块中数据处理方式包括数据不重复使用的至少一个中间代码块进行双缓存优化处理,以及对所述多个中间代码块中数据处理方式包括数据重复使用的至少一个中间代码块进行环形缓存优化处理;
将双缓存优化处理后的至少一个中间代码块、环形缓存优化处理后的至少一个中间代码块和未进行缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
在本申请一种可能的实现方式中,所述第一确定模块810用于:
当所述多个中间代码块的数据处理方式均包括数据重复使用时,对所述多个中间代码块中的至少一个中间代码块进行环形缓存优化处理;
将环形缓存优化处理后的至少一个中间代码块和未进行环形缓存优化处理的所有中间代码块构成的中间代码作为一个预处理中间代码。
在本申请一种可能的实现方式中,所述第二确定模块830用于:
基于待测试张量数据,确定每个可执行代码的执行性能指标;
基于每个可执行代码的执行性能指标,从所述至少一个可执行代码中确定所述深度学习模型的执行代码。
在本申请一种可能的实现方式中,第一确定模块810用于:
更改语法树中的部分节点信息,以使更改后的一个中间代码块支持如下操作:
交替缓存输入数据至两个输入缓存中,并在每次缓存数据的同时使用所述两个输入缓存中当前未执行缓存操作的输入缓存内进行计算处理;
记录输入的第一个数据在所述两个输入缓存中的缓存位置;
交替将计算处理后的数据缓存至两个输出缓存中,并在每次缓存的同时输出所述两个输出缓存中当前未执行缓存操作的输出缓存内的数据;
其中,所述语法树用于指示所述一个中间代码块的运行逻辑,所述语法树中的每个节点信息用于指示所述一个中间代码块的一个运行步骤。
在本申请一种可能的实现方式中,第一确定模块810用于:
更改语法树中的部分节点信息,以使更改后的一个中间代码块支持如下操作:
对输入数据进行环形缓存处理;
交替缓存经过环形缓存处理后的数据至两个输出缓存中,并在每次缓存的同时输出所述两个输出缓存中当前未执行缓存操作的输出缓存内的数据;
其中,所述语法树用于指示所述一个中间代码块的运行逻辑,所述语法树中的每个节点信息用于指示所述一个中间代码块的一个运行步骤。
在本申请实施例中,深度学习模型的中间代码的数据处理方式可以包括数据重复使用和/或数据不重复使用,根据中间代码的数据处理方式不同可以确定该中间代码对应的至少一个互不相同的预处理中间代码。将每个预处理中间代码转换成可执行代码,可以得到至少一个可执行代码,如此即可从该至少一个可执行代码中确定一个运行效率较高的深度学习模型的执行代码,避免只能按照固定模式确定深度学习模型的执行代码的问题。
需要说明的是:上述实施例提供的深度学习模型的执行代码的确定装置在确定深度学习模型的执行代码时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的深度学习模型的执行代码的确定装置与深度学习模型的执行代码的确定方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
图9是本申请实施例提供的一种电子设备900的结构示意图,该控制设备900可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器(centralprocessing units,CPU)901和一个或一个以上的存储器902,其中,所述存储器902中存储有至少一条指令,所述至少一条指令由所述处理器901加载并执行以实现上述各个方法实施例提供的深度学习模型的执行代码的确定方法。
当然,该电子设备900还可以具有有线或无线网络接口、键盘以及输入输出接口等部件,以便进行输入输出,该电子设备900还可以包括其他用于实现设备功能的部件,在此不做赘述。
本申请实施例还提供了一种非临时性计算机可读存储介质,当所述存储介质中的指令由移动终端的处理器执行时,使得移动终端能够执行上述图1所示实施例提供的深度学习模型的执行代码的确定方法。
本申请实施例还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述图1所示实施例提供的深度学习模型的执行代码的确定方法。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本申请的较佳实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
- 深度学习模型的执行代码的确定方法、装置及存储介质
- 深度学习模型的执行方法、装置、电子设备及存储介质