CN120530400A - 神经处理器处的卷积中的高效零填充 - Google Patents
神经处理器处的卷积中的高效零填充Info
- Publication number
- CN120530400A CN120530400A CN202380090530.7A CN202380090530A CN120530400A CN 120530400 A CN120530400 A CN 120530400A CN 202380090530 A CN202380090530 A CN 202380090530A CN 120530400 A CN120530400 A CN 120530400A
- Authority
- CN
- China
- Prior art keywords
- row
- zero
- kernel
- input
- data
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/045—Combinations of networks
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/06—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
- G06N3/063—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons using electronic means
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Health & Medical Sciences (AREA)
- Life Sciences & Earth Sciences (AREA)
- Biomedical Technology (AREA)
- Biophysics (AREA)
- Evolutionary Computation (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Artificial Intelligence (AREA)
- General Health & Medical Sciences (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Mathematical Physics (AREA)
- Software Systems (AREA)
- Neurology (AREA)
- Image Analysis (AREA)
Abstract
实施方案涉及一种卷积中的高效零填充的方法。该方法包括访问输入张量的多个分区中的分区。该输入张量在光栅扫描方向上被划分为该多个分区。对于用于对该输入张量执行卷积的内核的每一行,寄存器填充有指示零填充模式的一组值。对于该内核的该行中的计算循环,部分地基于该零填充模式来执行与该卷积相关联的计算。之后,生成表示用于该内核的该行中的下一个循环的零填充模式的更新的零填充模式。该寄存器中的该组值被更新为该更新的零填充模式。
Description
相关申请的交叉引用
本申请要求美国专利申请第18/093,051号的优先权,该美国专利申请全文以引用方式并入。
技术领域
本公开涉及调度与神经网络相关联的操作,并且更具体地涉及将神经网络中的多个张量层的操作编译成可以由神经处理器以串流方式执行的任务。
背景技术
人工神经网络(ANN)是使用连接节点的集合来处理输入数据的计算系统或模型。ANN通常被组织成层,其中不同的层对其输入执行不同类型的转换。ANN的扩展或变体诸如卷积神经网络(CNN)、递归神经网络(RNN)和深度信念网络(DBN)已受到大量关注。这些计算系统或模型通常涉及广泛的计算操作,包括相乘和累加。例如,CNN是一类主要使用输入数据和内核数据之间的卷积的机器学习技术,卷积可分解为相乘和累加操作。
根据输入数据的类型和待执行的操作,这些机器学习系统或模型可被不同地配置。此类变化的配置将包括例如预处理操作、输入数据中的通道数量、待使用的内核数据、待应用于卷积结果的非线性函数以及各种后处理操作的应用。使用中央处理单元(CPU)及其主存储器来实例化和执行各种配置的机器学习系统或模型相对容易,因为此类系统或模型仅通过更新代码即可实例化。然而,仅依赖于CPU进行这些机器学习系统或模型的各种操作将消耗CPU的大量带宽以及增加总体功率消耗。
发明内容
实施方案涉及由神经处理器电路执行的卷积中的零填充。访问具有存储在缓冲存储器中的输入元素的输入张量的多个分区中的分区。输入张量在光栅扫描方向上被划分为多个分区。
对于用于对输入张量执行卷积的每个内核行,寄存器填充有一组值。该组值表示针对内核行中的第一循环的零填充模式,其中每个值对应于被配置为执行与卷积相关联的计算的计算电路,并且对应于非活动值的计算电路将被忽略。在执行内核行中的第一循环的计算之后,生成更新的零填充模式。更新的零填充模式表示针对内核行中的下一个循环的零填充模式。该过程可以根据需要重复许多次,直到完成同一内核行中的所有计算循环。
附图说明
图1是根据一个实施方案的电子设备的高级图。
图2是例示根据一个实施方案的电子设备中的部件的框图。
图3是例示根据一个实施方案的神经处理器电路的框图。
图4A是根据一个实施方案的神经处理器电路中的神经引擎的框图。
图4B例示了根据一个实施方案的在图4A的神经引擎处以串流方式执行的示例卷积操作。
图5例示了根据一个实施方案的以串流方式对多个卷积层执行卷积操作的示例。
图6例示了根据一个实施方案的16×20×1输入张量和用于对输入张量执行卷积操作的3×3内核。
图7例示了根据一个实施方案的其上存储有图6的16×20×1输入张量的32字节宽的存储器。
图8A和图8B例示了根据一个实施方案的基于3×3内核在16×20×1输入张量的元素(0,0)上执行的9个卷积循环,从而在最左侧位置处产生输出行边缘。
图9A和图9B例示了根据一个实施方案的基于3×3内核在16×20×1输入张量的元素(0,16)上执行的9个卷积计算循环,从而在中间位置处产生输出行边缘。
图10A和图10B例示了根据一个实施方案的基于3×3内核在16×20×1输入张量的元素(7,4)上执行的9个卷积计算循环,从而在最右侧位置处产生输出行边缘。
图11A和图11B例示了根据一个实施方案的基于3×3内核在16×20×1输入张量的元素(14,8)上执行的9个卷积计算循环,从而在中间位置处产生输出行边缘。
图12A和图12B例示了根据一个实施方案的基于5×5内核在16×20×1输入张量的元素(0,16)上执行的9个卷积计算循环。
图13A至图13E例示了根据一个实施方案的对应于图12B的循环11-15的边缘寄存器和填充寄存器的示例实施方案。
图13F至图13J例示了根据一个实施方案的对应于图12B的循环6-10的边缘寄存器和填充寄存器的示例实施方案。
图13I至图13K例示了根据一个实施方案的对应于图10B的循环1-3的边缘寄存器和填充寄存器的示例实施方案。
图13L至图13N例示了根据一个实施方案的对应于图11B的循环7-9的边缘寄存器和填充寄存器的示例实施方案。
图14例示了根据一个实施方案的初始化填充寄存器和数据输入位所需的逻辑,该数据输入位对应于在下一个循环中传递给NE的数据元素。
图15是例示根据一个实施方案的卷积中的高效零填充的方法的流程图。
仅仅出于例示目的,附图说明以及具体实施方式描述各种非限定性实施方案。
具体实施方式
现在将详细地参考实施方案,这些实施方案的示例在附图中例示。下面的详细描述中示出许多具体细节,以便提供对各种所描述的实施方案的充分理解。然而,可以在没有这些具体细节的情况下实施所述实施方案。在其他情况下,没有详细地描述众所周知的方法、过程、部件、电路和网络,从而不会不必要地使实施方案的各个方面晦涩难懂。
实施方案涉及通过使用零填充模式的卷积层的高效零填充。对于每个内核行,寄存器(也被称为“填充寄存器”)填充有一组值,指示针对内核行中的第一循环的零填充模式。对于内核行中的计算循环,部分地基于零填充模式来执行与卷积相关联的计算。特别地,计算电路的对应于该组值中的活动值的结果被保持;并且计算电路的对应于该组值中的非活动值的结果被忽略。例如,在一些实施方案中,寄存器中的每个值是二进制值,其中“1”是活动值,并且“0”是非活动值,反之亦然。在完成与针对循环的卷积相关联的计算之后,生成表示针对内核行中的下一个循环的零填充模式的更新的零填充模式,并将其填充在填充寄存器中。
在一些实施方案中,生成零填充模式部分地基于越界输入元素或输出行边缘。在一些实施方案中,对于每个分区,第二寄存器(也被称为“边缘寄存器”)填充有第二组值,指示输出边缘行的位置。生成更新的零填充模式包括在填充寄存器中的该组值与边缘寄存器中的第二组值之间执行XOR运算。
示例性电子设备
本文描述了电子设备、此类设备的用户界面和使用此类设备的相关联的过程的实施方案。在一些实施方案中,该设备为还包含其他功能诸如个人数字助理(PDA)和/或音乐播放器功能的便携式通信设备,诸如移动电话。便携式多功能设备的示例性实施方案包括但不限于来自Apple Inc.(Cupertino,California)的设备、iPod设备、Apple设备和设备。可选地使用其他便携式电子设备,诸如可穿戴设备、膝上型电脑或平板计算机。在一些实施方案中,该设备不是便携式通信设备,而是台式计算机或不是为便携式使用而设计的其他计算设备。在一些实施方案中,所公开的电子设备可包括触敏表面(例如,触摸屏显示器和/或触摸板)。下文结合图1描述的示例电子设备(例如,设备100)可包括用于接收用户输入的触敏表面。电子设备还可包括一个或多个其他物理用户接口设备,诸如物理键盘、鼠标和/或操纵杆。
图1是根据一个实施方案的电子设备100的高级图。设备100可包括一个或多个物理按钮,诸如“home”按钮或菜单按钮104。菜单按钮104例如用于导航到在设备100上执行的一组应用程序中的任何应用程序。在一些实施方案中,菜单按钮104包括标识菜单按钮104上的指纹的指纹传感器。指纹传感器能够被用来确定菜单按钮104上的手指是否具有与为解锁设备100存储的指纹匹配的指纹。另选地,在一些实施方案中,菜单按钮104被实现为触摸屏上显示的图形用户界面(GUI)中的软键。
在一些实施方案中,设备100包括触摸屏150、菜单按钮104、用于使设备开/关机和用于锁定设备的下压按钮106、音量调节按钮108、订户身份模块(SIM)卡槽110、耳麦插孔112和对接/充电外部端口124。下压按钮106可用于通过压下该按钮并将该按钮保持在压下状态达预定义的时间间隔来对设备进行开关机;通过压下该按钮并在该预定义的时间间隔过去之前释放该按钮来锁定该设备;和/或对该设备进行解锁或发起解锁过程。在另选的实施方案中,设备100还通过麦克风113接受用于激活或停用某些功能的人声输入。设备100包括各种部件,包括但不限于存储器(可包括一个或多个计算机可读存储介质)、存储器控制器、一个或多个中央处理单元(CPU)、外围设备接口、RF电路、音频电路、扬声器111、麦克风113、输入/输出(I/O)子系统和其他输入或控制设备。设备100可包括一个或多个图像传感器164、一个或多个接近传感器166,以及一个或多个加速度计168。设备100可包括多于一种类型的图像传感器164。每种类型可包括多于一个图像传感器164。例如,一种类型的图像传感器164可以是相机,并且另一类型的图像传感器164可以是用于由存储在设备100中的一个或多个机器学习模型执行的面部识别的红外传感器。设备100可包括图1中未示出的部件,诸如环境光传感器、点投影仪和用于支持面部识别的泛光照明器。
设备100仅是电子设备的一个示例,并且设备100可具有比上文列出的更多或更少的部件,其中一些部件可组合成一个部件或具有不同的配置或布置。以上列出的设备100的各种部件体现为硬件、软件、固件或其组合,包括一个或多个信号处理和/或专用集成电路(ASIC)。
图2是例示根据一个实施方案的设备100中的部件的框图。设备100可执行各种操作,包括实施一个或多个机器学习模型。出于此目的和其他目的,设备100可包括图像传感器202、片上系统(SOC)部件204、系统存储器230、永久存储装置(例如,闪存)228、运动传感器234和显示器216,以及其他部件。如图2所例示的部件仅为例示性的。例如,设备100可包括图2中未例示的其他部件(诸如扬声器或麦克风)。另外,一些部件(诸如运动传感器234)可从设备100中省略。
图像传感器202是用于捕获图像数据的部件,并且可实现为例如互补金属氧化物半导体(CMOS)有源像素传感器、相机、摄像机或其他设备。图像传感器202生成原始图像数据,其被发送到SOC部件204以进行进一步处理。在一些实施方案中,由SOC部件204处理的图像数据显示在显示器216上,存储在系统存储器230、永久存储装置228中,或经由网络连接发送到远程计算设备。由图像传感器202生成的原始图像数据可以是Bayer色彩内核阵列(CFA)图案。
运动传感器234是用于感测设备100的运动的部件或一组部件。运动传感器234可以生成指示设备100的取向和/或加速度的传感器信号。传感器信号被发送到SOC部件204以用于各种操作,诸如打开设备100或旋转显示器216上显示的图像。
显示器216是用于显示由SOC部件204生成的图像的部件。显示器216可包括例如液晶显示器(LCD)设备或有机发光二极管(OLED)设备。基于从SOC部件204接收的数据,显示器216可显示各种图像,诸如菜单、所选择的操作参数、由图像传感器202捕获并且由SOC部件204处理的图像,和/或从设备100的用户界面接收的其他信息(未示出)。
系统存储器230是用于存储由SOC部件204执行的指令以及用于存储由SOC部件204处理的数据的部件。系统存储器230可以被体现为任何类型的存储器,包括(例如)动态随机存取存储器(DRAM)、同步DRAM(SDRAM)、双倍数据速率(DDR、DDR2、DDR3等)RAMBUSDRAM(RDRAM)、静态RAM(SRAM)或它们的组合。
永久性存储装置228是用于以非易失性方式存储数据的部件。即使电力不可用,永久性存储装置228也保持数据。永久存储装置228可体现为只读存储器(ROM)、闪存或其他非易失性随机存取存储器设备。永久存储装置228存储设备100的操作系统和各种软件应用程序。永久存储装置228也可存储一个或多个机器学习模型,诸如回归模型、随机森林模型、支持向量机(SVM)诸如内核SVM、以及人工神经网络(ANN)诸如卷积网络网络(CNN)、递归网络网络(RNN)、自编码器、和长短期记忆(LSTM)。机器学习模型可以是与神经处理器电路218和设备100的各种软件应用程序或传感器一起工作的独立模型。机器学习模型也可以是软件应用程序的一部分。机器学习模型可执行各种任务,诸如面部识别、图像分类、对象、概念和信息分类、语音识别、机器翻译、声音识别、语音命令识别、文本识别、文本和上下文分析、其他自然语言处理、预测和建议。
存储在设备100中的各种机器学习模型可被完全训练、未经训练、或部分训练以允许设备100加强或继续在设备100被使用时训练机器学习模型。机器学习模型的操作包括在训练模型以及利用模型确定运行时间结果的各种计算。例如,在一种情况下,设备100捕获用户的面部图像并使用该图像继续改善用于锁定或解锁设备100的机器学习模型。
SOC部件204体现为一个或多个集成电路(IC)芯片并执行各种数据处理过程。SOC部件204可包括除了别的子部件之外的图像信号处理器(ISP)206、中央处理器单元(CPU)208、网络接口210、传感器接口212、显示控制器214、神经处理器电路218、图形处理器(GPU)220、存储器控制器222、视频编码器224、存储控制器226和连接这些子部件的总线232。SOC部件204可包括比图2中所示的子部件更多或更少的子部件。
ISP 206是执行图像处理流水线的各级的电路。在一些实施方案中,ISP 206可从图像传感器202接收原始图像数据,并且将原始图像数据处理成SOC部件204的其他子部件或设备100的部件可用的形式。ISP 206可执行各种图像操纵操作,诸如图像平移操作、水平和竖直缩放、色彩空间转换和/或图像稳定变换。
CPU 208可使用任何合适的指令集架构来实现,并且可执行在该指令集架构中定义的指令。CPU 208可以是使用各种指令集架构(ISA)中的任一者的通用或嵌入式处理器,诸如x86、PowerPC、SPARC、RISC、ARM或MIPS ISA,或任何其他合适的ISA。尽管图2中例示了单个CPU,但是SOC部件204可包括多个CPU。在多处理器系统中,每个CPU可共同实现相同的ISA,但不是必需的。
GPU 220是用于执行图形数据的图形处理电路。例如,GPU 220可渲染要显示到帧缓冲器中的对象(例如,包括整个帧的像素数据的帧缓冲器)。GPU 220可包括一个或多个图形处理器,该图形处理器可执行图形软件以执行部分或全部的图形操作或某些图形操作的硬件加速。
神经处理器电路218是基于包括相乘、相加和累加的计算来执行各种机器学习操作的电路。此类计算可被布置为例如执行各种类型的张量乘积,诸如张量积和输入数据和内核数据的卷积。神经处理器电路218是可配置电路,该可配置电路以快速且高功效的方式执行这些操作,同时缓解了CPU 208与神经网络操作相关联的资源密集型操作。神经处理器电路218可从传感器接口212、ISP 206、永久存储装置228、系统存储器230或其他源诸如网络接口210或GPU 220接收输入数据。神经处理器电路218的输出可被提供给设备100的各个部件诸如ISP 206、系统存储器230或CPU 208用于各种操作。神经处理器电路218的结构和操作在下文中参考图3详细描述。
网络接口210是支持经由一个或多个网络(例如,载体或代理设备)在设备100和其他设备之间交换数据的子部件。例如,视频或其他图像数据可经由网络接口210从其他设备接收并且被存储在系统存储器230中以用于后续处理(例如,经由到ISP 206的后端接口)和显示。网络可包括但不限于局域网(LAN)(例如,以太网或公司网络)和广域网(WAN)。经由网络接口210接收的图像数据可由ISP 206进行图像处理过程。
传感器接口212是用于与运动传感器234交接的电路。传感器接口212从运动传感器234接收传感器信息并且处理传感器信息以确定设备100的取向或移动。
显示控制器214是用于发送要在显示器216上显示的图像数据的电路。显示控制器214从ISP 206、CPU 208、图形处理器或系统存储器230接收图像数据,并将图像数据处理成适用于在显示器216上显示的格式。
存储器控制器222是用于与系统存储器230通信的电路。存储器控制器222可从系统存储器230读取数据以供ISP 206、CPU 208、GPU 220或SOC部件204的其他子部件处理。存储器控制器222还可将数据写入从SOC部件204的各种子部件接收的系统存储器230。
视频编码器224是硬件、软件、固件或它们的组合,用于将视频数据编码成适于存储在永久性存储装置228中的格式,或者用于将数据传递到网络接口210以通过网络传输到另一设备。
在一些实施方案中,SOC部件204的一个或多个子部件或这些子部件的一些功能可由在神经处理器电路218、ISP 206、CPU 208或GPU 220上执行的软件部件来执行。此类软件部件可以存储在系统存储器230、永久性存储装置228或者经由网络接口210与设备100通信的另一设备中。
示例神经处理器电路
神经处理器电路218是对神经处理器电路218的输入数据执行机器学习操作的可编程电路。机器学习操作可包括用于训练机器学习模型以及用于基于经训练的机器学习模型执行推断或预测的不同计算。
以CNN为机器学习模型的示例,CNN的训练可包括正向传播和反向传播。神经网络可包括输入层、输出层、和一个或多个中间层,该中间层可被称为隐藏层。每个层可包括一个或多个节点,该一个或多个节点可完全或部分地连接到相邻层中的其他节点。在正向传播中,神经网络基于前一层的输出在正向方向上执行计算。节点的操作可由一个或多个函数限定。限定节点的操作的函数可包括各种计算操作,诸如利用一个或多个内核的数据卷积、层的池化、张量乘积等。函数还可包括调节节点的输出的权重的激活函数。不同层中的节点可与不同函数相关联。例如,CNN可包括与池化层混合、并且之后跟着一个或多个完全连接的层的一个或多个卷积层。
机器学习模型中的函数中的每一者(包括内核)可与在训练期间能调节的不同系数相关联。另外,神经网络中的一些节点各自也可与决定正向传播中节点的输出的权重的激活函数相关联。常见的激活函数可包括阶跃函数、线性函数、S形函数、双曲正切函数(tanh)、和整流线性单元函数(ReLU)。在一批训练样本数据在正向传播中通过神经网络之后,可将结果与训练样本的训练标签进行比较以计算网络的损失函数,其表示网络的性能。进而,神经网络通过使用坐标下降诸如随机坐标下降(SGD)调节各个函数中的系数以改善损失函数的值来执行反向传播。
在训练中,设备100可使用神经处理器电路218执行正向传播和反向传播中的所有或一些操作。多轮正向传播和反向传播可由神经处理器电路218单独地或与其他处理器诸如CPU 208、GPU 220和ISP 206协调地执行。训练可在损失函数不再改善(例如,机器学习模型已收敛)时或在特定训练样本的预定轮数之后完成。当使用设备100时,设备100可继续收集用于神经网络的附加训练样本。
为了预测或推断,设备100可接收一个或多个输入样本。神经处理器电路218可取输入样本执行正向传播以确定一个或多个结果。输入样本可以是图像、语音、文本文件、传感器数据或其他数据。
机器学习中的数据和函数(例如,输入数据、内核、函数、层输出、梯度数据)可被保存并由一个或多个张量表示。与机器学习模型的训练和运行时间有关的常见操作可包括张量积、张量转置、张量逐元素操作、卷积、激活函数的应用、自动微分以确定张量中的值的梯度、统计和聚合(例如,平均、方差、标准偏差)、张量秩和尺寸操纵等。
虽然作为示例讨论了神经网络的训练和运行时间,但是神经处理器电路218也可用于其他类型的机器学习模型的操作,诸如内核SVM。
参见图3,示例神经处理器电路218除了其他部件之外可包括神经任务管理器310、神经引擎314A至314N(在下文中统称为“神经引擎314”并且也被单独地称为“神经引擎314”)、内核直接存储器存取(DMA)324、数据处理器电路318、数据处理器DMA 320和平面引擎340。神经处理器电路218可包括更少的部件或者图3中未例示的附加部件。
神经引擎314中的每一个神经引擎并行地执行机器学习的计算操作。根据操作负荷,整组神经引擎314可正在操作,或者仅神经引擎314的子集可正在操作,而其余神经引擎314被置于功率节省模式以节省功率。神经引擎314中的每个神经引擎包括用于存储一个或多个内核、用于执行相乘累加操作以及用于后处理以生成输出数据328的部件,如下面参考图4A详细描述的。神经引擎314可专门执行计算量大的操作,诸如卷积操作和张量积操作。卷积操作可包括不同种类的卷积,诸如交叉通道卷积(累加来自不同通道的值的卷积)、逐通信卷积、和转置卷积。不同的神经引擎314可以处理不同的张量输入。另选地,一个神经引擎314可以处理不同的张量输入。
平面引擎340可专门执行更简单的计算操作,其速度可主要取决于数据传输的输入和输出(I/O)速度而不是平面引擎340内的计算速度。那些计算操作可被称为I/O约束的计算。相比之下,神经引擎314可聚焦于复杂的计算,其速度可主要取决于每个神经引擎314内的计算速度。例如,平面引擎340对于执行单个通道内的操作是高效的,而神经引擎314对于执行可能涉及数据重度累加的跨多个通道的操作是高效的。使用神经引擎314计算I/O约束的计算不可能在速度和功率消耗两个方面都是高效的。在一个实施方案中,输入数据可以是秩大于三(例如,具有三个或更多个维度)的张量。张量中的一组维度(两个或更多个)可被称为平面,而另一维度可被称为通道。神经引擎314可利用内核将张量中平面的数据卷积,并跨不同通道累加不同平面卷积的结果。另一方面,平面引擎340可专用于平面内的操作。
平面引擎340的电路可被编程用于多种模式下的一种模式下的操作,包括池化模式、逐元素模式和缩减模式。在池化模式下,平面引擎340缩减输入数据的空间尺寸。在逐元素模式下,平面引擎340生成从一个或多个输入的逐元素操作导出的输出。在缩减模式下,平面引擎340缩减张量的秩。例如,可将秩5张量缩减到秩2张量,或者可将秩3张量缩减到秩0张量(例如,标量)。在一些实施方案中,平面引擎340从神经处理器电路218中省略。
神经任务管理器310管理神经处理器电路218的总体操作。神经任务管理器310可从由CPU 208执行的编译器接收任务列表,将任务存储在其任务队列中,选择将执行的任务,并且向神经处理器电路218的其他部件发送任务命令以用于执行所选择的任务。数据可与指示要对数据执行的操作的类型的任务命令相关联。
神经处理器电路218的数据包括从另一源诸如系统存储器230传输的输入数据以及由神经处理器电路218在先前操作循环中生成的数据。每个数据集可与指定要对数据执行的操作的类型的任务命令相关联。神经任务管理器310还可以在检测到事件诸如从CPU208接收指令时执行任务的切换。在一个或多个实施方案中,神经任务管理器310将光栅器信息发送给神经处理器电路218的部件以使这些部件中的每一者能够跟踪、检索或处理输入数据和内核数据的适当部分。例如,神经任务管理器310可包括存储关于数据集的大小和秩的信息以供神经处理器电路218处理的寄存器。尽管在图3中神经任务管理器310被例示为神经处理器电路218的一部分,但是神经任务管理器310可以是神经处理器电路218外部的部件。
内核DMA 324是从源(例如,系统存储器230)获取内核数据并将内核数据326A至326N发送到神经引擎314中的每个神经引擎的读取电路。内核数据表示可从中提取内核元素的信息。在一个实施方案中,内核数据可以是在神经引擎314中的每一个神经引擎处解压缩的压缩格式。尽管在一些情况下提供给神经引擎314中的每一个神经引擎的内核数据可相同,但是在大多数情况下提供给神经引擎314中的每一个神经引擎的内核数据是不同的。在一个实施方案中,内核DMA 324的直接存储器访问性质可允许内核DMA 324直接从源获取和写入数据,而没有CPU 208参与。
数据处理器电路318管理神经处理器电路218的数据流量和任务绩效。数据处理器电路318可包括数据控制电路332和缓冲存储器334。缓冲存储器334是临时存储装置,用于存储与神经处理器电路218和平面引擎340的操作相关联的数据,诸如从系统存储器230传输的输入数据(例如,来自机器学习模型的数据)和在神经处理器电路218或平面引擎340内生成的其他数据。存储在数据处理器电路318中的数据可包括不同子集,该不同子集被发送给各个下游部件,诸如神经引擎314和平面引擎340。
在一个实施方案中,缓冲存储器334被实施为可被神经引擎314和平面引擎340访问的非暂态存储器。缓冲存储器334可以是在CPU 208不参与的情况下存储设备100的机器学习模型的数据的直接存储器访问缓冲器。缓冲存储器334可存储用于馈送到对应神经引擎314A至314N或平面引擎340的输入数据322A至322N、以及用于反馈到一个或多个神经引擎314或平面引擎340中、或发送给目标电路(例如,系统存储器230)的来自神经引擎314A至314N中的每一者或平面引擎340的输出数据328A至328N。缓冲存储器334还可存储平面引擎340的输入数据342和输出数据344,并且允许神经引擎314与平面引擎340之间的数据交换。例如,神经引擎314的一个或多个输出数据328A至328N用作对平面引擎340的输入数据342。同样,平面引擎340的输出数据344可用作神经引擎314的输入数据322A至322N。神经引擎314或平面引擎340的输入可以是存储在缓冲存储器334中的任何数据。例如,在各个操作循环中,引擎之一从中获取以作为输入的源数据集可以是不同的。引擎的输入可以是先前操作循环中同一引擎的输出、不同引擎的输出、或存储在缓冲存储器334中的任何其他合适的源数据集。此外,缓冲存储器334中的数据集可被划分并发送给不同的引擎,以用于下一操作循环中的不同操作。缓冲存储器334中的两个数据集也可联合以用于下一操作。
缓冲存储器334可以包括多个张量缓冲器,用于存储输入数据322A至322N的部分和输出数据328A至328N的部分,以供一个或多个神经引擎314访问来执行串流卷积操作。下面参考图5描述了关于用于支持一个或多个神经引擎314处的串流卷积操作的缓冲存储器334的结构和操作的细节。
数据处理器电路318的数据控制电路332可控制神经引擎314与平面引擎340之间的数据交换。数据处理器电路318与神经处理器电路218的其他部件的操作被协调使得存储在数据处理器电路318中的输入数据和中间数据可跨神经引擎314和平面引擎340处的多个操作被重复使用,从而减少往返于系统存储器230的数据传输。数据控制电路332可执行以下操作中的一者或多者:(i)监视正被神经引擎314和平面引擎340处理的数据的大小和秩(例如,数据可以是一个或多个张量),(ii)基于与不同数据子集相关联的任务命令确定哪些数据子集被传输给神经引擎314或平面引擎340,(iii)确定数据被传输给神经引擎314和平面引擎340的方式(例如,数据处理器电路318可在广播模式下操作,其中相同的数据被馈送到神经引擎314的多个输入通道,使得多个或所有神经引擎314接收相同的数据,或者可在单播模式下操作,其中不同的神经引擎314接收不同的数据),和(iv)传输配置命令给平面引擎340以指示平面引擎340对其自己编程以用于在多个操作模式之一中操作。下面参考图5描述了关于数据控制电路332的操作的细节。
存储在缓冲存储器334中的神经处理器电路218的数据可以是图像数据、取向梯度(HOG)数据的柱状图、音频数据、元数据、神经引擎314的前一操作循环的输出数据328、以及从SOC部件204的其他部件接收的其他经处理的数据等等的一部分。
数据处理器DMA 320包括从源(例如,系统存储器230)接收输入数据的一部分以用于存储在缓冲存储器334中的读取电路以及将数据从缓冲存储器334转发到目标部件(例如,系统存储器230)的写入电路。在一个实施方案中,数据处理器DMA 320的直接存储器访问性质可允许数据处理器DMA 320直接从源(例如,系统存储器230)获取和写入数据。而没有CPU 208参与。缓冲存储器334可以是在CPU 208不参与的情况下存储设备100的机器学习模型的数据的直接存储器访问缓冲器。
神经处理器(NP)控制器350是执行各种操作以控制神经处理器电路218的整体操作的控制电路。NP控制器350可通过设置部件中的寄存器来与CPU 208、神经处理器电路218的程序部件相连接并执行管家操作。NP控制器350还可当神经处理器电路218开启时初始化神经处理器电路218中的部件。
示例神经引擎架构
图4A是根据一个实施方案的神经引擎314的框图。神经引擎314执行各种操作以促进机器学习,诸如卷积、张量积,并且其他操作可涉及大的计算量。为此,神经引擎314接收输入数据322,基于所存储的内核数据对输入数据322执行相乘累加操作(例如,卷积操作),对相乘累加操作的结果执行进一步后处理操作,并且生成输出数据328。神经引擎314的输入数据322和/或输出数据328可以是单个通道的或跨多个通道。
神经引擎314可除了别的部件之外还包括输入缓冲电路402、计算核416、神经引擎(NE)控件418、内核提取电路432、累加器电路414和输出电路424。神经引擎314可包括比图4A中所示更少的部件或包括图4A中未例示的另外的部件。
内核提取电路432是从内核DMA 324接收内核数据326并提取内核系数422的电路。在一个实施方案中,内核提取电路432参考查找表(LUT)并使用掩模来基于LUT从压缩内核数据326重建内核。该掩模指示重建内核中待用零填补的位置以及待用数字填充的剩余位置。将重建内核的内核系数422发送到计算核416以填充计算核416的乘加(MAD)电路中的寄存器。在其他实施方案中,内核提取电路432接收未压缩格式的内核数据,并且在不参考LUT或使用掩模的情况下确定内核系数。
计算核416是执行计算操作的可编程电路。为此,计算核416可包括MAD电路MAD0至MADN以及后处理器428。MAD电路MAD0至MADN中的每一者可将输入值存储在输入数据的片段408中并且将对应内核系数存储在内核系数422中。在MAD电路中的每一个MAD电路中将输入值和对应内核系数相乘以生成经处理的值412。
累加器电路414是从MAD电路接收和存储经处理的值412的存储器电路。存储在累加器电路414中的经处理的值可作为反馈信息419被发送回以在MAD电路处进行进一步相乘和相加操作,或者被发送到后处理器428以进行后处理。累加器电路414与MAD电路组合形成了相乘累加器(MAC)404。在一个或多个实施方案中,累加器电路414可具有子单元(或批次),其中每个子单元将数据发送到神经引擎314的不同部件。例如,在操作循环期间,存储在累加器电路414的第一子单元中的数据被发送到MAC 404,同时存储在累加器电路414的第二子单元中的数据被发送到后处理器428。
后处理器428是对从累加器电路414接收到的值412执行进一步处理的电路。后处理器428可执行操作,包括但不限于应用线性函数(例如,整流线性单元(ReLU))、归一化互相关性(NCC)、将对8位数据执行神经操作的结果合并成16位数据以及局部响应归一化(LRN)。此类操作的结果作为经处理的值417从后处理器428输出到输出电路424。在一些实施方案中,绕过后处理器428处的处理。例如,累加器电路414中的数据可被直接发送到输出电路424以供神经处理器电路218的其他部件访问。
NE控件418基于神经处理器电路218的操作模式和参数来控制神经引擎314的其他部件的操作。根据不同的操作模式(例如,组卷积模式或非组卷积模式)或参数(例如,输入通道的数量和输出通道的数量),神经引擎314可以不同的顺序对不同的输入数据进行操作,将不同的值从累加器电路414返回到MAD电路,并且在后处理器428处执行不同类型的后处理操作。为了配置神经引擎314的部件以期望的方式操作,NE控件418发送可被包括在信息419中的任务命令给神经引擎314的部件。NE控件418可包括光栅器430,该光栅器跟踪在神经引擎314处处理的当前任务或处理回路。
输入数据通常被分成更小的数据片,用于在多个神经引擎314或者神经引擎314和平面引擎340处进行并行处理。用于卷积操作的一组数据可被称为卷积组,其可分成多个较小单元。较小单元(片段)的层级结构可以是卷积组、切片、区块、工作单元、输出通道组、输入通道(Cin)、用于输入步幅的子Cin等。例如,卷积组可被分成若干切片;切片可分成若干区块;区块可分成若干工作单元;等等。在神经引擎314的上下文中,工作单元可以是输入数据的片段,诸如由平面引擎340处理的数据或神经引擎314的先前操作循环处理的数据,其具有生成在计算核416的单个操作循环期间适合神经引擎314的累加器电路414的输出值的大小。在一种情况下,每个工作单元的尺寸是256字节。在此类实施方案中,例如,工作单元可被成形为16×16、32×8、64×4、128×2或256×1数据集中的一者。在平面引擎340的上下文中,工作单元可以是(i)输入数据的片段,(ii)来自神经引擎314的数据或(iii)来自平面引擎340的先前操作循环的数据,其可在平面引擎340处同时处理。
光栅器430可执行与将输入数据分为较小单元(片段)相关联的操作,并通过MAC404和累加器电路414调控较小单元的处理。每个较小的单元也被称为分区。光栅器430保持跟踪输入/输出数据的片段的尺寸和秩(例如,组、工作单元、输入通道、输出通道)并且指示神经处理器电路218的部件用于正确处理输入数据的片段。例如,光栅器430在输入缓冲电路402中操作移位器410以将输入数据的正确片段408转发给MAC 404并将完成的输出数据328发送给数据缓冲存储器334。神经处理器电路218的其他部件(例如,内核DMA 324、缓冲器DMA 320、缓冲存储器334、平面引擎340)也可具有其对应的光栅器,用于监视输入数据的划分以及不同部件中输入数据的各个片段的并行计算。
输入缓冲电路402是当神经处理器电路218的数据的子集被从源接收时存储该数据子集的电路。源可以是数据处理器电路318、平面引擎340或另一合适的部件。输入缓冲电路402发送用于当前任务或处理回路的数据的适当片段408给计算核416以用于处理。输入缓冲电路402可包括移位器410,该移位器对输入缓冲电路402的读取位置进行移位以改变发送给计算核416的数据的片段408。通过经由移位改变提供给计算核416的输入数据的片段,神经引擎314可基于较少数量的读取操作针对输入数据的不同片段执行相乘累加。在一个或多个实施方案中,神经处理器电路218的数据包括差异卷积组和/或输入通道的数据。
输入缓冲电路402还可包括多个寄存器411。在一些实施方案中,多个寄存器411包括第一寄存器和第二寄存器。第一寄存器和第二寄存器基于由NE控件418确定的输出行边缘的位置和零填充模式来加载。在一些实施方案中,对于每个分区,NE控件418标识针对每个分区的输出边缘行。对于每个内核行,NE控件418生成零填充模式。
具体地,第一寄存器(也被称为“填充寄存器”)基于零填充模式来加载,其中非活动值(例如,1)指示对应的MAC将被忽略。第二寄存器(也被称为“边缘寄存器”)加载有基于输出行边缘的位置的值,其中值(例如,1)指示对应的输入元素是输出行边缘的位置。每个分区设置或重新加载一次边缘寄存器。每个输入张量在光栅扫描方向上被划分为多个相等大小的分区(例如,16个元素)。每个分区可以被加载到NE中的一个NE中并由其计算,并且每个元素对应于每个MAC。填充寄存器在每个内核行的开始处被设置或重新加载。此后,基于预定XOR逻辑,每个循环更新填充寄存器。下面相对于图13A至图14进一步讨论与加载和更新填充寄存器和边缘寄存器相关的附加细节。
输出电路424从后处理器428接收经处理的值417,并且与数据处理器电路318交接以将经处理的值417存储在数据处理器电路318中。为此,输出电路424可以与在后处理器428中处理经处理的值417的顺序或格式不同的顺序或格式发出输出数据328。
神经引擎314中的部件可在配置周期期间由NE控件418和神经任务管理器310配置。为此,神经任务管理器310在配置周期期间将配置信息发送到神经引擎314。可配置参数和模式可包括但不限于输入数据元素和内核元素之间的映射、输入通道的数量、输出通道的数量、输出步幅的执行以及在后处理器428处启用/选择后处理操作。
示例串流卷积
本公开的实施方案涉及执行串流卷积操作。在串流卷积操作中,CNN的多个层物理地或虚拟地并行执行卷积操作。每个层可以将最近的计算结果立即串流传输到下一个卷积层。此外,与每个层相关联的缓冲器可以仅存储其卷积操作所需的输入数据的一部分,而不是整个输入张量(正如在逐层推断中所做的那样)。因此,串流卷积操作所需的存储器占用变得等于用于存储部分输入张量的张量缓冲器的总和。另一方面,逐层推断所需的存储器占用取决于需要最大总存储器大小来同时存储输入和输出张量的层,这可能远大于串流卷积所需的存储器占用。此外,以串流方式执行卷积操作也可以改善CNN的总体延迟。在串流卷积操作的情况下,一旦足够的输入数据被馈送到神经引擎电路,就可以计算CNN的输出张量的第一输出元素(例如,像素值)。因此,与在神经引擎电路处实现为逐层卷积操作的CNN的第一像素到第一像素的延迟相比,在神经引擎电路处实现为串流卷积操作的CNN的第一像素到第一像素的延迟可以显著更好。
图4B例示了根据一个实施方案的在神经引擎314处以串流方式执行的示例卷积操作。图4B的示例卷积操作是大小为3×3×1的内核系数422与大小为10×10×1的输入数据322(例如,输入张量)(例如,单色图像数据)的卷积,其生成大小为10×10×1的输出数据328(例如,输出张量)。图4B的示例卷积操作可以是CNN中多个卷积层中的一个卷积层的卷积操作。输入数据的片段408可以从前一层串流传输(例如,在光栅扫描中,从左到右,然后从上到下)。另选地,输入数据的片段408可以从系统存储器230或从图像信号处理器206接收。为了计算输出数据328中的输出元素434,神经引擎314将仅处理输入数据的片段408。因此,输入数据的仅与部分输入张量(例如,输入数据322的两行和两个输入元素)对应的片段408可以存储在例如缓冲存储器334中,以生成输出元素434。
在下一个计算循环中,输入数据322的新的输入元素将到达(例如,来自缓冲存储器334),如从前一层生成的,并且因此,神经引擎314将计算输出张量328的下一个输出元素。然而,存储在缓冲存储器334中的部分输入张量的大小不变,并且可以从缓冲存储器334中驱逐输入数据322的较旧输入元素,因为输入数据322的较旧输入元素不再用于处理。因此,对于串流卷积操作,仅部分输入张量(例如,输入数据322的两行和两个输入元素)可以存储在缓冲存储器334中,而不是缓冲整个输入数据322。
2D卷积中的示例零填充模式生成
图6例示了根据实施方案的用于对16×20×1输入张量610执行卷积操作的示例16×20×1输入张量610、3×3内核620或5×5内核630。为了更容易参考,输入张量610中的每个元素可以基于其沿x轴和y轴的索引号而被称为(x,y)。例如,顶行中的第一元素可被称为(0,0),顶行中的第二元素可被称为(0,1),以此类推。
相似地,3×3内核620或5×5内核630中的每个元素也可基于它们在x轴方向和y轴方向上的索引号而被称为(X,Y)。例如,内核620或630的顶行中的最左侧元素被称为(0,0),内核620或630的顶行中的第二元素被称为(0,1),以此类推。
图7例示了顺序地存储图6的16×20×1输入张量610的元素的32字节宽的存储器700(例如,TMEM)。存储器700可以是图3的缓冲存储器334和/或输入缓冲电路402。如图6和图7所示,张量610具有20个元素的宽度,每个元素占用存储器700的一个字节。如这些附图所示,存储器具有DWORD的宽度,其可以为4个字节。在一些实施方案中,存储器可以具有不同的宽度,诸如WORD,其为2个字节;或QWORD,其为8个字节。存储器的具有负地址的两个底部行可以对应于输入张量中的越界元素。
此外,输入张量610的元素被顺序地存储在存储器700中。这样,每个元素顺序地对应于字节地址。例如,元素(0,0)存储在对应于字节地址0的位置处;元素(0,1)存储在对应于字节地址1的位置处,以此类推。在一些情况下,输入张量710可以不存储在以字节地址0开始的位置处。然而,无论起始字节地址如何,输入张量610中的不同元素的相关位置通常是相同的。例如,如果元素(0,0)存储在带有字节地址N的位置处,则元素(0,1)应存储在带有字节地址N+1的位置处。此外,在一些实施方案中,每个元素可以占用多于或少于一个字节。在这种情况下,两个顺序元素之间的字节地址的增量也可以改变。
重新参照图6,为了更容易参考,在其中列出了顶行和左列中的元素的字节地址。例如,图6中的第二行中的第一元素(例如,元素(1,0))对应于字节地址20;图6中的第二行中的第二元素(例如,元素(1,1))对应于字节地址21,以此类推。
图8A和图8B例示了将3×3内核620应用于输入张量610的元素(0,0)以生成具有与输入张量610相同的形状和大小(16×20×1)的输出张量的元素(0,0)的示例。如图8A所示,3×3内核620的9个元素被应用于输入张量610的3×3补丁,其中元素(0,0)在中心。由于元素(0,0)是输入张量610中的第一元素,因此输入张量610的3×3补丁中的最顶部元素和最左侧元素是基于同一x,y坐标方案表示的越界元素。行0上方的第一越界行表示为行-1,并且行-1上方的第二越界行表示为行-2。如图所示,输入张量610的3×3补丁包括元素(-2,19)、(-1,0)、(-1,1)、(-1,19)、(0,0)、(0,1)、(0,19)、(0,1)和(1,1)。
每个张量元素中的数字表示存储张量元素的存储器的对应字节地址。假设元素(0,0)的字节地址为0,则这些越界元素被顺序地存储在地址-1至-21中。输入张量610的3×3补丁可以存储在带有字节地址-21、-20、-19、-1、0、1、19、20、21的位置处。
图8B是具有16列(对应于16个MAC)和9行(对应于9个循环)的表800B。假设每个NE具有16个MAC,这些MAC中的每个MAC对应于表800B的列,每一行的16个单元格表示输入张量610的数据元素以及16个MAC将接收的其对应地址。具体地,表800B的每一行示出了在基于3×3内核620在输入张量610的元素0上执行的9个连续卷积循环中,输入张量610的哪个输入元素及其存储器700的字节地址应被访问,以找到输出张量的第一行的前16个元素。这样,输出行边缘在最左侧位置。如图8B所示,虚线元素将被MAC忽略,因为它们:(1)是越界元素,或者(2)与同一循环中的其他元素相比属于输入张量610中的不同的行。例如,重新参照图8A,前四个循环中的单元格(-2,19)至(-1,19)是越界元素。因此,这些越界元素将被零填充。又如,循环7中的元素(0,19)属于张量610的第一行,而同一循环中的其他元素(1,0)至(1,14)属于张量610的第二行。因此,与同一循环中的其余元素相比,元素(0,19)属于张量的不同行,并且它将被零填充。
具体地,在第一循环期间,内核元素(0,0)被应用于带有字节地址-21的越界元素(-2,19)。因此,在第一循环期间,连续地存储在字节地址-21处的所有16个数据元素都被访问,包括(-2,19)、(-1,0)、(-1,1)......(-1,14)。在第二循环期间,内核元素(0,1)被应用于带有字节地址-20的越界元素(-1,0)。因此,在第二循环期间,连续地存储在字节地址-20处的所有16个数据元素都被访问,包括(-1,0)、(-1,1)、(-1,2)......(-1,15)。在第三循环期间,内核元素(0,2)被应用于存储在字节地址-19中的越界元素(-1,1)。因此,在第三循环期间,连续地存储在字节地址-20处的所有16个数据元素都被访问,包括(-1,1)、(-1,2)、(-1,3)......(-1,16)。前三个循环中的所有元素都将被零填充,因为它们是越界元素。
同样,在第四循环期间,内核元素(1,0)被应用于带有字节地址-1的越界元素(-1,19)。因此,在第三循环期间,连续地存储在字节地址-1处的所有16个数据元素都被访问,包括(-1,19)、(0,0)、(0,1)......(0,14)。在该循环中,只有第一元素(-1,19)是越界元素,并且它被零填充。另选地,与循环中的其余元素相比,元素(-1,19)也属于不同的行。因此,对于越界原因或行外原因,元素(-1,19)应被零填充。
在第五循环期间,内核元素(1,1)被应用于带有字节地址0的元素(0,0)。因此,在第五循环期间,连续地存储在字节地址0处的所有数据元素都被访问,包括(0,0)至(0,15)。在第六循环期间,内核元素(1,2)被应用于带有字节地址1的元素(0,1)。因此,在第六循环期间,连续地存储在字节地址1处的所有数据元素都被访问,包括(0,1)至(0,16)。值得注意的是,第五循环和第六循环中的所有元素都不是越界元素,并且它们属于输入张量的同一行。因此,它们不是零填充的。
在第七循环期间,内核元素(2,0)被应用于带有字节地址19的元素(0,19)。因此,在第七循环期间,连续地存储在字节地址19处的所有数据元素都被访问,包括(0,19)、(1,0)至(1,14)。尽管第七循环中的所有元素都不是越界元素,但是第一元素(0,19)属于输入张量的第一行,并且其余元素(1,0)至(1,14)属于输入张量的第二行。因此,第一元素(0,19)被零填充。
该过程重复第八循环和第九循环。在第八循环中,内核元素(2,1)被应用于带有字节地址20的元素(1,0)。在第九循环中,内核元素(2,2)被应用于带有字节地址21的元素(1,1)。在这两个循环中,所有被访问的元素都属于输入张量的第二行,并且在这些循环中不需要对元素进行零填充。
如图8A和图8B所示,零填充方案可以被标识为:(1)当内核行是越界的时,执行水平填充,例如,所有越界元素都被零填充,例如,在前三个循环期间;以及(2)当输出行边缘在最左侧位置时,在元素与循环中的其余元素相比来自不同的行时,仅对输出行边缘旁边的元素进行零填充。
图9A和图9B例示了将3×3内核620应用于输入张量610的元素(0,16)以生成具有与输入张量610相同的形状和大小(16×20×1)的输出张量的元素(0,16)的示例。如图9A所示,3×3内核620的9个元素被应用于输入张量610的3×3补丁,其中元素(0,16)在中心。类似于图8A,图9A的每个张量元素中的数字表示存储对应张量元素的存储器的字节地址。由于元素(0,16)是输入张量610中的顶行的元素,因此最顶部元素(-1,15)、(-1,16)和(-1,17)都是越界元素。
图9B是具有16列(对应于16个MAC)和9行(对应于9个循环)的表900B。同样,假设每个NE具有16个MAC,则表900B的每一行中的16个单元格表示输入张量610的数据元素的地址以及16个MAC将接收的其对应地址。具体地,表900B的每一行示出了在基于3×3内核620在输入张量610的元素16上执行的9个连续卷积循环中,输入张量610的哪个输入元素及其存储器700的字节地址应被访问,以找到输出张量的第一行的最后4个像素和第二行的前12个像素。因此,输出行边缘位于行的中间,如图9B所示。
在第一循环期间,内核元素(0,0)被应用于带有字节地址-5的越界元素(-1,15)。连续地存储在字节地址-5处的所有16个数据元素都被访问,包括(-1,15)至(-1,19),以及(0,0)至(0,10)。在第二循环期间,内核元素(0,1)被应用于带有字节地址-4的越界元素(-1,16)。连续地存储在字节地址-4处的所有16个数据元素都被访问,包括(-1,16)至(-1,19),以及(0,0)至(0,11)。在第三循环期间,内核元素(0,2)被应用于带有字节地址-3的越界元素(-1,17)。连续地存储在字节地址-3处的所有16个数据元素都被访问,包括(-1,17)至(-1,19)以及(0,0)至(0,12)。该过程重复所有9个循环。
参见图9B,在前三个循环期间,所有越界元素(用点阴影化)被零填充。在循环4,只有输出行边缘的右侧的元素(0,19)应被零填充,因为它在第二行的边界之外。在循环5,不需要零填充。在循环6,输出行边缘线的左侧的元素(1,0)应被零填充,因为它属于下一行。就零填充而言,循环7-9与循环4-6相同。因此,当输出行边缘在中间时,零填充方案可以被标识为,当元素的两个相邻元素来自不同行时,输出行边缘线的左侧或右侧的元素被零填充。
图10A和图10B例示了将3×3内核620应用于输入张量610的元素(7,4)以生成具有与输入张量610相同的形状和大小(16×20×1)的输出张量的元素(7,4)的示例。如图10A所示,3×3内核620的9个元素被应用于输入张量610的3×3补丁,其中元素(7,4)在中心。
同样,假设每个NE具有16个MAC,则图10B中的表的每一行中的16个单元格表示输入张量610的数据元素的地址以及16个MAC将接收的其对应地址。具体地,表1000B的每一行示出了在基于3×3内核620在输入张量610的元素0上执行的9个连续卷积循环中,输入张量610的哪个输入元素及其存储器700的字节地址应被访问,以找到输出张量的第八行中的最后16个元素。因此,输出行边缘位于最右侧位置,如图10B所示。
由于元素(7,4)在输入张量610的中间,因此3×3补丁中的所有元素都在输入张量610内,并且没有元素是越界的。因此,尽管在两行的边缘上执行零填充,但是不存在基于越界元素的零填充。如图10B所示,在循环3、6和9中,输出行边缘旁边的元素应被零填充,因为它们属于来自另一行的元素。因此,当输出行边缘在最右侧位置处时,如果输出行边缘旁边的元素属于与循环中的其余元素不同的行,则零填充方案可以被标识为对该元素进行零填充。
图11A例示了根据一个实施方案的当3×3内核620被应用于输入张量610的元素(14,8)时的另一示例情况。如图11A所示,3×3内核620的9个元素被应用于输入张量610的3×3补丁,其中元素(14,8)在中心。
同样,假设每个NE具有16个MAC,则图11B中的表的每一行中的16个单元格表示输入张量610的数据元素的地址以及16个MAC将接收的其对应地址。具体地,表1100B的每一行示出了在基于3×3内核620在输入张量610的元素0上执行的9个连续卷积循环中,输入张量610的哪个输入元素及其存储器700的字节地址应被访问,以找到输出张量的第15行的最后12个元素和第16行的前4个元素。因此,输出行边缘在中间,如图11B所示。
因为元素(14,8)接近输入张量的末端,所以在循环7-9,右侧的最后MAC正在获得越界元素。类似于图8A和图8B所示的情况,所有越界元素都被零填充,但是相对于图8A和图8B的不同之处在于输出行边缘处于不同的位置。此外,类似于图9A至图9B所示的情况,输出行边缘两侧的元素可以被零填充。具体地,当元素在输出行边缘线的左侧或右侧时,零填充方案可以被标识为当元素的两个相邻元素来自不同行时对元素进行零填充。
基于上述示例情况,零填充方案可以基于输出行边缘的位置和/或越界元素来标识。首先,所有越界元素都应被零填充。其次,当输出行边缘在最左侧位置时,在内核位置为(X,Y)时,对输出行边缘旁边的一个或多个元素进行零填充,其中Y≤向下取整(kernel_width/2)。第三,当输出行边缘在最右侧位置时,在内核位置为(X,Y)时,对输出行边缘旁边的一个或多个元素进行零填充,其中Y≥向上取整(kernel_width/2))。第四,当输出边缘在中间时,在内核位置为(X,Y)时,对输出行边缘旁边的一个或多个元素进行零填充,其中Y≤向下取整(kernel_height/2)或≥向上取整(kernel_height/2)。
上述零填充方案也可以在不同形状和/或大小的内核中实现,诸如5×5内核。图12A和图12B例示了将5×5内核应用于输入张量610的元素(0,16)以生成具有与输入张量610相同的形状和大小(16×20×1)的输出张量的元素(0,16)的示例。上述相同或类似的逻辑也适用于这种情况,尽管内核的形状或大小将影响大小和/或零填充区域。一般来讲,内核大小越大,将导致零填充区域越大。
示例XOR门实现
上文参考图6至图12B所描述的零填充方案可经由两个寄存器和XOR门(诸如图4A的寄存器411和XOR门413)实现。在一些实施方案中,针对每个NE实现XOR门和两个寄存器,即填充寄存器和边缘寄存器。填充寄存器用于记录零填充MAC,并且边缘寄存器用于记录输出行边缘。图13A至图13E例示了对应于图12B的循环11-15的边缘寄存器和填充寄存器的示例实施方案。
在一些实施方案中,填充寄存器是16位移位寄存器。位值指示对应的MAC是否应该忽略到来的数据。在一些实施方案中,1指示对应的MAC应当被忽略。边缘寄存器也是16位。位值指示输出行边缘在何处,其中1指示输出行边缘。例如,如图13A所示,在这种情况下,边缘位于边缘寄存器的索引3处。针对输入张量的每个分区设置一次边缘寄存器。每个输入张量在光栅扫描方向上被划分为多个相等大小的分区(例如,16个元素)。每个分区可以被加载到NE中的一个NE中并由其计算。填充寄存器需要在每个内核行的开始处重新加载。之后,使用以下公式(1)所示的XOR运算,填充寄存器在每个循环向左移位:
填充(i) = 边缘(i) XOR 填充(i+1) (1)
在上述XOR运算之后,填充寄存器的2个位被设置为一,这对应于循环12的情况。图13B例示了对应于循环12的填充寄存器和边缘寄存器的值。同样,对图13B的填充寄存器的零填充模式执行XOR运算以生成用于循环13的零填充模式,其在图13C中示出;对图13C的填充寄存器的零填充模式执行XOR运算以生成用于循环14的零填充模式,其在图13D中示出;并且对图13D的填充寄存器的零填充模式执行XOR运算以生成用于循环15的零填充模式,其在图13E中示出。
相似地,在图12B的循环12-15中,加载到填充寄存器中的值也沿循上述公式(1)。然而,图12B的循环6-10不同于图12B的循环11-15。也就是说,在图12B的循环6-10中,前4个MAC将对属于越界行的数据起作用。因此,它们需要一直被填充,并且需要额外的逻辑来支持此类填充模式。为了启用此类填充模式,将启用信号(表示为“edge_en”)添加到边缘寄存器。
图13F至图13H例示了对应于图12B的循环6-10的边缘寄存器和移位寄存器的示例实施方案。重新参照图12B,在循环6中,进入前6个MAC的数据应当被填充。因此,填充寄存器用朝向左侧的六个1初始化。边缘寄存器仍被设置为索引3。在下一个循环中,填充区域需要向左移位,这是不可能的,因为填充的第4个元素将由于边缘线在哪里而变成为0。为了解决这个问题,添加edge_en以停用对边缘寄存器的影响。因此,填充寄存器移位的逻辑被修改为下面的公式(2):
填充(i) = (边缘(i) && edge_en) XOR 填充(i+1) (2)
例如,图13F示出了在循环6中,edge_en被设置为0,使得填充寄存器中最右边的1在随后的循环中变成为0,并且它们中的其余部分保持不变。图13G中示出了循环7中的更新的填充寄存器。图13H中示出了循环8中的更新的填充寄存器。值得注意的是,在循环8中,edge_en被切换到1,因为填充区域在此之后不应改变。因此,使用附加信号edge_en,重新生成在图12B的循环6-10中观察到的额外模式。
又如,重新参照图10B,输出行边缘线一直向右。在这种情况下,控制器应当类似于当边缘线在中间的情况来处理填充位,并且还沿循每个内核行的第一循环的期望模式。
图13I至图13K例示了对应于图10B的循环1-3的边缘寄存器和填充寄存器的示例实施方案。图13I例示了对应于图10B的循环1的填充寄存器和边缘寄存器的值。重新参照图10B,在循环1中,不执行零填充。正在进入以在下一个循环中使用的下一个数据是元素(6,19),并且其对应的填充位被设置为1,使得当其通过边缘并进入填充寄存器时,其变成为未填充或0。需注意,这是与当输出行边缘线在中间某处时相同的填充模式。另一方面,参见图13J,在循环2中的数据之后立即出现的数据(将在循环3中使用),元素(7,0),这次应当将对应的位设置为0。以这种方式,当数据通过边缘边界时,其在填充寄存器中的对应位在循环3中变成为1,这是预期的,因为该元素属于另一行,如图13K所示。在图13I至图13K所示的循环1-3中的每个循环中,应用上述公式(2)。
又如,重新参照图11B,在循环7-9期间,在输出张量的底行中需要部分水平填充。在这种情况下,所有越界元素(右侧的4个元素)都应当在所有循环中进行零填充。在内核列的第二半中,例如循环9,输出行边缘线的左侧的一个元素应当被零填充。在这种情况下,当右侧的元素仍然被零填充时,输出行边缘线的左侧的元素被零填充。换句话说,XOR逻辑不能处理这种情况。给定仅边缘寄存器不足以支持这种情况,则edge_en也用于解决这种情况。
图13L至图13N例示了对应于图11B的循环7-9的边缘寄存器和填充寄存器的示例实施方案。图13L例示了对应于图11B的循环7的填充寄存器和边缘寄存器的值。如图13L所示,右侧的所有4个元素都被零填充,并且edge_en被设置为1。同样,公式(2)用于对填充寄存器中的值执行XOR运算,这将产生循环8的值。图13M例示了对应于循环8的填充寄存器和边缘寄存器的值,其中edge_en被设置为0。同样,公式(2)用于对填充寄存器中的值执行XOR运算,这将产生图13N所示的循环9的值。在图13N中,新的1已经出现在输出行边缘线的左侧,其沿循如图11B中观察到的预期行为。
在一些实施方案中,为了设置这些信号,NE控件418跟踪以下项:(1)第一MAC的输出列(表示为“output_col”),包括对应于从存储器(MAC0)读取的第一元素的输出列索引,(2)第一MAC的输出行(表示为“output_row”),包括对应于从存储器(MAC0)读取的第一元素的输出行索引,(3)内核列(表示为“kernel_col”),包括当前正在从KMEM读取的内核列索引(0是内核的最左列),以及(4)内核行(表示为“kernel_row”),包括当前正在从KMEM读取的内核行索引(0是内核的顶行)。
图14例示了用于初始化填充寄存器和数据输入位的逻辑,该数据输入位对应于在下一个循环中传递给NE的数据元素。为了生成针对填充寄存器的初始模式,逻辑可以使用16位解码器来生成足够数量的一(从最左侧的位开始),并且还使用16位移位器来调整那些1的位置。使用这两个简单块,可以在每个内核行的第一循环处生成上面观察到的所有模式。
用于生成零填充模式并基于所生成的模式来执行零填充的示例过程
图15是例示根据一个或多个实施方案的编译与神经网络相关联的操作的方法的流程图。该方法可由神经处理器电路218执行。
神经处理器电路218访问1510具有存储在缓冲存储器中的输入元素的输入张量的分区。在一些实施方案中,神经处理器电路218包括数据处理器电路和多个神经引擎。数据处理器电路将输入张量划分为多个分区,这些分区中的每个分区具有预定数量的输入元素。多个神经引擎中的特定神经引擎用于对多个分区中的特定分区执行卷积操作,以基于具有预定形状的内核来生成具有输出元素的输出张量的分区。
对于每个卷积操作,神经处理器电路218基于内核的位置和形状来确定1520输出行边缘的位置。在一些实施方案中,数据处理器电路确定输出行边缘的位置。神经处理器电路218基于输出行边缘的位置和越界输入元素来生成1530零填充模式。对于卷积操作的每个计算循环,数据处理器电路318基于零填充模式来使1540输入元素的子集被零填充。
在一些实施方案中,每个神经引擎包括边缘寄存器、填充寄存器和XOR门。对于每个分区,数据处理器电路基于输出行边缘的位置来使边缘寄存器被加载,其中1指示对应的输入元素是输出行边缘的位置。对于每个内核行,数据处理器电路基于零填充模式来使填充寄存器被加载,其中1指示对应的输入元素将被忽略。对于同一内核行中的计算循环,神经引擎使用XOR门基于第一寄存器和填充寄存器的当前值以及零填充模式来更新填充寄存器。
虽然已经例示和描述了具体的实施方案和应用,但是应当理解,本发明不限于本文所公开的精确构造和部件以及,并且在不脱离本公开的实质和范围的情况下,可对本文所公开的方法和装置的布置、操作和细节进行对本领域的技术人员将显而易见的各种修改、改变和变型。
Claims (20)
1.一种用于卷积中的高效零填充的方法,所述方法包括:
访问输入张量的多个分区中的分区,其中所述输入张量在光栅扫描方向上被划分为所述多个分区;
对于用于对所述输入张量执行卷积的内核的每一行:
用指示零填充模式的一组值填充寄存器;
对于所述内核的所述行中的计算循环:
部分地基于所述零填充模式来执行与卷积相关联的计算,
生成更新的零填充模式,所述更新的零填充模式表示用于所述内核的所述行中的下一个循环的零填充模式,以及
用所述更新的零填充模式更新所述寄存器中的所述一组值。
2.根据权利要求1所述的方法,其中生成更新的零填充模式部分地基于输出行边缘的位置或越界输入元素。
3.根据权利要求2所述的方法,所述方法还包括:
对于每个分区,用第二组值填充第二寄存器,指示所述输出边缘行的所述位置。
4.根据权利要求3所述的方法,其中生成表示用于下一个循环的零填充模式的所述更新的零填充模式包括在所述寄存器中的所述一组值与所述第二寄存器中的所述第二组值之间执行XOR运算。
5.根据权利要求2所述的方法,其中生成所述零填充模式包括:
确定内核行或列是越界的;
基于越界内核行或列来标识越界输入元素;以及
将所述越界输入元素包括在所述零填充模式中。
6.根据权利要求2所述的方法,其中生成所述零填充模式包括:
确定输出行边缘是否处于最左侧位置;
响应于确定所述输出行边缘处于所述最左侧位置,对于每个计算循环;
确定定位在对应于行号的行和对应于列号的列处的内核元素是否满足所述列号不大于所述内核的宽度的一半的向下取整值的条件;以及
响应于确定所述内核元素满足所述条件,
标识所述输出行边缘旁边的一个或多个输入元素;以及
将所述一个或多个输入元素包括在所述零填充模式中。
7.根据权利要求2所述的方法,其中生成所述零填充模式包括:
确定输出行边缘是否处于最右侧位置;
响应于确定所述输出行边缘处于所述最右侧位置,对于每个计算循环:
确定定位在对应于行号的行和对应于列号的列处的内核元素是否满足所述列号不小于所述内核的宽度的一半的向上取整值的条件;
响应于确定所述内核元素满足所述条件,
标识所述输出行边缘旁边的一个或多个输入元素并且将所述一个或多个输入元素包括在所述零填充模式中。
8.根据权利要求2所述的方法,其中生成所述零填充模式包括:
响应于确定所述输出行在中间位置,对于每个计算循环,
确定定位在对应于行号的行和对应于列号的列处的内核元素满足所述列号不大于所述内核的高度的一半的向下取整值或不小于所述内核的高度的一半的向上取整值的条件;以及
标识所述输出行边缘旁边的一个或多个输入元素;以及
将所述一个或多个输入元素包括在所述零填充模式中。
9.根据权利要求1所述的方法,其中所述一组值中的每个值对应于被配置为执行与所述卷积相关联的计算的计算电路,并且执行与卷积相关联的计算包括:
保持计算电路的对应于所述一组值中的活动值的结果;以及
忽略计算电路的对应于所述一组值中的非活动值的结果。
10.一种在其上存储指令的非暂态存储介质,所述指令在由处理器执行时使得所述处理器:
访问输入张量的多个分区中的分区,其中所述输入张量在光栅扫描方向上被划分为所述多个分区;
对于用于对所述输入张量执行卷积的内核的每一行:
用指示零填充模式的一组值填充寄存器;
对于所述内核的所述行中的计算循环:
部分地基于所述零填充模式来执行与卷积相关联的计算,
生成更新的零填充模式,所述更新的零填充模式表示用于所述内核的所述行中的下一个循环的零填充模式,以及
用所述更新的零填充模式更新所述寄存器中的所述一组值。
11.根据权利要求10所述的非暂态存储介质,其中生成更新的零填充模式部分地基于输出行边缘的位置或越界输入元素。
12.根据权利要求11所述的非暂态存储介质,还包括:
对于每个分区,用第二组值填充第二寄存器,指示所述输出边缘行的所述位置。
13.根据权利要求12所述的非暂态存储介质,其中生成表示用于下一个循环的零填充模式的所述更新的零填充模式包括在所述寄存器中的所述一组值与所述第二寄存器中的所述第二组值之间执行XOR运算。
14.根据权利要求11所述的非暂态存储介质,其中生成所述零填充模式包括:
确定内核行或列是越界的;
基于越界内核行或列来标识越界输入元素;以及
将所述越界输入元素包括在所述零填充模式中。
15.一种神经处理器电路,包括:
数据处理器电路,所述数据处理器电路具有存储输入张量的缓冲存储器;和
多个神经引擎;
其中所述数据处理器电路被配置为:
访问输入张量的多个分区中的分区,其中所述输入张量在光栅扫描方向上被划分为所述多个分区;
对于用于对所述输入张量执行卷积的内核的每一行:
用指示零填充模式的一组值填充寄存器;
对于所述内核的所述行中的计算循环:
部分地基于所述零填充模式来执行与卷积相关联的计算,
生成更新的零填充模式,所述更新的零填充模式表示用于所述内核的所述行中的下一个循环的零填充模式,以及
用所述更新的零填充模式更新所述寄存器中的所述一组值。
16.根据权利要求15所述的神经处理器电路,其中生成更新的零填充模式部分地基于输出行边缘的位置或越界输入元素。
17.根据权利要求16所述的神经处理器电路,还包括:
对于每个分区,用第二组值填充第二寄存器,指示所述输出边缘行的所述位置。
18.根据权利要求17所述的神经处理器电路,其中生成表示用于下一个循环的零填充模式的所述更新的零填充模式包括在所述寄存器中的所述一组值与所述第二寄存器中的所述第二组值之间执行XOR运算。
19.根据权利要求16所述的神经处理器电路,其中生成所述零填充模式包括:
确定内核行或列是越界的;
基于越界内核行或列来标识越界输入元素;以及
将所述越界输入元素包括在所述零填充模式中。
20.根据权利要求16所述的神经处理器电路,所述神经处理器电路包括多个计算电路,所述多个计算电路被配置为执行与所述卷积相关联的计算,其中所述一组值中的每个值对应于所述多个计算电路中的一个计算电路,并且执行与卷积相关联的计算包括:
保持计算电路的对应于所述一组值中的活动值的结果;以及
忽略计算电路的对应于所述一组值中的非活动值的结果。
Applications Claiming Priority (3)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| US18/093,051 US20240220764A1 (en) | 2023-01-04 | 2023-01-04 | Efficient zero padding in convolution at neural processor |
| US18/093,051 | 2023-01-04 | ||
| PCT/US2023/086222 WO2024147977A1 (en) | 2023-01-04 | 2023-12-28 | Efficient zero padding in convolution at neural processor |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| CN120530400A true CN120530400A (zh) | 2025-08-22 |
Family
ID=91666949
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| CN202380090530.7A Pending CN120530400A (zh) | 2023-01-04 | 2023-12-28 | 神经处理器处的卷积中的高效零填充 |
Country Status (3)
| Country | Link |
|---|---|
| US (1) | US20240220764A1 (zh) |
| CN (1) | CN120530400A (zh) |
| WO (1) | WO2024147977A1 (zh) |
Families Citing this family (1)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN120743196B (zh) * | 2025-08-29 | 2025-10-31 | 上海壁仞科技股份有限公司 | 数据加载方法、处理器、电子设备和存储介质 |
Family Cites Families (6)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US10037490B2 (en) * | 2016-12-13 | 2018-07-31 | Google Llc | Performing average pooling in hardware |
| CN107894957B (zh) * | 2017-11-14 | 2020-09-01 | 河南鼎视智能科技有限公司 | 面向卷积神经网络的存储器数据访问与插零方法及装置 |
| US10565285B2 (en) * | 2017-12-18 | 2020-02-18 | International Business Machines Corporation | Processor and memory transparent convolutional lowering and auto zero padding for deep neural network implementations |
| US10474543B1 (en) * | 2019-01-28 | 2019-11-12 | Stradivision, INC. | Method and device for economizing computing resources to be used during a process of verification of convolutional parameters using test pattern to enhance fault tolerance and fluctuation robustness in extreme situations |
| US11481471B2 (en) * | 2019-08-16 | 2022-10-25 | Meta Platforms, Inc. | Mapping convolution to a matrix processor unit |
| FR3116635B1 (fr) * | 2020-11-24 | 2024-11-29 | St Microelectronics Rousset | Procédé de mise à jour d’un réseau de neurones artificiel |
-
2023
- 2023-01-04 US US18/093,051 patent/US20240220764A1/en active Pending
- 2023-12-28 WO PCT/US2023/086222 patent/WO2024147977A1/en not_active Ceased
- 2023-12-28 CN CN202380090530.7A patent/CN120530400A/zh active Pending
Also Published As
| Publication number | Publication date |
|---|---|
| US20240220764A1 (en) | 2024-07-04 |
| WO2024147977A1 (en) | 2024-07-11 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US11989640B2 (en) | Scalable neural network processing engine | |
| US12505338B2 (en) | Dynamic variable bit width neural processor | |
| KR102871373B1 (ko) | 뉴럴 네트워크 프로세서에서 태스크들을 할당하기 위한 시스템들 및 방법들 | |
| CN112074847B (zh) | 拆分用于在神经网络处理器中处理的输入数据 | |
| CN108268931B (zh) | 数据处理的方法、装置和系统 | |
| CN114761969A (zh) | 用于神经处理器的多模平面引擎 | |
| CN114600128B (zh) | 神经网络处理器中的多维卷积 | |
| US12437183B2 (en) | Subtask storage for streaming convolutions in neural network processor | |
| CN120530400A (zh) | 神经处理器处的卷积中的高效零填充 | |
| CN115244544A (zh) | 用于神经处理器电路的异步任务执行 | |
| KR102859687B1 (ko) | 뉴럴 엔진 회로의 다중 동작 모드들 | |
| CN111027682A (zh) | 神经网络处理器、电子设备及数据处理方法 | |
| US12541677B2 (en) | Memory-efficient streaming convolutions in neural network processor | |
| US20240095541A1 (en) | Compiling of tasks for streaming operations at neural processor | |
| US20250278617A1 (en) | Processing non-power-of-two work unit in neural processor circuit | |
| US20240232571A1 (en) | Palettization of Kernel Vector in Neural Network Processor | |
| CN121368764A (zh) | 在神经网络处理器中的非对称量化的输入和内核系数的处理 | |
| US20240320470A1 (en) | Mulicast and simulcast in neural engines | |
| CN121311872A (zh) | 用于整数的卷积的具有加速的乘法器-累加器的神经引擎 |
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 |