发明内容
为了解决现有技术中输出数据存在垃圾数,造成输出带宽的浪费的问题,本申请提供一种神经网络输出数据的处理方法、装置及芯片。
第一方面,本申请实施例提供一种神经网络输出数据的处理方法,包括:
在获取针对图像数据的卷积运算的输出数据后,如果所述输出数据中包括填充输出通道导致的第一垃圾数,删除所述输出数据中的所述第一垃圾数;
将各个像素对应的所述输出数据分别缓存至所述像素对应的缓存单元中,其中,所述缓存单元的数量与卷积运算的像素维度的并行度相关;
根据各个所述像素在所述图像数据中的排序,从各个所述缓存单元中读取各个所述像素分别对应的所述输出数据。
在一种可选的设计中,所述从各个所述缓存单元中读取各个所述像素分别对应的所述输出数据,包括:
若所述输出数据中包括填充像素导致的第二垃圾数,读取第一缓存单元中的输出数据,所述缓存单元包括至少一个所述第一缓存单元和至少一个第二缓存单元,所述第二缓存单元用于缓存所述第二垃圾数。
在一种可选的设计中,在所述删除所述输出数据中的第一垃圾数之前,还包括:
确定所述输出通道的数量是否为输出通道维度的并行度的整数倍;
若所述输出通道的数量并非所述输出通道维度的并行度的整数倍,根据所述输出通道的数量和所述输出通道维度的并行度,确定所述第一垃圾数。
在一种可选的设计中,在所述删除所述输出数据中的第一垃圾数之前,还包括:
计算所述卷积运算的量化精度与所述输出通道的数量的乘积;
若所述乘积小于标准数据量,基于所述乘积和所述标准数据量的差值,确定所述第一垃圾数,所述标准数据量为满足所述像素的数据量对齐要求时的数据量。
在一种可选的设计中,所述删除所述输出数据中的第一垃圾数,包括:
删除各个计算周期输出的所述输出数据中,各个所述像素的最后n个输出通道对应的数据,n为所述第一垃圾数占据的所述输出通道的数量。
在一种可选的设计中,所述从各个所述缓存单元中读取各个所述像素分别对应的所述输出数据,包括:
在所述图像数据中的一行像素对应的所述输出数据全部缓存至所述缓存单元中后,依次从各个所述缓存单元中读取所述输出数据;
或者,
若用于向存储模块传输所述输出数据的总线支持地址跳写,在至少一个缓存单元中存在所述输出数据时,从所述缓存单元中读取所述输出数据;
或者,
在确定所述总线处于空闲状态之后,从所述缓存单元中读取所述输出数据。
第二方面,本申请实施例提供一种神经网络输出数据的处理装置,包括:
依次连接的数据处理模块、数据缓存模块和数据读取模块;
其中,所述数据处理模块用于在在获取针对图像数据的卷积运算的输出数据后,如果所述输出数据中包括填充输出通道导致的第一垃圾数,删除所述输出数据中的所述第一垃圾数;
所述数据缓存模块包括缓存单元,用于获取所述数据处理模块输出的所述输出数据,并将各个像素对应的所述输出数据分别缓存至所述像素对应的所述缓存单元中,所述缓存单元的数量与卷积运算的像素维度的并行度相关;
所述数据读取模块用于根据各个所述像素在所述图像数据中的排序,从各个所述缓存单元中读取各个所述像素分别对应的所述输出数据。
在一种可选的设计中,若所述输出数据中包括填充像素导致的第二垃圾数,所述数据读取模块从各个所述缓存单元中读取所述输出数据,包括:
所述数据读取模块读取第一缓存单元中的输出数据,所述缓存单元包括至少一个所述第一缓存单元和至少一个第二缓存单元,所述第二缓存单元用于缓存所述第二垃圾数。
在一种可选的设计中,所述数据处理模块删除所述输出数据中的第一垃圾数,包括:
删除各个计算周期输出的所述输出数据中,各个所述像素的最后n个输出通道对应的数据,n为所述第一垃圾数占据的所述输出通道的数量。
在一种可选的设计中,所述数据处理模块包括PP个数据处理单元,PP为卷积运算的像素维度的并行度,在各个所述计算周期内,所述数据处理单元分别用于获取其对应的像素的所述输出数据;
与所述计算周期内最后一个像素相对应的所述数据处理单元在获取所述输出数据后,删除所述输出数据中最后n个输出通道对应的数据。
第三方面,本申请实施例提供一种芯片,所述芯片包括如第二方面所述的神经网络输出数据的处理装置;
在所述芯片应用至电子设备中处理数据时,所述芯片执行如第一方面所述的神经网络输出数据的处理方法。
通过本申请实施例提供的方案,能够实现对输出数据的处理,该处理过程中,能够删除输出数据中包含的第一垃圾数,从而减少输出数据中包含的垃圾数,进而减少输出带宽的浪费。
另外,在现有技术的方案中,需要额外设置整形模块,以便对各个cycle输出的数据进行格式转换,得到HWC格式的数据,从而影响了神经网络的性能。
而通过本申请实施例提供的方案,将各个像素对应的输出数据分别缓存至该像素对应的缓存单元中,并且根据各个像素在图像数据中的排序,从各个缓存单元中读取各个像素分别对应的输出数据,从而能够使读取的输出数据符合HWC格式,实现格式的转换,因此无需额外配置整形模块,相应的能够提高神经网络的性能。
进一步的,如果CNN可支持多种量化精度的量化处理,不同量化精度可能导致需要在OC维度填充不同的垃圾数,以及PO不同时,也可能需要在OC维度填充不同的垃圾数。而在不同量化精度或不同的PO的情况下,本申请实施例提供的方案均可删除第一垃圾数,因此通用性较强。
具体实施方式
为了使本技术领域的人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
需说明,在下面的描述中阐述了很多具体细节以便于充分理解本申请,但是,本申请还可以采用其他不同于在此描述的其他方式来实施,因此,本申请的保护范围并不受下面公开的具体实施方式的限制。
在本申请中如涉及“第一”、“第二”等的描述仅用于描述目的,而不能理解为指示或暗示其相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。
为便于对申请的技术方案进行,以下首先在对本申请所涉及到的一些概念进行说明。
卷积神经网络(Convolutional Neural Network,CNN)是一种广泛应用于图像识别、语音识别、自然语言处理等领域的深度学习模型,其核心层为卷积层,该卷积层可用于图像数据(feature)和权重(weight)之间的乘加计算。其中,卷积层通常包括以下参数:
1. 卷积核(kernel/filter):卷积核是卷积层中最重要的参数之一,用于对输入数据进行卷积操作,以便提取输入数据对应的特征。卷积核通常是一个三维张量,其中第一维表示卷积核的数量,第二维和第三维表示卷积核的大小。
2. 输入通道(input_channel,IC)数:输入通道数也是卷积层中的一个参数,表示输入数据的通道数。例如,在RGB图像分类任务中,输入通道数为3,表示输入数据的每个像素由3个通道(分别为红色通道、绿色通道和蓝色通道)组成。
3. 输出通道(output_channel,OC)数:输出通道数是卷积层的另一个参数,表示卷积操作的输出通道数。输出通道数通常等于卷积核的数量。
4. 卷积步长(stride):卷积步长是卷积操作中卷积核移动的步长,用于控制输出特征图的大小。卷积步长通常是一个二元组,分别表示在水平和垂直方向上的移动步长。
5. 填充(padding):填充是卷积操作中的一种操作,用于在输入数据的边缘填充一定的值,从而扩大输入数据的大小。填充通常是一个二元组,分别表示在水平和垂直方向上的填充大小。
卷积层的计算量通常占据CNN的计算量的绝大部分,因此,CNN出现性能瓶颈一般也是由该卷积层的计算引起的,因此,卷积层的计算速度对于CNN的性能具有决定意义。
为了提高卷积层的计算效率,以提高CNN的性能,可采用以下方式:
(方式1)算法优化:算法优化是一种通过改进卷积运算的算法来提高计算效率的方法。例如,可以使用Winograd变换、FFT变换等方法来减少卷积运算的乘法和加法的运算次数,从而提高计算效率。
(方式2)数据布局优化:数据布局优化是一种通过调整输入数据和卷积核的存储方式来提高计算效率的方法。例如,可以使用im2col方法将输入数据转换为矩阵形式,从而可以利用矩阵乘法的高效性来加速卷积运算。
(方式3)剪枝压缩:剪枝压缩是一种通过减少卷积神经网络参数数量来降低计算量的方法。例如,可以使用剪枝、量化等方法来减少卷积层中的参数数量,从而降低计算量。
其中,卷积神经网络的量化是一种将卷积神经网络中的浮点数转换为定点数或整数的技术,该技术可以在保证精度的前提下,降低卷积神经网络计算的复杂度和存储需求,从而提高卷积神经网络的运行速度和效率。量化精度是指量化后的定点数或整数的位数,通常包括8位、16位、32位等。在实际的应用场景中,针对不同的应用需求,可以选择不同的量化精度。相应的,如果卷积神经网络支持多种量化精度,则该卷积神经网络也需要支持多种数据格式,不同数据格式对应的数据位数不同。
(方式4)并行计算:并行计算是一种通过将卷积运算分成多个部分进行并行计算来提高计算效率的方法。
从上述对卷积层的参数的介绍可以看出,CNN可通过多个维度同时进行并行计算,例如,针对IC维度,可并行计算多个IC;针对OC维度,可并行计算多个OC;并且,针对像素维度,还可并行计算一行图像数据中包括的多个像素(即Pixel),这一维度可称为feature_map维度。具体来说,该并行计算指的是CNN中的卷积运算模块在每个计算周期(即cycle)可以完成多个IC,多个OC和多个Pixel的计算,其中多个Pixel指特征图(feature_map)中一行的多个Pixel。
进一步的,在CNN进行实际的卷积运算的过程中,为了提高计算效率,可同时采用上述不同的方式,例如,可同时采用方式3中的量化和方式4中并行计算的方法。
另外,CNN一般包括多个卷积层,为便于计算,每一卷积层的数据格式需要保持统一,为了满足这一需求,每一卷积层输出的输出数据通常为统一的格式。其中,卷积层的输出数据可以为HWC格式。HWC(Height-Width-Channel)格式是一种常见的存储格式,该格式可将神经网络的输入数据和权重数据按照Height(高度)、Width(宽度)、Channel(通道数)的顺序分别存储在一个三维数组中。
具体来说,对于一个HWC格式的输入数据,其数据存储顺序为从左到右、从上到下、从通道1到通道N的顺序。例如,对于一个尺寸为H x W x C的输入数据,其在内存中的存储顺序为:第一个像素(Pixel)的N个channel的数值、第二个像素的N个channel的数值、......、第(HxW)个像素的N个channel的数值。
为了明确CNN进行卷积运算以及数据输出的过程,公开图1。参见图1,目前卷积运算及数据输出过程中涉及的器件包括卷积运算模块、输出缓存模块和片上缓存。该卷积运算模块为卷积层中用于进行卷积运算的模块,该卷积运算模块可接收输入的图像数据和权重,对接收的数据进行并行的卷积运算,该并行计算在IC,OC和feature_map三个维度的并行度分别为PI,PO和PP,即可将输入通道IC维度的并行度称为PI,将输出通道OC维度的并行度称为PO,以及将像素feature_map维度的并行度称为PP。
卷积运算模块通过卷积运算之后,得到输出数据,并将该输出数据输出至输出缓存模块。由于卷积运算模块进行并行计算时,在OC和feature_map这两个维度的并行度分别为PO和PP,则卷积运算模块在每个cycle输出的输出数据包括PP个Pixel,每个Pixel对应PO个OC。
输出缓存模块在接收到卷积运算模块每个cycle输出的输出数据后,缓存该输出数据。由于需要每一卷积层的数据格式保持统一,在输出缓存模块中需设置整形单元,该整形单元对缓存的输出数据进行数据整形处理,将各个cycle输出的输出数据的数据格式整形为HWC,然后输出缓存模块将HWC格式的输出数据传输至片上缓存。
另外,为了明确卷积运算中卷积运算模块输出的数据格式,还公开一个示例。在该示例中,假设IC,OC和Pixel的并行度均为8,即每个cycle可完成8个IC,8个OC和一行feature_map中8个Pixel的卷积运算。
另外,在该示例中,还可采用量化计算,量化精度为8bit,则卷积运算模块每个cycle可以输出8个Pixel,每个Pixel包含8个OC,每个OC占8bit。设输出通道数量OC_num=16,那么在这一示例中,卷积运算模块的输出数据的格式如图2所示。
其中,图2中的Pixel0表示像素0,Pixel1表示像素1,Pixel2表示像素2,……,Pixel15表示像素15,OC0表示输出通道0,OC1表示输出通道1,OC2表示输出通道2,……,OC15表示输出通道15,Pixel0-OC0表示像素0对应输出通道0的计算结果,Pixelm-OCn表示像素m对应输出通道n的计算结果。
参见图2,第一个cycle(即cycle0)输出的输出数据包括:像素0至像素7这8个像素分别对应的输出通道0至输出通道7的计算结果;第二个cycle(即cycle1)输出的输出数据包括:像素0至像素7这8个像素分别对应的输出通道8至输出通道15的计算结果;第三个cycle(即cycle2)输出的输出数据包括:像素8至像素15这8个像素分别对应的输出通道0至输出通道7的计算结果;第四个cycle(即cycle3)输出的输出数据包括:像素8至像素15这8个像素分别对应的输出通道8至输出通道15的计算结果。并且,由于量化精度为8,则每个像素对应的每个输出通道的输出数据为8bit。
卷积运算模块在按照图2所示的格式对输出数据进行缓存后,再对输出数据进行整形处理,以输出HWC格式的数据。在这一示例中,HWC格式的数据可如图3所示。
但是,在实际的卷积运算过程中,卷积运算模块可能产生垃圾数。根据上述对卷积运算模块输出的数据格式以及对HWC格式的介绍可知,整形成HWC格式的数据需要满足以下两点对齐要求:(1)OC维度的并行度PO符合对齐要求;(2)每行数据的行宽(即像素点的数量)需要符合对齐要求。如果任意一点不符合对齐要求,则会产生垃圾数。
相应的,垃圾数包括2种:一种是OC垃圾数,当输出通道的数量OC_num不是PO的整数倍时,需要对各个cycle输出的每个像素的计算结果进行OC的填充,导致输出的每个像素中会包含OC垃圾数,并且,该OC垃圾数位于每个像素的计算结果之后。例如,输出通道的数量OC_num=20,PO为8,则卷积运算模块会为每个像素输出24个OC的数据,其中每个像素的前20个OC的数据为该像素的计算结果,最后4个OC的数据是额外填充的垃圾数,可称为OC垃圾数。
或者,如果对一个像素的输出数据量有对齐的要求,也可能需要在OC维度进行填充(padding)。例如:要求每个像素的输出数据量为256bit的整数倍,当OC_num=24,量化精度为8bit时,则每个像素的数据量为24×8=192bit,则需要将每个像素的数据量补齐到256bit,这种情况下,可对每个Pixel进行OC填充,以使卷积运算模块会为每个像素输出32个OC的数据,其中前24个OC的数据为该像素的计算结果,最后8个OC的数据是为该像素额外填充的垃圾数,该垃圾数也可称为OC垃圾数。
另外,OC垃圾数通常被填充至各个像素的计算结果后。
例如,参见图2所示的示例,第一个cycle(即cycle0)输出的输出数据包括:像素0至像素7这8个像素分别对应的输出通道0至输出通道7的计算结果,如果需要对像素0至像素7填充OC垃圾数,则填充的OC垃圾数位于像素0至像素7的计算结果之后,即填充的OC垃圾数位于输出通道7对应的计算结果之后。
另一种是Pixel垃圾数,当输出的特征图(output feature map,ofm)的行宽ofm_width不是feature_map这一维度的并行度PP的整数倍时,会在每行的最后填充像素,以使填充后的像素总数为PP的整数倍,因此,每行数据都会产生Pixel垃圾数,该Pixel垃圾数为在每行像素最后填充的像素的输出数据。例如,PP=8,ofm_width=27时,会在每行的最后填充5个像素,以使填充后的像素总数(即27+5=32)为PP的整数倍,每行填充的5个像素的输出数据即可称为Pixel垃圾数。
也就是说,CNN在进行并行计算时,容易产生垃圾数,如果输出数据中夹带垃圾数的话,会浪费输出带宽。
为了解决现有技术中,CNN在进行并行计算时,容易产生垃圾数,输出数据中夹带垃圾数的话,会浪费输出带宽的问题,本申请提供一种神经网络输出数据的处理方法。
该方法可应用于各种通过CNN进行卷积运算的器件,例如,可应用于神经网络处理器(Neural Processing Unit,NPU),NPU是一种专门用于神经网络计算的硬件加速器。另外,该方法还可应用于图形处理器(Graphics Processing Unit,GPU)和系统级芯片(System on Chip,SoC)等。
参见图4所示的工作流程示意图,该方法包括以下步骤:
步骤S11、在获取针对图像数据的卷积运算的输出数据后,如果所述输出数据中包括填充输出通道导致的第一垃圾数,删除所述输出数据中的所述第一垃圾数。
其中,第一垃圾数即为上述的OC垃圾数,即填充OC导致的垃圾数。
该步骤可在对图像数据进行卷积运算的过程中执行,以便实时对各个卷积运算模块的输出数据进行处理。例如,当在OC维度和像素维度通过并行计算的方式进行卷积运算时,可在输出其中一个计算周期cycle的输出数据之后,就执行步骤S11。
另外,第一垃圾数为在OC维度进行填充所导致的垃圾数,而在OC维度进行填充时,通常是在各个像素的计算结果后进行填充,该计算结果与填充的数据共同构成像素的输出数据,也就是说,第一垃圾数所占据的输出通道为各个像素的输出数据的最后几个输出通道。这种情况下,删除输出数据中的第一垃圾数,可包括以下操作:
删除各个计算周期输出的所述输出数据中,各个像素的最后n个输出通道对应的数据,n为所述第一垃圾数占据的所述输出通道的数量。
通过该操作,仅对各个像素的最后n个输出通道的数据进行删除操作,即可删除第一垃圾数据。
例如,输出通道的数量OC_num=20,PO为8,则卷积运算模块会为每个像素输出24个OC的数据,其中每个像素的前20个OC的数据为该像素的计算结果,最后4个OC的数据是OC垃圾数,则可为该像素删除最后4个OC对应的数据,从而实现删除各个像素的OC垃圾数。
步骤S12、将各个像素对应的所述输出数据分别缓存至所述像素对应的缓存单元中,其中,所述缓存单元的数量与卷积运算的像素维度的并行度相关。
在本申请实施例中,为各个像素分别设置相应的缓存单元,以便可将各个像素对应的所述输出数据分别缓存至相应的缓存单元中。
在一种可行的设计中,为各个卷积运算模块分别配置相应的缓存单元,一个卷积运算模块对应的缓存单元的数量与像素维度的并行度相等,该卷积运算模块为卷积层中用于进行卷积运算的器件。例如,如果像素维度的并行度为8,即一个卷积运算模块在一个计算周期(cycle)可并行计算一行图像数据中的8个像素,则为该卷积运算模块配置的缓存单元的数量也为8,每个计算周期输出的各个像素对应的输出数据分别缓存至该像素对应的缓存单元中。
或者,在另一种可行的设计中,一个卷积运算模块对应的缓存单元的数量不小于像素维度的并行度,即如果像素维度的并行度为8,则缓存单元的数量等于或者大于8,以保障不同像素对应的输出数据分别缓存不同缓存单元中。
通过上述两种设计,可使某一像素对应的输出数据只写入相应的缓存单元中。例如,如果像素维度的并行度为8,即某一卷积运算模块在一个计算周期内对Pixel0至Pixel7这8个像素进行卷积运算,则可为该卷积运算模块配置buffer0至buffer7这8个缓存单元,在缓存过程中,Pixel0的输出数据只缓存至buffer0中,Pixel1的输出数据只缓存至buffer1中,依此类推。
另外,缓存单元对应的输入数据带宽和输出数据带宽可能不一致,需要各个缓存单元能够pingpong(即乒乓)使用。
pingpong是一种应用于数据流控制的技术,该技术中,输入数据流可被分配至两个数据缓冲区,例如,在第一个缓冲周期,将输入数据流缓存至“数据缓冲模块1”;在第2个缓冲周期,将输入数据流缓存至“数据缓冲模块2”,同时将“数据缓冲模块1”缓存的第1个周期的输入数据流作为输出数据流,将其输出至后续模块进行处理;在第3个缓冲周期,再将输入数据流缓存至“数据缓冲模块1”,以及将“数据缓冲模块2”缓存的第2个周期的输入数据流作为输出数据流,将其输出至后续模块进行处理,如此循环。
通过该技术,输入数据流和输出数据流都是连续不断的,传输过程中没有任何停顿或停顿较少,可实现数据的无缝缓冲。
为了实现各个缓存单元能够pingpong使用,缓存单元的容量大小与每个Pixel的最大数据量有关。通常情况下,缓存单元的容量不小于每个Pixel的最大数据量,以使单个缓存单元能够缓存单个Pixel的全部数据。例如,假设每个Pixel最大数据量为1024bit,则每个缓存单元容量为2048bit。
步骤S13、根据各个所述像素在所述图像数据中的排序,从各个所述缓存单元中读取各个所述像素分别对应的所述输出数据。
步骤S13在读取各个像素分别对应的输出数据时,按照各个像素在图像数据中的排序,可实现对各个像素对应的输出数据的排序,进一步实现对各个像素对应的输出数据的格式转换,将图2的数据格式转换成图3的存储格式。
通过本申请实施例提供的步骤S11至步骤S13的方案,能够实现对输出数据的处理,该处理过程中,能够删除输出数据中包含的第一垃圾数,从而减少输出数据中包含的垃圾数,进而减少输出带宽的浪费。
另外,在现有技术的方案中,需要额外设置整形模块,以便对各个cycle输出的数据进行格式转换,得到HWC格式的数据,从而影响了神经网络的性能。
而通过本申请实施例提供的方案,将各个像素对应的输出数据分别缓存至该像素对应的缓存单元中,并且根据各个像素在图像数据中的排序,从各个缓存单元中读取各个像素分别对应的输出数据,从而能够使读取的输出数据符合HWC格式,实现格式的转换,因此无需额外配置整形模块,相应的能够提高神经网络的性能。
进一步的,如果CNN可支持多种量化精度的量化处理,不同量化精度可能导致需要在OC维度填充不同的垃圾数,以及PO不同时,也可能需要在OC维度填充不同的垃圾数。而在不同量化精度或不同的PO的情况下,本申请实施例提供的方法均可删除第一垃圾数,因此通用性较强。
在步骤S13中,提供从各个所述缓存单元中读取各个所述像素分别对应的所述输出数据的操作,在一种可行的实现方案中,该操作可包括:
若所述输出数据中包括填充像素导致的第二垃圾数,读取第一缓存单元中的输出数据,所述缓存单元包括至少一个所述第一缓存单元和至少一个第二缓存单元,所述第二缓存单元用于缓存所述第二垃圾数。
其中,第二垃圾数即为上述的Pixel垃圾数。当输出的特征图(output featuremap,ofm)的行宽ofm_width不是feature_map这一维度的并行度PP的整数倍时,会在每行数据的最后一组填充相应像素,以使填充后的像素总数为PP的整数倍,填充的像素的输出数据即可称为Pixel垃圾数。
由于在步骤S12中,将各个像素对应的所述输出数据分别缓存至所述像素对应的缓存单元中,因此Pixel垃圾数与并非Pixel垃圾数的输出数据被缓存至不同的缓存单元。并且,该Pixel垃圾数通常会被填充在每行的计算结果的最后,如果各个缓存单元按照像素在图像数据中的排序依次缓存各个像素对应的输出数据,因此,第二垃圾数所在的缓存单元通常位于非垃圾数所在的缓存单元的后面。
其中,缓存单元包括至少一个第一缓存单元和至少一个第二缓存单元,第一缓存单元用于存储非垃圾数,而第二缓存单元用于缓存所述第二垃圾数,则在从各个所述缓存单元中读取各个所述像素分别对应的所述输出数据的操作中,只读取第一缓存单元中的输出数据,而不读取第二缓存单元中的数据,从而不读取第二垃圾数。
例如,PP=8,ofm_width=27(即每行有27个像素)时,会在每行的最后填充5个像素,以使每行包括32个像素,即使填充后的每行像素总数为PP的整数倍,其中每行填充的5个像素的输出数据即可称为Pixel垃圾数,即第二垃圾数,该第二垃圾数被缓存至第二缓存单元中。每个cycle输出8个像素的输出数据,如果每行的第1个像素为Pixel0,第2个像素为Pixel1,以此类推,第32个像素为Pixel31,则每行填充的像素为Pixel27至Pixel31这5个像素,第一个cycle可输出Pixel0至Pixel7这8个像素分别在输出通道0至输出通道7的输出数据。
这种情况下,其中一个cycle会输出Pixel24至Pixel31这8个像素分别在输出通道0至输出通道7的输出数据,另一个cycle会输出Pixel24至Pixel31这8个像素分别在输出通道8至输出通道15的输出数据,这两个cycle输出的Pixel27至Pixel31这5个像素在各个输出通道的输出数据即为Pixel垃圾数。相应的,在从各个缓存单元中读取输出数据时,可不读取这两个cycle在Pixel27至Pixel31这5个像素对应的缓存单元中的输出数据,从而不读取Pixel垃圾数。
通过这一操作,能够在从缓存单元中读取输出数据的过程中,不读取第二垃圾数,从而进一步减少输出带宽的浪费。
在本申请实施例提供的防范中,可删除输出数据中包含的第一垃圾数,第一垃圾数是对OC维度进行填充时,所导致的垃圾数。其中,如果输出通道的数量OC_num不是PO的整数倍,则会产生第一垃圾数。针对这一情况,参见图5所示的工作流程示意图,在本申请实施例提供的方法中,还包括以下步骤:
步骤S14、确定输出通道的数量OC_num是否为输出通道维度的并行度的整数倍。
根据上文对OC垃圾数的成因的介绍可知,当输出通道的数量OC_num不是PO的整数倍时,需要对每个像素进行OC垃圾数的填充,因此会导致输出的每个像素中会包含OC垃圾数。
因此,如果通过步骤S14的操作,确定输出通道的数量并非输出通道维度的并行度的整数倍,则可确定输出数据中包括第一垃圾数。
步骤S15、若输出通道的数量OC_num并非所述输出通道维度的并行度的整数倍,根据所述输出通道的数量OC_num和所述输出通道维度的并行度,确定所述第一垃圾数。
其中,第一垃圾数为满足输出通道的数量OC_num为输出通道维度的并行度的整数倍的情况下,需要填充的OC,因此,通过输出通道的数量和通道维度的并行度,即可确定填充的OC的数量,而且,填充的OC垃圾数通常位于每个像素的计算结果之后,据此可确定第一垃圾数。
例如,输出通道的数量OC_num=20,PO为8,则填充的OC的数量为4,以使填充后的输出通道的数量(20+4=24)为PO的整数倍,并且填充的OC位于各个像素的输出数据的最后,即各个像素对应的24个OC的输出数据中,最后4个OC的数据是额外填充的垃圾数,即第一垃圾数。
另外,如果对一个Pixel的输出数据量有对齐的要求,但输出数据量未达到该对齐要求,也会产生第一垃圾数。针对这一情况,参见图6所示的工作流程示意图,在本申请实施例提供的方法中,还包括以下步骤:
步骤S16、计算卷积运算的量化精度与输出通道的数量OC_num的乘积。
其中,该乘积即为Pixel的输出数据量,例如,如果输出通道的数量OC_num为24,量化精度为8bit,该乘积为192,则表示Pixel的输出数据量为192bit。
步骤S17、若乘积小于标准数据量,基于乘积和标准数据量的差值,确定第一垃圾数。
其中,该标准数据量为满足所述像素的数据量对齐要求时的数据量,例如,如果一个Pixel的输出数据量满足对齐要求的情况下,Pixel的输出数据量为256bit,则该标准数据量为256bit。并且,这种情况下,第一垃圾数也填充至每个像素的计算结果之后。
如果乘积小于标准数据量,则表明Pixel的输出数据量不满足对齐要求,则可确定输出数据中包括第一垃圾数,该差值即为该第一垃圾数对应的数据量。例如,如果需要Pixel的输出数据量为256bit,当OC_num=24,量化精度为8bit时,则每个Pixel的数据量为24×8=192bit,则需要将其补齐到256bit,该差值为256-192=64bit。由于量化精度为8bit,则需要再额外填充64/8=8个OC的数据。因此,可确定各个像素的输出数据中,最后8个OC的数据为该像素的第一垃圾数。
在本申请实施例提供的方案中,包括从各个缓存单元中读取各个像素分别对应的输出数据的操作。在一种可行的设计中,该操作可包括:
在图像数据中的一行像素对应的输出数据全部缓存至缓存单元中后,依次从各个缓存单元中读取所述输出数据。
其中,如果排序后的输出数据需写入至存储模块(例如片上系统),且写出到存储模块的总线位宽为mbit,当1个Pixel数据量大于等于mbit时,每次只从1个缓存单元读取数据,直至读完该缓存单元中的数据,然后再读取下一个缓存单元中的数据;当1个Pixel数据量小于mbit时,需要多个Pixel的数据拼接为mbit,因此可一次同时读取多个缓存单元中的数据。
示例性的,Pixel0的输出数据被缓存至buffer0中,Pixel1的输出数据被缓存至buffer1中,且在图像数据中,Pixel0位于Pixel1之前,该总线位宽为256bit。这种情况下,当1个Pixel数据量大于等于256bit时,首先从buffer0中读取Pixel0的输出数据,在完成Pixel0的输出数据的读取之后,再从buffer1中读取Pixel1的输出数据。另外,在该示例中,当1个Pixel数据量小于256bit时,则可一次同时读取多个buffer(即缓存单元)中的输出数据。
在图像数据中的一行像素对应的输出数据全部缓存至缓存单元中后,再依次从各个缓存单元中读取各个像素分别对应的输出数据,有利于保障对输出数据的格式转换的准确性,从而能够得到较准确的格式转换结果。
或者,在另一种可行的设计中,该操作包括:
若用于向存储模块传输输出数据的总线支持地址跳写,在至少一个缓存单元中存在输出数据时,从所述缓存单元中读取所述输出数据。
从缓存单元中读取的输出数据可存储至存储模块(例如片上缓存),如果该总线支持地址跳写,则可无需在图像数据中的一行像素对应的输出数据全部缓存至缓存单元中后再进行读取,而是在至少一个缓存单元中存在输出数据的情况下,就进行读取,则可尽快将输出数据传输至存储模块。
或者,在另一种可行的设计中,该操作包括:
在确定总线处于空闲状态之后,从缓存单元中读取输出数据,该总线为向存储模块传输数据的总线。
其中,总线的状态通常包括空闲状态和忙碌状态,如果总线处于忙碌状态,则表明总线正在传输数据。在本申请实施例中,如果总线处于忙碌状态,可暂停从缓存单元中读取输出数据的操作,即由该输出数据缓存在该缓存单元中,这种情况下,即使无法写出数据,也不会阻碍前级模块(例如卷积计算模块)的工作,直至缓存单元被写满后,才会往前反压。
并且,在确定总线处于空闲状态之后,再从缓存单元中读取数据,并通过该总线将读取的数据传输至存储模块。
相应的,本申请实施例提供一种神经网络输出数据的处理装置。该装置可应用于各种通过CNN进行卷积运算的器件,例如,可应用于NPU、GPU和SoC等。
另外,该处理装置可与卷积运算模块相连接,并获取卷积运算模块针对图像数据进行卷积运算后的输出数据。并且,该处理装置还可与存储模块相连接,例如片上缓存,以便将处理后的输出数据存储至存储模块。
在一种可行的设计中,本申请实施例提供的处理装置位于输出缓存模块内,即本申请对图1所示的输出缓存模块进行调整,以使该输出缓存模块包括该处理装置。
参见图7所示的结构示意图,该装置包括:依次连接的数据处理模块100、数据缓存模块200和数据读取模块300。
其中,所述数据处理模块100用于在在获取针对图像数据的卷积运算的输出数据后,如果所述输出数据中包括填充输出通道导致的第一垃圾数,删除所述输出数据中的所述第一垃圾数。
所述数据缓存模块200包括缓存单元,用于获取所述数据处理模块100输出的所述输出数据,并将各个像素对应的所述输出数据分别缓存至所述像素对应的所述缓存单元中,所述缓存单元的数量与卷积运算的像素维度的并行度相关。
其中,缓存单元的数量不小于卷积运算的像素维度的并行度,不同缓存单元用于缓存不同像素对应的输出数据。例如,如果像素维度的并行度为8,则数据缓存模块200可包括8个缓存单元。
所述数据读取模块300用于根据各个所述像素在所述图像数据中的排序,从各个所述缓存单元中读取各个所述像素分别对应的所述输出数据。
通过数据读取模块300,可得到符合HWC格式的数据。
另外,数据读取模块300在读取输出数据后,还可将其传输至存储模块,以便存储模块存储该输出数据。这种情况下,由于数据读取模块300得到的是符合HWC格式的数据,相应的,存储模块中存储的也是符合HWC格式的数据。
通过本申请实施例提供的装置,能够实现对输出数据的处理,并且在该处理过程中,能够删除输出数据中包含的第一垃圾数,从而减少输出数据中包含的垃圾数,进而减少输出带宽的浪费。
另外,通过本申请实施例提供的方案,数据缓存模块和数据读取模块能够将各个像素对应的输出数据分别缓存至该像素对应的缓存单元中,并且根据各个像素在图像数据中的排序,从各个缓存单元中读取各个像素分别对应的输出数据,从而能够使读取的输出数据符合HWC格式,实现格式的转换,因此无需额外配置整形模块,相应的能够提高神经网络的性能。
若所述输出数据中包括填充像素导致的第二垃圾数,所述数据读取模块300从各个所述缓存单元中读取所述输出数据,包括:
所述数据读取模块读取第一缓存单元中的输出数据,所述缓存单元包括至少一个所述第一缓存单元和至少一个第二缓存单元,所述第二缓存单元用于缓存所述第二垃圾数。
其中,第二垃圾数即为上述的Pixel垃圾数。这种情况下,数据读取模块能够在从缓存单元中读取输出数据的过程中,不读取第二垃圾数,从而进一步减少输出带宽的浪费。
另外,所述数据处理模块100删除所述输出数据中的第一垃圾数,包括:
删除各个计算周期输出的所述输出数据中,各个像素的最后n个输出通道对应的数据,n为所述第一垃圾数占据的所述输出通道的数量。
在一种可行的设计中,数据处理模块包括PP个数据处理单元。其中,PP为卷积运算的像素维度的并行度,在各个计算周期内,数据处理单元分别用于获取其对应的像素的所述输出数据。
由于OC垃圾数被填充至各个像素的计算结果后,因此,数据处理模块100在执行删除操作时,删除各个像素的所述输出数据中最后n个输出通道对应的数据。
例如,参见图2的示例,该示例中,PP为8,第一个cycle(即cycle0)输出的输出数据包括:像素0至像素7这8个像素分别对应的输出通道0至输出通道7的输出数据,其中,输出通道0至输出通道5为像素的计算结果,输出通道6至输出通道7为填充的OC垃圾数,这种情况下,数据处理模块可包括8个数据处理单元,不同数据处理单元分别获取不同的像素的输出数据,例如,第一个数据处理单元可获取像素0的输出数据,第二个数据处理单元可获取像素1的输出数据,以此类推,第八个数据处理单元可获取像素7的输出数据。这种情况下,每个数据处理单元可删除在输出通道6至输出通道7中填充的OC垃圾数。
为了明确本申请实施例提供的处理装置的结构,本申请提供一种处理装置的示例图,该示例对应图2所示的示例,其中,像素维度的并行度PP为8,即每个计算周期对8个像素进行卷积运算。相应的,参见图8,在该示例中,数据处理模块包括8个数据处理单元,在各个计算周期内,数据处理单元分别用于获取其对应的像素的输出数据。另外,数据缓存模块包括8个缓存单元,以便将各个像素对应的输出数据分别缓存至相应的缓存单元中。
在第一个cycle中,卷积运算模块对像素0至像素7这8个像素进行卷积运算,相应的,则这8个数据处理单元分别获取其对应的像素的输出数据,其中第一个数据处理单元获取像素0这一像素的输出数据,第二个数据处理单元获取像素1这一像素的输出数据,以此类推,第八个数据处理单元获取像素7这一像素的输出数据。并且,由于OC垃圾数(即第一垃圾数)通常填充在各个像素的计算结果的后面,因此,各个数据处理单元可删除该OC垃圾数。
另外,设定8个缓存单元分别为缓存单元0至缓存单元7,则像素0这一像素的输出数据可缓存至缓存单元0中,像素1这一像素的输出数据可缓存至缓存单元1中,以此类推,像素7这一像素的输出数据可缓存至缓存单元7中。
与上述实施例相应的,本申请实施例还提供一种芯片,该芯片包括如上述各个实施例所提供的神经网络输出数据的处理装置。
另外,在该芯片应用至电子设备中处理数据时,该芯片执行如上述各个实施例所提供的神经网络输出数据的处理方法,例如,可执行图4至图6对应的实施例中的全部或部分步骤。
本申请实施例中所描述的方法或算法的步骤可以直接嵌入硬件、处理器执行的软件单元、或者这两者的结合。软件单元可以存储于随机存取存储器(random accessmemory,RAM)、闪存、只读存储器(read-only memory,ROM)、可擦式可编程只读存储器(erasable programmable read-only memory,EPROM)、寄存器、硬盘、可移动磁盘、便携式紧凑盘只读存储器(compact disc read-only memory,CD-ROM)或本领域中其它任意形式的存储媒介中。示例性地,存储媒介可以与处理器连接,以使得处理器可以从存储媒介中读取信息,并可以向存储媒介存写信息。可选地,存储媒介还可以集成到处理器中。处理器和存储媒介可以设置于ASIC中,ASIC可以设置于用户终端(user equipment,UE)中。可选地,处理器和存储媒介也可以设置于UE中的不同的部件中。
应理解,在本申请的各种实施例中,各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。
本说明书的各个实施例之间相同相似的部分互相参见即可,每个实施例重点介绍的都是与其他实施例不同之处。尤其,对于装置和系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例部分的说明即可。
以上所述的本发明实施方式并不构成对本发明保护范围的限定。