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

未命名 08-07 阅读:71 评论:0


1.本公开涉及数据处理技术领域,尤其涉及人工智能、深度学习、模型推理优化等技术领域。


背景技术:

2.随着人工智能技术的发展,模型功能日益强大。随着功能的强大,神经网络模型的规模也日益增加。对大模型而言,模型量化能够降低对存储空间的占用,但是在推理阶段会影响模型的推理精度。因此,如何在尽可能少占用资源的情况下还能够适当的加速推理,成为模型应用的关键。


技术实现要素:

3.本公开提供了数据处理方法、装置、电子设备以及存储介质。
4.根据本公开的一方面,提供了一种数据处理方法,包括:
5.从存储介质中读取待处理对象关于目标神经网络层的激活矩阵,以及,读取该目标神经网络层的参数矩阵;该激活矩阵的数值精度为第一精度;该参数矩阵的数值精度为第二精度;该第二精度低于该第一精度;
6.采用至少一个内核将该激活矩阵分离为第一矩阵和第二矩阵,并从该参数矩阵中获取与该第一矩阵对应的第三矩阵,以及与该第二矩阵对应的第四矩阵;其中,该第一矩阵采用该第一精度,该第二矩阵采用该第二精度,该第一矩阵基于该激活矩阵中的非离群通道构建,该第二矩阵基于该激活矩阵中的离群通道构建;
7.对该第一矩阵和该第三矩阵执行矩阵乘积操作,得到第一处理结果;以及,
8.对该第二矩阵和该第四矩阵执行矩阵乘积操作,得到第二处理结果;
9.将该第一处理结果和该第二处理结果进行融合,得到该目标神经网络层对该激活矩阵的数据处理结果。
10.根据本公开的另一方面,提供了一种数据处理装置,包括:
11.读取模块,用于从存储介质中读取待处理对象关于目标神经网络层的激活矩阵,以及,读取该目标神经网络层的参数矩阵;该激活矩阵的数值精度为第一精度;该参数矩阵的数值精度为第二精度;该第二精度低于该第一精度;
12.拆分模块,用于采用至少一个内核将该激活矩阵分离为第一矩阵和第二矩阵,并从该参数矩阵中获取与该第一矩阵对应的第三矩阵,以及与该第二矩阵对应的第四矩阵;其中,该第一矩阵采用该第一精度,该第二矩阵采用该第二精度,该第一矩阵基于该激活矩阵中的非离群通道构建,该第二矩阵基于该激活矩阵中的离群通道构建;
13.第一运算模块,用于对该第一矩阵和该第三矩阵执行矩阵乘积操作,得到第一处理结果;以及,
14.第二运算模块,用于对该第二矩阵和该第四矩阵执行矩阵乘积操作,得到第二处理结果;
15.融合模块,用于将该第一处理结果和该第二处理结果进行融合,得到该目标神经网络层对该激活矩阵的数据处理结果。
16.根据本公开的另一方面,提供了一种电子设备,包括:
17.至少一个处理器;以及
18.与该至少一个处理器通信连接的存储器;其中,
19.该存储器存储有可被该至少一个处理器执行的指令,该指令被该至少一个处理器执行,以使该至少一个处理器能够执行本公开中任一实施例的数据处理方法。
20.根据本公开的另一方面,提供了一种存储有计算机指令的非瞬时计算机可读存储介质,其中,该计算机指令用于使该计算机执行根据本公开中任一实施例的数据处理方法。
21.根据本公开的另一方面,提供了一种计算机程序产品,包括计算机程序,该计算机程序在被处理器执行时实现根据本公开中任一实施例的数据处理方法。
22.本公开实施例可节约存储空间的同时,加速大模型的推理速度,以提高资源的利用率。
23.应当理解,本部分所描述的内容并非旨在标识本公开的实施例的关键或重要特征,也不用于限制本公开的范围。本公开的其它特征将通过以下的说明书而变得容易理解。
附图说明
24.附图用于更好地理解本方案,不构成对本公开的限定。其中:
25.图1是根据本公开实施例提供的数据处理方法的流程示意图;
26.图2是根据本公开实施例提供的数据处理方法的处理过程示意图;
27.图3a是根据本公开实施例提供的第一内核对激活矩阵进行量化和标记的示意图;
28.图3b是根据本公开一实施例中提供的第一内核标记结果所占用存储空间的意图;
29.图3c是根据本公开一实施例中提供的第二内核所需发射线程数的意图;
30.图4是根据本公开一实施例中提供的第一内核拆分出第二矩阵的示意图;
31.图5是根据本公开实施例提供的第二内核拆分参数矩阵的示意图;
32.图6是根据本公开实施例提供的从拆分句子到实现矩阵乘积操作的示意图;
33.图7是根据本公开实施例提供的数据处理方法的框架图;
34.图8是根据本公开一实施例中数据处理装置的结构示意图;
35.图9是用来实现本公开实施例的数据处理方法的电子设备的框图。
具体实施方式
36.以下结合附图对本公开的示范性实施例做出说明,其中包括本公开实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本公开的范围。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
37.此外,本公开实施例采用的术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者多个该特征。在本公开的描述中,“多个”的含义是两个或两个以上,除非另有明确具体的限定。
38.大模型,例如大型语音模型,大型图像处理模型,或者大型混合模型,其模型的推理速度是至关重要的。因为这些模型通常需要处理大量的数据,需要进行大量的计算才能够生成高质量的输出。
39.大模型的计算量由模型的训练模型所决定,模型一旦训练完成,参数大小基本无法改变,从而计算量也基本确定下来。因此,推理速度较难通过降低计算量来获得提升。
40.不过,近年来发现对模型通过量化训练或者训练后离线量化的方式可以在不影响模型预测能力的前提下,降低数据(包括激活值和参数值)的表示精度。一方面能降低模型参数对磁盘和内存的占用,提升推理吞吐;另一方面,也能有效提升模型的推理速度。
41.然而,无论是量化训练还是训练后离线量化的方式,都需要在模型训练结束之后额外引入一个步骤去微调模型参数或者统计量化参数。对于大模型来说,这些步骤的时间成本并不低。此外,大模型往往需要根据输入和反馈进行快速的迭代,这意味着模型需要经常性的微调。如果每次微调之后都需要进行一次额外的量化训练或者训练后离线量化的话,迭代成本会增长不少。
42.因此,在大模型时代,动态量化的方案更加适用。动态量化是指不在训练、微调之后引入额外的步骤,而是在推理过程中动态地统计激活值的最值,计算出合适的量化参数,从而将激活值从高精度量化为低精度。例如,从较高的fp32/fp16量化为int8/int4,以便于加速运算。
43.但是,直接的动态量化方法在大模型上会带来非常大的精度损失,无法保证大模型的输出效果。在这个基础上,统计分析大模型的激活值特征,发现激活值的分布并不均匀。在某一些特征通道上会出现非常大的离群点,这些离群点的出现会导致按照min-max(最小值-最大值)进行量化时,会将正常的激活值量化为0,由此导致丢失的信息非常多,最终影响模型推理结果的准确性。
44.有鉴于此,本公开提供了一种混合精度的数据处理方法,以期望既能够降低对存储资源的占用,还能够提高模型推理速度。如图1所示,为该方法的流程示意图,包括:
45.s101,从存储介质中读取待处理对象关于目标神经网络层的激活矩阵,以及,读取该目标神经网络层的参数矩阵;该激活矩阵的数值精度为第一精度;该参数矩阵的数值精度为第二精度;该第二精度低于该第一精度。
46.其中,以大语言模型为例,待处理对象可以为音频或文本。待处理对象的激活矩阵,可以为原始的音频或文本,也可以为经过目标神经网络层之前的神经网络层处理之后的信息。例如,在大模型中,目标神经网络层之前有3个神经网络层,则关于目标神经网络层的激活矩阵,为该目标神经网络层的前一层对音频或文本处理之后得到的输出结果。
47.类似的,以图像处理模型为例,待处理对象可以为图像,待处理对象的激活矩阵,可以为原始的图像,也可以为经过目标神经网络层之前的神经网络层处理之后的信息。例如,在大模型中,目标神经网络层之前有3个神经网络层,则关于目标神经网络层的激活矩阵,为该目标神经网络层的前一层对图像处理后的输出结果。总之,激活矩阵所包含的信息基于该目标神经网络层在大模型中所处的位置,以及目标神经网络层所需的输入确定。
48.参数矩阵,即大模型经训练后的模型参数。
49.本公开实施例中存储介质可以包括磁盘、显存、缓存等。实施时,激活矩阵可以存储在磁盘中,参数矩阵可以存储在显存中。当然,这里仅示例说明,可以根据实际情况确定
激活矩阵和参数矩阵的存储方式。缓存可以存储计算过程产生的计算结果,例如矩阵乘积操作的计算结果等。
50.s102,采用至少一个内核将该激活矩阵分离为第一矩阵和第二矩阵,并从参数矩阵中获取与第一矩阵对应的第三矩阵,以及与第二矩阵对应的第四矩阵;其中,该第一矩阵采用该第一精度,该第二矩阵采用该第二精度,该第一矩阵基于该激活矩阵中的非离群通道构建,该第二矩阵基于该激活矩阵中的离群通道构建。
51.激活矩阵需要与参数矩阵执行矩阵乘积操作,因此第三矩阵即为从参数矩阵分离出的需要与激活矩阵中的第一矩阵执行矩阵乘积操作的子矩阵。同理,第四矩阵即为从参数矩阵分离出的需要与激活矩阵中的第二矩阵执行矩阵乘积操作的子矩阵。
52.s103,对该第一矩阵和该第三矩阵执行矩阵乘积操作,得到第一处理结果。
53.s104,对该第二矩阵和该第四矩阵执行矩阵乘积操作,得到第二处理结果。
54.需要说明的是,步骤s103和s104的执行顺序不受限。
55.s105,将该第一处理结果和该第二处理结果进行融合,得到该目标神经网络层对该激活矩阵的数据处理结果。
56.以上整体的处理过程如图2所示,激活矩阵大小为3*5,其中假设离群通道为激活矩阵中的第2列和第3列。则从激活矩阵中分离出第2列和第3列作为离群通道构建第二矩阵,由此第二矩阵中的数值保持较高的第一精度。剩余的列构建第一矩阵,并将第一矩阵量化为第二精度。同时,从参数矩阵中分离出需要与第2列和第3列相乘的第2行和第3行以构建第四矩阵,剩余的构建第三矩阵。然后,第一矩阵和第三矩阵执行矩阵乘积操作得到第一处理结果,第二矩阵和第四矩阵执行矩阵乘积操作得到第二处理结果,最终将两个处理结果融合,得到激活矩阵与参数矩阵的乘积结果。
57.对激活矩阵和参数矩阵的分离和量化,可以基于pytorch的框架实现。实现过程中,可以采用该框架中的一些算子。但是基于该框架实现的方案中会重复使用一些算子(例如拆分激活矩阵和参数矩阵需要重复使用拆分算子),且会增加额外的步骤。由此,本公开实施例中选择内核实现对激活矩阵和参数矩阵的分离和量化,以便于简化运算,加速推理过程。
58.本公开实施例中,在存储第二精度的参数矩阵以降低对存储资源的消耗的基础上,采用少量的内核从激活矩阵中分离并量化出第一矩阵和第二矩阵,从参数矩阵中分离出第三矩阵和第四矩阵。以便于实现混合精度的推理过程。该方法能够有效保证离群通道推理的准确性,还能够通过量化非离群通道实现推理的加速。此外,由于内核相比pytorch框架的算子,在启动和处理上,能够有效的加速推理,从而使得本公开实施例提供的数据处理方法既能够节约存储资源又能够提高推理速度。
59.本公开实施例中,对激活矩阵和参数矩阵的分离和量化,可采用一个内核来实现。但为了更好的加快推理同时兼顾采用少量的内核,本公开实施例中提供了采用两个内核来实现对激活矩阵和参数矩阵的分离和量化的方案。其中,包括第一内核和第二内核。后文中将引入第三内核实现对第一处理结果和第二处理结果的融合。其中:
60.针对第一内核,其用于从该激活矩阵中筛选出离群通道,并确定该离群通道的标记,以构建该第一矩阵。
61.针对第二内核,其用于按该离群通道的标记,从该激活矩阵中提取出该离群通道,
并基于该离群通道构建出该第二矩阵;以及,采用该第二内核按该离群通道的标记,从该参数矩阵中提取出与该第二矩阵对应的参数值,以构建该第四矩阵。在实施时,第三矩阵无需额外通过内核构建,参数矩阵即可作为第三矩阵参与运算。
62.本公开实施例中,采用两个内核,以期望通过较少的内核数,减少启动内核的耗时,因此加速推理的同时能够兼顾对内核资源的消耗。此外,通过将对激活矩阵和参数矩阵的分离和量化,合理分配到不同内核中,以通过两个内核的紧密协作提高对激活矩阵和参数矩阵的分类和量化的速度。
63.为便于理解,下面对第一内核、第二内核以及第三内核的具体操作进行说明。
64.1、第一内核
65.本公开实施例中,采用第一内核基于该离群通道的标记构建该第一矩阵,可实施为针对该激活矩阵中的每一行,分别执行:
66.步骤a1,确定该行的最大值。
67.步骤a2,基于该最大值,将该行的激活值量化为该第二精度,并将该离群通道对应的激活值设置为默认值,以得到该第一矩阵。
68.本公开实施例中默认值可以为0,以便于在执行矩阵乘积操作时,加速矩阵相乘的运算过程,并能够和第二处理结果快速进行融合。
69.本公开实施例中,对激活矩阵按行进行量化,并完成对离群值的重置,以便于构建出第一矩阵,加速推理。
70.实施时,为了加速推理,基于激活矩阵的总行数,该第一内核中启动l个block(线程块),并在每个线程块内发射q个thread(线程),其中:l小于或等于激活矩阵的总行数,q小于或等于激活矩阵中同一行包含的激活值数,且每个block负责激活矩阵中的至少一行激活值,每个thread负责至少一个激活值;相应的,采用第一内核构建该第一矩阵时,可针对激活矩阵中的每行激活值,采用对应的block执行以下操作:
71.步骤b1,基于该block确定该行的激活值的最大值;
72.步骤b2,控制该block内的每个线程,基于该最大值将该行的激活值内该线程负责的激活值量化为该第二精度,并将该离群通道对应的激活值设置为默认值,以得到该第一矩阵。
73.如图3a所示,假定激活矩阵的规模为m*k,即m行,k列。由于激活矩阵的规模往往较大,本公开实施例中第一内核可以基于block实现对激活矩阵的量化和标记。
74.一种可能的实施方式中,如图3a所示,第一内核中包括m个block,每个block分别处理激活矩阵中的一行激活值。假设每行包括k个激活值由于一个block中最多发射p(如1024)个thread(线程),因此在k小于或等于p的情况下,每个block发射k个thread,每个thread处理该行中的一个激活值。具体实施时,每个thread分别实现对相应激活值的量化,以将该激活值从第一精度量化为第二精度,并能够完成对离群通道的标记。
75.由于大模型中,k可能远远大于p,因此为了加速处理过程,本公开实施例中使用了向量化技术和折叠技术来处理同一行的激活值。例如,同一个block内可发射q个thread(q《p),每个thread负责处理(k/q)个激活值。在此基础上,针对每一行激活值,在一个block中使用blockreduce(块规约)获取一行的absmax值(最值)。之后该block内的每个thread处理k/q个激活值,具体的处理步骤是:
76.步骤c1,根据absmax量化该激活值。
77.步骤c2,判断当前激活值是否大于threshold(预设阈值),如果大于threshold的话就将该激活值置0,并使用原子操作将当前激活值所在列对应的离群通道的位置进行标记。
78.针对一个激活矩阵,第一内核中发射的thread数量为m*q,即m个block,每个block发射q个thread。由此,每个thread负责多个激活值的量化和标记。如图3a所示,每个thread负责其中4个激活值的量化和标记。
79.此外,对于激活矩阵的行,即m这个维度也可以使用折叠技术。实施时,可以根据第一内核所采用的gpu(graphics processing unit,图形处理器)型号计算出sm(streaming multiprocessor,流处理器)利用率最高的block数量。一般情况下,block的数量不会超过1000。
80.在同一block处理多行激活值的情况下,可以采用blockreduce获取这多行激活值的最大值,由此每行激活值采用相同的最大值进行量化。也可以采用blockreduce获取每行激活值的最大值。每行激活值的量化过程依然采用q个thread分别进行处理。也即每个thread串行的处理各行中的激活值。
81.由此,本公开实施例中,第一内核采用block和少量的thread处理每行的激活值,以从激活矩阵中识别出离群通道。该方式能够加速对激活矩阵的分离和量化,从而实现对推理的进一步加速。
82.此外,为了进一步减少对存储资源的占用,对离群通道的筛选和标记,可实施为,针对该第一内核中的每个线程,在该线程负责的激活值中,存在任一激活值大于预设阈值的情况下,由该线程将该任一激活值所在的列标识编码为离群通道的标记,以使得该离群通道的标记占用目标数量的比特位。
83.本公开实施例中,每个线程负责对相应激活值的判断和离群通道的标记。为了能够尽可能少的占用存储资源,离群通道的标记通过编码实现,且每个离群通道的编码结果仅占用目标数量的比特位,以此能够节约存储资源。
84.为了最小化离群通道的标记所占用的数据量,本公开实施例中,编码的具体实现,可实施为:
85.将该离群通道在该激活矩阵中的列标识编码为占用1个比特的第一目标值;以及,
86.将非离群通道在该激活矩阵中的列标识编码为占用1个比特的第二目标值。
87.实施时,由于激活矩阵共有k个特征通道,可以设置k个比特位,其中各比特位的默认取值为第二目标值,当筛选出离群通道之后,将该离群通道对应的比特位重置为第一目标值,由此实现对离群通道的标记进行编码。
88.例如,在基于pytorch框架实现混合精度的推理时,离群通道的标记col_idx需要用int32来表示。虽然离群通道数kfp_num只有k的1/1000左右,但该相关技术中需要对激活矩阵的每一行都要保存,所以占用的存储空间有kfp_num*m个int32。由于激活矩阵中的总行数m的数量级可能会达到10000以上,假设m=10000,k=16384,kfp_num=20。则该方法中如图3b所示,col_idx就要占用10000*20*4=800000bytes。
89.而本公开实施例中,离群通道的标记表示为outlier_idx。实现的是对k个通道的one_hot for bit编码。可用1个bit表示一个通道,如果该通道为离群通道,就设为1,否则
就设为0。outlier_idx所占空间仅与k相关,且与m和kfp_num无关。仍沿用前面的例子,本公开实施例中的outlier_idx,如图3b所示,仅需占用16384/8=2048bytes。相比于800000bytes,大量减少对存储资源的消耗。
90.由此,通过将离群通道和非离群通道编码为分别仅占用1比特的标记,可以占用少量的存储资源。
91.与此同时,本公开实施例不仅能够占用少量的资源以存储离群通道的标记,还能够基于离群通道的标记快速实现对激活矩阵和参数矩阵的分离。具体的由第二内核来实现,下面介绍第二内核的执行过程。
92.2、第二内核
93.本公开实施例中,第二内核需要从激活矩阵中抽取出第二矩阵,并从参数矩阵中抽取出第四矩阵。
94.如果采用pytorch框架的算子,则需要使用slice算子从激活矩阵中抽取出第二矩阵,并需要重复使用该slice算子从参数矩阵中抽取出第二矩阵对应的第四矩阵。因为离群通道是非连续的。在激活矩阵的行数为m,共有k个特征通道的情况下,如图3c所示,slice操作需要启动m*k个thread。
95.而,本公开实施例中,采用第二内核实现时,可以适当降低启动thread的数量。
96.实施时,假设需要启动的thread数量为指定数量,则本公开实施例中采用该第二内核基于以下方法确定该指定数量:
97.步骤d1,确定该激活矩阵中每列包含的激活值的数量(即激活矩阵的总行数),得到第一候选值;也即确定激活矩阵的行数m。
98.步骤d2,确定该参数矩阵中每行包含的激活值的数量(即参数矩阵的总列数),得到第二候选值;也即确定参数矩阵的列数n。
99.需要说明的是,步骤d1和步骤d2的执行顺序不受限。
100.步骤d3,选取该第一候选值和该第二候选值中的最大值,得到第三候选值。
101.步骤d4,确定该指定数量为该第三候选值和该离群通道的总数的乘积。
102.例如,接续前面的例子,假设离群通道的数量为kfp_num,则本公开实施例中,如图3c所示,仅需要启动m*kfp_num_个thread或n*kfp_num_个thread。一般情况下,kfp_num在k的1/1000这个数量级上,则相对于pytorch的框架,本公开实施例中启动的thread只需要其1/1000。
103.综上,本公开实施例中,在内核中实现对第二矩阵和第四矩阵的分离,启动的线程数量可大大降低,由此可提高推理的速度,同时降低资源消耗。
104.本公开实施例中,第二内核中的每个thread根据outlier_idx(离群通道的标记)将对应的通道赋值给子矩阵。该子矩阵可以为激活矩阵的离群矩阵,即第二矩阵。也可以为从参数矩阵中抽取出的第四矩阵。通过第二内核可同时处理激活矩阵和参数矩阵。
105.实施时,采用第二内核构建出该第二矩阵,可实施为采用该第二内核启动指定数量的线程,并分配该指定数量的线程中的m个线程分别执行以下操作:
106.步骤e1,从该激活矩阵中抽取出该离群通道中与该线程对应的激活值。
107.也即,针对每个离群通道,该离群通道包括m个激活值,每个thread负责其中的一个激活值。
108.步骤e2,将该激活值按序存储到该第二矩阵中;其中,m为该激活矩阵中每行包含的激活值的数量。
109.以两个离群通道为例,如图4所示,假设离群通道1具有3个激活值分别为b11、b12和b13。则第二内核发射线程1、线程2和线程3。线程1负责将b11赋值到第二矩阵中的c11位置,线程2负责将b12赋值到第二矩阵的c12位置,线程3负责将b13赋值到第二矩阵的c13位置。假设离群通道2具有3个激活值分别为b21、b22和b23。则第二内核中的线程1负责将b21赋值到第二矩阵中的c21位置,线程2负责将b22赋值到第二矩阵的c22位置,线程3负责将b23赋值到第二矩阵的c23位置。
110.本公开实施例中,可采用第二内核内的线程,从激活矩阵中提取出离群通道中的每个激活值,通过启动少量的内核和线程,完成对激活矩阵的分离,进而构建出第二矩阵,可提高推理的速度,合理利用内核和线程。
111.类似的,本公开实施例中,第二内核分配该指定数量的线程中的n个线程分别执行以下操作,n为该参数矩阵中每行包含的激活值的数量:
112.步骤f1,确定该线程对应的离群通道的标记;
113.步骤f2,按该离群通道的标记,从该参数矩阵中抽取出与该离群通道和该线程均对应的参数值。
114.也即,参数矩阵中每行包括n个激活值,第二内核中每个tread负责处理其中的一个激活值。由此,并发的调用多个thread,高效的处理参数矩阵。由于参数矩阵中每个激活值为第二精度,为了便于准确的计算第二处理结果,在步骤f3中,对该参数值执行反量化操作后,按序存储到该第四矩阵中。
115.以一个离群通道对应的一个参数通道为例,在图4基础上如图5所示,离群通道1对应的参数通道中包括一行,改行记为行a。该行a中假设包括2个参数值,分别为q11和q12。第二内核发射线程1和线程2。线程1负责将q11赋值到第四矩阵中的q11位置,线程2负责将q12赋值到第四矩阵的q12位置。离群通道2对应的参数通道中包括一行,改行记为行b。该行b中假设包括2个参数值,分别为q21和q22。第二内核发射线程1和线程2。线程1负责将q21赋值到第四矩阵中的q21位置,线程2负责将q22赋值到第四矩阵的q22位置。
116.由此,本公开实施例中,可采用第二内核内少量的线程,从参数矩阵中提取出离群通道对应的每个参数值。通过启动少量的内核和线程,完成对参数矩阵的分离,进而构建出第四矩阵,可提高推理的速度,合理利用内核和线程。
117.除了以上两个内核外,为了加速推理速度,本公开实施例还采用第三内核,以完成对两个矩阵乘积结果的融合。
118.3、第三内核
119.在一些实施例中,为了能够加速推理,本公开实施例中采用内第三内核将该第一处理结果和该第二处理结果进行融合,可实施为:
120.步骤g1,采用第三内核将该第一处理结果反量化为该第一精度,得到中间结果。
121.步骤g2,采用该第三内核将该中间结果和该第二处理结果执行矩阵加操作。
122.假设激活矩阵的规模为m*k,参数矩阵的规模为k*n。如图6所示,第一矩阵规模为m*k,其中,离群通道的值为0。从参数矩阵分离出的第三矩阵的规模为k*n。第三矩阵中离群通道对应的行取值不变。对第一矩阵和第三矩阵执行矩阵乘积操作,得到第一处理结果。该
第一处理结果的规模为m*n。
123.第二矩阵的规模为m*kfp_num_,其中离群通道的取值为从激活矩阵中的取值。第四矩阵规模为kfp_num*n,其中离群通道对应的参数值为从参数取值中提取并进行反量化的。第二矩阵和第四矩阵的构建均由第二内核完成。对第二矩阵和第四矩阵执行矩阵乘积操作,得到第二处理结果,该第二处理结果的规模为m*n。
124.相应的,第一处理结果和第二处理结果相加,得到最终的结果,
125.本公开实施例中,基于第三内核完成对大规模矩阵的融合,调用内核的耗时相对调用算子要少,因此能够提高推理的速度。
126.在一些实施例中,矩阵乘积操作的表达式可如式(1)所示:
127.a*b=c
ꢀꢀꢀ
(1)
128.其中,a矩阵位置在b矩阵位置之前,表示a矩阵的行与b矩阵的列相乘。在实施时,为了实现矩阵乘积操作需要将需要相乘的两个矩阵放在在用于矩阵乘积操作的两个存储空间位置即a位置和b位置。
129.本公开实施例中,基于pytorch的框架实现的加速推理的情况下,需要引入额外的步骤,对第一矩阵、第二矩阵、第三矩阵以及第四矩阵不仅需要转置操作,而且各矩阵中所有元素的存储顺序都被打乱,在执行矩阵乘积操作时,还需要对打乱的顺序进行重排序等操作。最终无法实现式(1)所示的矩阵乘积操作。
130.本公开实施例中,为了加速推理,该对该第一矩阵和该第三矩阵执行矩阵乘积操作,得到第一处理结果,可实施为:
131.将该第一矩阵映射到第一位置,并将该第三矩阵映射到第二位置;在矩阵乘积表达式中该第一位置在该第二位置之前;该第一位置和该第二位置为矩阵乘积操作所需的存储空间;例如,执行矩阵乘积操作,需要将第一矩阵存储在第一位置,将第二矩阵存储在第二位置,以便于矩阵乘积操作,处理这两个位置的数据;
132.基于该第一位置和该第二位置执行矩阵乘积操作,得到该第一处理结果。
133.其中,第一位置即式(1)中的a位置,第二位置即式(1)中的b位置。
134.以提取出来的第二矩阵和第四矩阵为例。第二矩阵规模为m*kfp_num,第四矩阵规模是kfp_num*n。矩阵相乘表示为:
135.第二矩阵(m*kfp_num)*第四矩阵(kfp_num*n)=处理结果(m*n)
136.其等价变换是两边取转置,即:第四矩阵的转置(n*kfp_num)*第二矩阵的转置(k_fp*m)=处理结果的转置(n*m);
137.由于调用的矩阵乘计算库支持列优先,也就是存储在显存上的数据,可以按列填充而非正常的按行填充,因此开启列优先选项执行矩阵乘积操作,即将第一矩阵映射到第一位置,并将第三矩阵映射到第二位置完成乘积操作,得到的是一个正常的矩阵,其结果在该计算库看来就是转置过的,也即得到的是正确的矩阵乘积运算的结果。
138.由此,基于本公开实施例,能够直接将第一矩阵放置在第一位置,并将第三矩阵放置在第二位置,以实现直接计算出所需的乘积,提高推理的速度。
139.同理,对该第二矩阵和该第四矩阵执行矩阵乘积操作,得到第二处理结果,可实施为:
140.将该第二矩阵映射到第三位置,并将该第四矩阵映射到第四位置;在矩阵乘积表
达式中该第三位置在该第四位置之前;该第三位置和该第四位置为矩阵乘积操作所需的存储空间;例如,执行矩阵乘积操作,需要将第二矩阵存储在第三位置,将第四矩阵存储在第四位置,以便于矩阵乘积操作,处理这两个位置的数据;
141.基于该第三位置和该第四位置执行矩阵乘积操作,得到该第二处理结果。
142.其中,第三位置即式(1)中的a位置,第四位置即式(1)中的b位置。
143.由此,基于本公开实施例,能够直接将第二矩阵放置在第三位置,并将第四矩阵放置在第四位置,以实现直接计算出所需的乘积,提高推理的速度。
144.综上所述,本公开实施例中数据处理框架的示意图,如图7所示,其中包括第一内核、第二内核和第三内核。
145.第一内核负责按行统计出激活矩阵的最值,并根据最值对每行进行量化,以得到第一矩阵。中第一矩阵中离群通道的值需要第一内核赋值为。,此外,第一内核需要并标记出离群通道。其中离群通道的标记基于one_hot for bit编码实现。
146.第二内核基于第一内核标记的离群通道,从激活矩阵中分离出第二矩阵,并从参数矩阵中分离出第四矩阵。并实现对第四矩阵中低精度参数值的反量化,以便于和第二矩阵执行矩阵乘积操作。
147.由gpu完成矩阵乘积操作,具体可由gpu调用计算库完成,由此得到第一处理结果和第二处理结果。然后由第三内核完成对第一处理结果和第二处理结果的融合。
148.综上所述,本公开实施例中,面向大模型推理进行了优化。本公开实施例可以完全不使用pytorch框架的小算子执行激活矩阵和参数矩阵的分离、量化和反量化操作。通过第一内核可以取代pytorch框架的scatter(赋值为0的算子)和unique(去重算子)。此处,由于pytorch框架得到的col_idx中会有重复值,因此在double_quant之后需要使用torch.unique去除重复值。本公开实施例中,激活矩阵所有特征通道的标记的默认值均为第二目标值(即0)并存储在可供第一内核共享的存储空间中。第一内核中每个线程得到离群通道标记后,会操作该存储空间以便于将该离群通道的值标记为1。每个线程在操作该存储空间时,可以将该离群通道的标记和存储空间中存储的标记执行或操作,已确定该存储空间中的标记和该线程确定的标记是否一致,在一致的情况下,不会更改存储空间的值,在不一致的情况下,将其修改为1。由此,本公开实施例中离群通道的标记不存在重复的值,无需去重操作。此外,本公开实施例能够实现对激活矩阵的量化和离群通道的标记。通过第二内核split可以替代slice算子和对参数矩阵的反量化操作,通过第三内核实现了pytorch框架的torch.add和对第一处理结果的反量化操作。
149.对于gpu而言,每一次启动kernel(内核)都会有launch kernel(发射或启动内核)的时间,同时,pytorch框架启动算子也会有一定的策略分发时间。这些调度所占用的时间可统称为调度耗时。也即,启动越多的gpu kernel/pytorch算子就会带来越多的调度耗时,本公开实施例中通过不使用pytorch框架且融合各类操作到少数几个kernel中可以有效降低调度耗时。如表1所示,为对比实验结果:
150.表1
151.表1中最后一行激活矩阵的规模几乎是当前大模型能够达到的最大规
[0152][0153]
模。通过数据对比可知,本公开实施例的方案相对于基于pytorch框架实现的方案,能够将推理速度提高一半,由此可实现计算资源的合理利用,并提高大模型的推理速度。
[0154]
此外,本公开实施例中,在第一内核中,使用blockreduce操作计算每一行absmax值并完成量化。在量化的同时基于激活值,统计超出threshold(阈值)的离群通道。所有特征通道是否是离群通道使用outlier_idx来表示,且仅占用1个bit来表示。统计的同时通过原子操作设置outlier_idx。outlier_idx里为1的bit标识了离群通道的位置。在此基础上,第二内核可以仅对这些标记为1的离群通道操作,以便于分离出离群的第二矩阵和第四矩阵。此外,由于使用1bit编码一个通道,outlier_idx对显存空间占用非常小。第二内核读写该值的时间也会非常小。同时,因为离群通道总数相对较小,相比于slice操作,第二内核可以只需要发射少量的thread即可完成操作,能够需要消耗较少的gpu资源。
[0155]
进一步的,本公开实施例中,只需要通过将第一矩阵或第二矩阵放置在a位置,将第三矩阵或第四矩阵放置在b的位置,即可实现矩阵乘积操作。此外,参数矩阵的转置可以在离线时进行,因此在分割出离群矩阵和第处理结果和第二处理结果融合的过程中可以不再涉及layout(转置)的转换。
[0156]
基于相同的技术构思,本公开实施例还提供一种数据处理装置800,如图8所示,包括:
[0157]
读取模块801,用于从存储介质中读取待处理对象关于目标神经网络层的激活矩阵,以及,读取该目标神经网络层的参数矩阵;该激活矩阵的数值精度为第一精度;该参数矩阵的数值精度为第二精度;该第二精度低于该第一精度;
[0158]
拆分模块802,用于采用至少一个内核将该激活矩阵分离为第一矩阵和第二矩阵,并从该参数矩阵中获取与该第一矩阵对应的第三矩阵,以及与该第二矩阵对应的第四矩阵;其中,该第一矩阵采用该第一精度,该第二矩阵采用该第二精度,该第一矩阵基于该激活矩阵中的非离群通道构建,该第二矩阵基于该激活矩阵中的离群通道构建;
[0159]
第一运算模块803,用于对该第一矩阵和该第三矩阵执行矩阵乘积操作,得到第一处理结果;以及,
[0160]
第二运算模块804,用于对该第二矩阵和该第四矩阵执行矩阵乘积操作,得到第二处理结果;
[0161]
融合模块805,用于将该第一处理结果和该第二处理结果进行融合,得到该目标神经网络层对该激活矩阵的数据处理结果。
[0162]
在一些实施例中,该拆分模块,包括:
[0163]
第一拆分子模块,用于采用第一内核从该激活矩阵中筛选出离群通道,并确定该
离群通道的标记,以构建该第一矩阵;
[0164]
第二拆分子模块,用于采用第二内核按该离群通道的标记,从该激活矩阵中提取出该离群通道,并基于该离群通道构建该第二矩阵;以及,
[0165]
第三拆分子模块,用于采用该第二内核按该离群通道的标记,从该参数矩阵中提取出与该第二矩阵对应的参数值,以构建该第四矩阵;
[0166]
其中,参数矩阵作为第三矩阵。
[0167]
在一些实施例中,该第一拆分子模块,具体用于:
[0168]
采用该第一内核启动l个线程块block,并在每个线程块内发射q个线程,其中:l小于或等于该激活矩阵的总行数,q小于或等于激活矩阵中同一行包含的激活值数,且每个block负责该激活矩阵中的至少一行激活值,每个线程负责至少一个激活值;
[0169]
针对该激活矩阵中的每行的激活值,采用对应的block执行以下操作:
[0170]
基于该block确定该行的激活值的最大值;
[0171]
控制该block内的每个线程,基于该最大值将该行的激活值内该线程负责的激活值量化为该第二精度,并将该离群通道对应的激活值设置为默认值,以得到该第一矩阵。
[0172]
在一些实施例中,该第一拆分子模块,具体用于,针对该第一内核中的每个线程,在该线程负责的激活值中,存在任一激活值大于预设阈值的情况下,由该线程将该任一激活值所在的列标识编码为离群通道的标记,以使得该离群通道的标记占用目标数量的比特位。
[0173]
在一些实施例中,该第一拆分子模块,具体用于:
[0174]
将该离群通道在该激活矩阵中的列标识编码为占用1个比特的第一目标值;
[0175]
其中,非离群通道在该激活矩阵中的列标识保持为占用1个比特的第二目标值。
[0176]
在一些实施例中,该第二拆分子模块,具体用于:
[0177]
采用该第二内核启动指定数量的线程,并分配该指定数量的线程中的m个线程分别执行以下操作:
[0178]
从该激活矩阵中抽取出该离群通道中与该线程对应的激活值;
[0179]
将该激活值按序存储到该第二矩阵中;
[0180]
其中,m为该激活矩阵中每列包含的激活值的数量。
[0181]
在一些实施例中,该第三拆分子模块,具体用于:
[0182]
采用该第二内核分配该指定数量的线程中的n个线程分别执行以下操作:
[0183]
确定该线程对应的离群通道的标记;
[0184]
按该离群通道的标记,从该参数矩阵中抽取出与该离群通道的标记和该线程均对应的参数值;
[0185]
对该参数值执行反量化操作后,按序存储到该第四矩阵中;
[0186]
其中,n为该参数矩阵中每行包含的激活值的数量。
[0187]
在一些实施例中,还包括,确定模块,用于采用该第二内核基于以下方法确定该指定数量:
[0188]
确定该激活矩阵中每列包含的激活值的数量,得到第一候选值;以及,
[0189]
确定该参数矩阵中每行包含的参数值的数量,得到第二候选值;
[0190]
选取该第一候选值和该第二候选值中的最大值,得到第三候选值;
[0191]
确定该指定数量为该第三候选值和该离群通道的总数的乘积。
[0192]
在一些实施例中,该第一运算模块,包括:
[0193]
第一映射子模块,用于将该第一矩阵映射到第一位置,并将该第三矩阵映射到第二位置;在矩阵乘积表达式中该第一位置在该第二位置之前;该第一位置和该第二位置为矩阵乘积操作所需的存储空间;
[0194]
第一运算子模块,用于基于该第一位置和该第二位置执行矩阵乘积操作,得到该第一处理结果。
[0195]
在一些实施例中,其中该第二运算模块,包括:
[0196]
第二映射子模块,用于将该第二矩阵映射到第三位置,并将该第四矩阵映射到第四位置;在矩阵乘积表达式中该第三位置在该第四位置之前;该第三位置和该第四位置为矩阵乘积操作所需的存储空间;
[0197]
第二运算子模块,用于基于该第三位置和该第四位置执行矩阵乘积操作,得到该第二处理结果。
[0198]
在一些实施例中,该融合模块,包括:
[0199]
反量化子模块,用于采用第三内核将该第一处理结果反量化为该第一精度,得到中间结果;以及,
[0200]
矩阵加子模块,用于采用该第三内核将该中间结果和该第二处理结果执行矩阵加操作。
[0201]
本公开实施例的装置的各模块、子模块的具体功能和示例的描述,可以参见上述方法实施例中对应步骤的相关描述,在此不再赘述。
[0202]
根据本公开的实施例,本公开还提供了一种电子设备、一种可读存储介质和一种计算机程序产品。
[0203]
图9示出了可以用来实施本公开的实施例的示例电子设备900的示意性框图。电子设备旨在表示各种形式的数字计算机,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字助理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本公开的实现。
[0204]
如图9所示,设备900包括计算单元901,其可以根据存储在只读存储器(rom)902中的计算机程序或者从存储单元908加载到随机访问存储器(ram)903中的计算机程序,来执行各种适当的动作和处理。在ram 903中,还可存储设备900操作所需的各种程序和数据。计算单元901、rom 902以及ram 903通过总线904彼此相连。输入/输出(i/o)接口905也连接至总线904。
[0205]
设备900中的多个部件连接至i/o接口905,包括:输入单元906,例如键盘、鼠标等;输出单元907,例如各种类型的显示器、扬声器等;存储单元908,例如磁盘、光盘等;以及通信单元909,例如网卡、调制解调器、无线通信收发机等。通信单元909允许设备900通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。
[0206]
计算单元901可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单元901的一些示例包括但不限于中央处理单元(cpu)、图形处理单元(gpu)、各种专用的人工
智能(ai)计算芯片、各种运行机器学习模型算法的计算单元、数字信号处理器(dsp)、以及任何适当的处理器、控制器、微控制器等。计算单元901执行上文所描述的各个方法和处理,例如数据处理方法。例如,在一些实施例中,数据处理方法可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元908。在一些实施例中,计算机程序的部分或者全部可以经由rom 902和/或通信单元909而被载入和/或安装到设备900上。当计算机程序加载到ram 903并由计算单元901执行时,可以执行上文描述的数据处理方法的一个或多个步骤。备选地,在其他实施例中,计算单元901可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行数据处理方法。
[0207]
本文中以上描述的系统和技术的各种实施方式可以在数字电子电路系统、集成电路系统、现场可编程门阵列(fpga)、专用集成电路(asic)、专用标准产品(assp)、芯片上系统的系统(soc)、复杂可编程逻辑设备(cpld)、计算机硬件、固件、软件、和/或它们的组合中实现。这些各种实施方式可以包括:实施在一个或者多个计算机程序中,该一个或者多个计算机程序可在包括至少一个可编程处理器的可编程系统上执行和/或解释,该可编程处理器可以是专用或者通用可编程处理器,可以从存储系统、至少一个输入装置、和至少一个输出装置接收数据和指令,并且将数据和指令传输至该存储系统、该至少一个输入装置、和该至少一个输出装置。
[0208]
用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
[0209]
在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom或快闪存储器)、光纤、便捷式紧凑盘只读存储器(cd-rom)、光学储存设备、磁储存设备、或上述内容的任何合适组合。
[0210]
为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,crt(阴极射线管)或者lcd(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入、或者触觉输入)来接收来自用户的输入。
[0211]
可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部
件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(lan)、广域网(wan)和互联网。
[0212]
计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。服务器可以是云服务器,也可以为分布式系统的服务器,或者是结合了区块链的服务器。
[0213]
应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本公开中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本公开公开的技术方案所期望的结果,本文在此不进行限制。
[0214]
上述具体实施方式,并不构成对本公开保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本公开的原则之内所作的修改、等同替换和改进等,均应包含在本公开保护范围之内。

技术特征:
1.一种数据处理方法,包括:从存储介质中读取待处理对象关于目标神经网络层的激活矩阵,以及,读取所述目标神经网络层的参数矩阵;所述激活矩阵的数值精度为第一精度;所述参数矩阵的数值精度为第二精度;所述第二精度低于所述第一精度;采用至少一个内核将所述激活矩阵分离为第一矩阵和第二矩阵,并从所述参数矩阵中获取与所述第一矩阵对应的第三矩阵,以及与所述第二矩阵对应的第四矩阵;其中,所述第一矩阵采用所述第一精度,所述第二矩阵采用所述第二精度,所述第一矩阵基于所述激活矩阵中的非离群通道构建,所述第二矩阵基于所述激活矩阵中的离群通道构建;对所述第一矩阵和所述第三矩阵执行矩阵乘积操作,得到第一处理结果;以及,对所述第二矩阵和所述第四矩阵执行矩阵乘积操作,得到第二处理结果;将所述第一处理结果和所述第二处理结果进行融合,得到所述目标神经网络层对所述激活矩阵的数据处理结果。2.根据权利要求1所述的方法,其中,所述采用至少一个内核将所述激活矩阵分离为第一矩阵和第二矩阵,并从所述参数矩阵中获取与所述第一矩阵对应的第三矩阵,以及与所述第二矩阵对应的第四矩阵,包括:采用所述第一内核从所述激活矩阵中筛选出离群通道,并确定所述离群通道的标记,以构建所述第一矩阵;采用第二内核按所述离群通道的标记,从所述激活矩阵中提取出所述离群通道,并基于所述离群通道构建所述第二矩阵;以及,采用所述第二内核按所述离群通道的标记,从所述参数矩阵中提取出与所述第二矩阵对应的参数值,以构建所述第四矩阵;其中,所述参数矩阵为所述第三矩阵。3.根据权利要求2所述的方法,其中,采用第一内核构建所述第一矩阵,包括:采用所述第一内核启动l个线程块block,并在每个线程块内发射q个线程,其中:l小于或等于所述激活矩阵的总行数,q小于或等于激活矩阵中同一行包含的激活值数,且每个block负责所述激活矩阵中的至少一行激活值,每个线程负责至少一个激活值;针对所述激活矩阵中的每行的激活值,采用对应的block执行以下操作:基于所述block确定所述行的激活值的最大值;控制所述block内的每个线程,基于所述最大值将所述行的激活值内所述线程负责的激活值量化为所述第二精度,并将所述离群通道对应的激活值设置为默认值,以得到所述第一矩阵。4.根据权利要求2或3所述的方法,其中,采用所述第一内核从所述激活矩阵中筛选出离群通道,并确定所述离群通道的标记,包括:针对所述第一内核中的每个线程,在所述线程负责的激活值中,存在任一激活值大于预设阈值的情况下,由所述线程将所述任一激活值所在的列标识编码为离群通道的标记,以使得所述离群通道的标记占用目标数量的比特位。5.根据权利要求4所述的方法,其中,所述将任一激活值所在的列标识编码为离群通道的标记,包括:将所述离群通道在所述激活矩阵中的列标识编码为占用1个比特的第一目标值;
其中,非离群通道在所述激活矩阵中的列标识保持为占用1个比特的第二目标值。6.根据权利要求2-5中任一项所述的方法,其中,所述采用第二内核按所述离群通道的标记,从所述激活矩阵中提取出所述离群通道,并基于所述离群通道构建所述第二矩阵,包括:采用所述第二内核启动指定数量的线程,并分配所述指定数量的线程中的m个线程分别执行以下操作:从所述激活矩阵中抽取出所述离群通道中与所述线程对应的激活值;将所述激活值按序存储到所述第二矩阵中;其中,m为所述激活矩阵中每列包含的激活值的数量。7.根据权利要求6所述的方法,其中,所述采用所述第二内核按所述离群通道的标记,从所述参数矩阵中提取出与所述第二矩阵对应的参数值,以构建所述第四矩阵,包括:采用所述第二内核分配所述指定数量的线程中的n个线程分别执行以下操作:确定所述线程对应的离群通道的标记;按所述离群通道的标记,从所述参数矩阵中抽取出与所述离群通道的标记和所述线程均对应的参数值;对所述参数值执行反量化操作后,按序存储到所述第四矩阵中;其中,n为所述参数矩阵中每行包含的激活值的数量。8.根据权利要求6或7所述的方法,还包括,采用所述第二内核基于以下方法确定所述指定数量:确定所述激活矩阵中每列包含的激活值的数量,得到第一候选值;以及,确定所述参数矩阵中每行包含的参数值的数量,得到第二候选值;选取所述第一候选值和所述第二候选值中的最大值,得到第三候选值;确定所述指定数量为所述第三候选值和所述离群通道的总数的乘积。9.根据权利要求1-8中任一项所述的方法,其中,所述对所述第一矩阵和所述第三矩阵执行矩阵乘积操作,得到第一处理结果,包括:将所述第一矩阵映射到第一位置,并将所述第三矩阵映射到第二位置;在矩阵乘积表达式中所述第一位置在所述第二位置之前;所述第一位置和所述第二位置为矩阵乘积操作所需的存储空间;基于所述第一位置和所述第二位置执行矩阵乘积操作,得到所述第一处理结果。10.根据权利要求1-9中任一项所述的方法,其中对所述第二矩阵和所述第四矩阵执行矩阵乘积操作,得到第二处理结果,包括:将所述第二矩阵映射到第三位置,并将所述第四矩阵映射到第四位置;在矩阵乘积表达式中所述第三位置在所述第四位置之前;所述第三位置和所述第四位置为矩阵乘积操作所需的存储空间;基于所述第三位置和所述第四位置执行矩阵乘积操作,得到所述第二处理结果。11.根据权利要求1-10中任一项所述的方法,其中,所述将所述第一处理结果和所述第二处理结果进行融合,包括:采用第三内核将所述第一处理结果反量化为所述第一精度,得到中间结果;以及,采用所述第三内核将所述中间结果和所述第二处理结果执行矩阵加操作。
12.一种数据处理装置,包括:读取模块,用于从存储介质中读取待处理对象关于目标神经网络层的激活矩阵,以及,读取所述目标神经网络层的参数矩阵;所述激活矩阵的数值精度为第一精度;所述参数矩阵的数值精度为第二精度;所述第二精度低于所述第一精度;拆分模块,用于采用至少一个内核将所述激活矩阵分离为第一矩阵和第二矩阵,并从所述参数矩阵中获取与所述第一矩阵对应的第三矩阵,以及与所述第二矩阵对应的第四矩阵;其中,所述第一矩阵采用所述第一精度,所述第二矩阵采用所述第二精度,所述第一矩阵基于所述激活矩阵中的非离群通道构建,所述第二矩阵基于所述激活矩阵中的离群通道构建;第一运算模块,用于对所述第一矩阵和所述第三矩阵执行矩阵乘积操作,得到第一处理结果;以及,第二运算模块,用于对所述第二矩阵和所述第四矩阵执行矩阵乘积操作,得到第二处理结果;融合模块,用于将所述第一处理结果和所述第二处理结果进行融合,得到所述目标神经网络层对所述激活矩阵的数据处理结果。13.根据权利要求12所述的装置,其中,所述拆分模块,包括:第一拆分子模块,用于采用第一内核从所述激活矩阵中筛选出离群通道,并确定所述离群通道的标记,以构建所述第一矩阵;第二拆分子模块,用于采用第二内核按所述离群通道的标记,从所述激活矩阵中提取出所述离群通道,并基于所述离群通道构建所述第二矩阵;以及,第三拆分子模块,用于采用所述第二内核按所述离群通道的标记,从所述参数矩阵中提取出与所述第二矩阵对应的参数值,以构建所述第四矩阵;其中,所述参数矩阵为所述第三矩阵。14.根据权利要求13所述的装置,其中,所述第一拆分子模块,具体用于:采用所述第一内核启动l个线程块block,并在每个线程块内发射q个线程,其中:l小于或等于所述激活矩阵的总行数,q小于或等于激活矩阵中同一行包含的激活值数,且每个block负责所述激活矩阵中的至少一行激活值,每个线程负责至少一个激活值;针对所述激活矩阵中的每行的激活值,采用对应的block执行以下操作:基于所述block确定所述行的激活值的最大值;控制所述block内的每个线程,基于所述最大值将所述行的激活值内所述线程负责的激活值量化为所述第二精度,并将所述离群通道对应的激活值设置为默认值,以得到所述第一矩阵。15.根据权利要求13或14所述的装置,其中,所述第一拆分子模块,具体用于,针对所述第一内核中的每个线程,在所述线程负责的激活值中,存在任一激活值大于预设阈值的情况下,由所述线程将所述任一激活值所在的列标识编码为离群通道的标记,以使得所述离群通道的标记占用目标数量的比特位。16.根据权利要求15所述的装置,其中,所述第一拆分子模块,具体用于:将所述离群通道在所述激活矩阵中的列标识编码为占用1个比特的第一目标值;其中,非离群通道在所述激活矩阵中的列标识保持为占用1个比特的第二目标值。
17.根据权利要求13-16中任一项所述的装置,其中,所述第二拆分子模块,具体用于:采用所述第二内核启动指定数量的线程,并分配所述指定数量的线程中的m个线程分别执行以下操作:从所述激活矩阵中抽取出所述离群通道中与所述线程对应的激活值;将所述激活值按序存储到所述第二矩阵中;其中,m为所述激活矩阵中每列包含的激活值的数量。18.根据权利要求17所述的装置,其中,所述第三拆分子模块,具体用于:采用所述第二内核分配所述指定数量的线程中的n个线程分别执行以下操作:确定所述线程对应的离群通道的标记;按所述离群通道的标记,从所述参数矩阵中抽取出与所述离群通道的标记和所述线程均对应的参数值;对所述参数值执行反量化操作后,按序存储到所述第四矩阵中;其中,n为所述参数矩阵中每行包含的激活值的数量。19.根据权利要求17或18所述的装置,还包括,确定模块,用于采用所述第二内核基于以下方法确定所述指定数量:确定所述激活矩阵中每列包含的激活值的数量,得到第一候选值;以及,确定所述参数矩阵中每行包含的参数值的数量,得到第二候选值;选取所述第一候选值和所述第二候选值中的最大值,得到第三候选值;确定所述指定数量为所述第三候选值和所述离群通道的总数的乘积。20.根据权利要求12-19中任一项所述的装置,其中,所述第一运算模块,包括:第一映射子模块,用于将所述第一矩阵映射到第一位置,并将所述第三矩阵映射到第二位置;在矩阵乘积表达式中所述第一位置在所述第二位置之前;所述第一位置和所述第二位置为矩阵乘积操作所需的存储空间;第一运算子模块,用于基于所述第一位置和所述第二位置执行矩阵乘积操作,得到所述第一处理结果。21.根据权利要求12-20中任一项所述的装置,其中,所述第二运算模块,包括:第二映射子模块,用于将所述第二矩阵映射到第三位置,并将所述第四矩阵映射到第四位置;在矩阵乘积表达式中所述第三位置在所述第四位置之前;所述第三位置和所述第四位置为矩阵乘积操作所需的存储空间;第二运算子模块,用于基于所述第三位置和所述第四位置执行矩阵乘积操作,得到所述第二处理结果。22.根据权利要求12-21中任一项所述的装置,其中,所述融合模块,包括:反量化子模块,用于采用第三内核将所述第一处理结果反量化为所述第一精度,得到中间结果;以及,矩阵加子模块,用于采用所述第三内核将所述中间结果和所述第二处理结果执行矩阵加操作。23.一种电子设备,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行权利要求1-11中任一项所述的方法。24.一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使所述计算机执行根据权利要求1-11中任一项所述的方法。25.一种计算机程序产品,包括计算机程序,所述计算机程序在被处理器执行时实现根据权利要求1-11中任一项所述的方法。

技术总结
本公开提供了数据处理方法、装置、电子设备以及存储介质,涉及数据处理技术领域,尤其涉及人工智能、深度学习、模型推理优化等技术领域。具体实现方案为:从存储介质中读取待处理对象的激活矩阵,以及目标神经网络层的参数矩阵;采用至少一个内核从激活矩阵中分离出第一矩阵和第二矩阵,并从参数矩阵中分离出第三矩阵和第四矩阵;对第一矩阵和第三矩阵执行矩阵乘积操作,得到第一处理结果;对第二矩阵和第四矩阵执行矩阵乘积操作,得到第二处理结果;将第一处理结果和第二处理结果进行融合,得到目标神经网络层对激活矩阵的数据处理结果。本公开实施例可节约存储空间的同时,加速大模型的推理速度,以提高资源的利用率。以提高资源的利用率。以提高资源的利用率。


技术研发人员:吴飞圣 邓凯鹏 党青青 于佃海 马艳军 王海峰
受保护的技术使用者:北京百度网讯科技有限公司
技术研发日:2023.05.19
技术公布日:2023/8/6
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐