用于int9量化的系统和方法

文档序号:168453 发布日期:2021-10-29 浏览:53次 >En<

阅读说明:本技术 用于int9量化的系统和方法 (System and method for INT9 quantization ) 是由 A·苏达尼 U·哈恩巴特 陈嘉欣 于 2021-04-29 设计创作,主要内容包括:本公开的实施例涉及用于INT9量化的系统和方法。公开了一种将存储在存储器中的数据从第一格式转换为第二格式的方法。方法包括:将存储在双倍数据速率(DDR)存储器中的数据中的位数扩展1位以形成扩展数据。方法还包括:确定存储在DDR中的数据是有符号数据还是无符号数据。而且,响应于确定数据是有符号的,将符号值添加到扩展数据的最高有效位并将数据复制到扩展数据的低阶位。响应于确定数据是无符号的,将数据复制到扩展数据的低阶位并将最高有效位设置为无符号值,例如零。将扩展数据存储在机器学习计算机阵列的处理瓦片的片上存储器(OCM)中。(Embodiments of the present disclosure relate to systems and methods for INT9 quantization. A method of converting data stored in a memory from a first format to a second format is disclosed. The method comprises the following steps: a number of bits in data stored in a Double Data Rate (DDR) memory is extended by 1 bit to form extended data. The method further comprises the following steps: it is determined whether data stored in the DDR is signed data or unsigned data. Also, in response to determining that the data is signed, a sign value is added to the most significant bits of the extension data and the data is copied to the lower order bits of the extension data. In response to determining that the data is unsigned, the data is copied to the lower order bits of the extension data and the most significant bits are set to an unsigned value, e.g., zero. The expansion data is stored in on-chip memory (OCM) of a processing tile of the machine learning computer array.)

用于INT9量化的系统和方法

技术领域

本公开的实施例涉及机器学习。

背景技术

基于硬件的机器学习(ML)系统通常包括多个核心/子系统(块(block)和瓦片(tile)),每个核心/子系统具有自己的处理单元和片上存储器(OCM)。ML系统可以处理量化的数字以进行各种计算。例如,可以将存储在例如双倍数据速率(DDR)存储器等的存储器单元中的量化数据传输到处理瓦片,使得处理单元可以针对各种ML操作来处理该数据。

通常,将浮点数(数据)转换为量化数据格式以便例如存储在DDR中,并且例如通过ML系统进行后续处理。量化格式可以包括但不限于有符号整数、无符号整数等,它们被用在算术逻辑单元(ALU)计算中。通常,量化格式类型的混合被例如ML系统用于各种计算。

遗憾的是,当前不存在在不引入偏移的情况下对量化格式类型的混合执行ALU计算的机制。这样,当在ALU计算中使用量化格式类型的混合时,要追踪每个操作数的格式类型,这增加了ALU计算的复杂性和等待时间。此外,在ML系统中,在将整数值输入到处理单元之前,可能需要对整数值进行重新缩放(rescale)。然而,处理器中的数学除法通常是耗时且效率低下的。

相关技术的前述示例以及与之相关的限制旨在是说明性的,而不是排他性的。通过阅读说明书和研究附图,相关技术的其他限制将变得明显。

发明内容

根据一些实现,提供了一种将存储在存储器中的数据从第一格式转换为第二格式以用于机器学习ML操作的方法,方法包括:将存储在双倍数据速率DDR存储器中的数据中的位数扩展1位以形成扩展数据;确定存储在DDR中的数据是有符号数据还是无符号数据;响应于确定数据是有符号的,将符号值添加到扩展数据的最高有效位并将数据复制到扩展数据的低阶位;响应于确定数据是无符号的,将数据复制到扩展数据的低阶位并将最高有效位设置为无符号值;以及将扩展数据存储在机器学习计算机阵列的处理瓦片的片上存储器OCM中。

根据一些实现,提供了一种系统,包括:双倍数据速率DDR存储器,被配置为存储第一格式的整数数据;以及机器学习处理单元,包括多个处理瓦片,其中每个处理瓦片包括:片上存储器OCM,被配置为接受和维护扩展数据以用于各种ML操作,扩展数据从来自DDR存储器的第一格式的整数数据转换而来,其中与第一格式的整数数据相比,扩展数据包括一个附加位,并且其中如果第一格式的整数数据是有符号的,则扩展数据的最高有效位是有符号的,并且其中如果第一格式的整数数据是无符号的,则扩展数据的最高有效位被设置为无符号值,并且其中扩展数据的最低有效位与第一格式的整数数据相同。

附图说明

当结合附图阅读时,通过以下详细描述,可以最好地理解本公开的各方面。注意,根据行业中的标准实践,各种特征未按比例绘制。实际上,为了清楚起见,可以任意地增加或减小各种特征的维度。

图1描绘了根据本实施例的一个方面的被配置为支持机器学习的基于硬件的可编程架构的说明性示例。

图2A至图2D示出了由图1中的基于硬件的可编程架构实现的从一种数字格式类型到另一种数字格式类型的量化。

图3A至图3B示出了根据本实施例的一个方面的用于将存储的数据从第一格式转换为第二格式的流程图。

图4描绘了根据本实施例的一个方面的POD单元的架构的示例的图。

图5示出了根据本实施例的一个方面的用于在机器学习操作中重新缩放整数数据的方法。

具体实施方式

以下公开提供了用于实现主题的不同特征的许多不同的实施例或示例。下面描述组件和布置的特定示例以简化本公开。当然,这些仅是示例,无意于进行限制。另外,本公开可以在各个示例中重复参考数字和/或字母。该重复是出于简单和清楚的目的,并且其本身并不指示所讨论的各个实施例和/或配置之间的关系。

在更详细地描述各个实施例之前,应该理解,实施例不是限制性的,因为这种实施例中的元件可以变化。同样应该理解,本文描述和/或图示的特定实施例具有可以容易地与该特定实施例分离并且可选地与任何其他实施例组合或可以被本文所描述的多个其他实施例中的任何实施例中的元件替代的元件。还应该理解,本文所使用的措辞是为了描述某些构思,并且该措辞并非旨在进行限制。除非另有定义,否则本文使用的所有技术和科学术语具有实施例所属领域通常所理解的相同含义。

提出了一种新的用于机器学习(ML)的可编程硬件架构,该架构至少包括主机、存储器、核心、数据流传输引擎、指令流传输引擎和推理引擎。存储器被配置为存储量化格式的浮点数,包括但不限于int8、uint8等。根据一些实施例,存储在存储器中的量化数据被转换为int9格式,从而均匀地表示不同的量化数据格式类型,例如int8、uint8等,并且提供数据的对称量化(即,相对于零,量化是对称的),同时消除了执行偏移量计算的需要。要了解,将数据转换为int9格式类型使得推理引擎能够对同类的int9格式类型操作数执行ALU计算,而无需追踪量化操作数的格式类型,从而简化了复杂度并使处理时间更快。

在一些实施例中,当从存储器单元(例如DDR)读取数据时,基于存储在存储器单元中的数字是int8还是uint8,将8位数字转换为int9格式类型,作为非限制性示例。在一些实施例中,使用9位,并且将int8格式类型符号扩展为int9格式类型,而将uint8格式类型复制到9位数据的最低有效位并且其最高有效位(即,位阶9)是无符号的,例如设置为零。要了解,软件组件可以确保被写入存储器单元(例如8位DDR)的int9的值在int8、uint8等的适当范围内,因为八个位不足以存储完整的int9范围。

在一些实施例中,软件组件被配置为执行操作以将int9数字的范围限制在int8、uint8等的范围内,或者可替代地,对int9数字执行操作以将其表示为两个int9数字,一个在int8范围内,另一个在uint8范围内。将int9数字表示为两个int9数字,一个在int8范围内,另一个在uint8内,使得能够在保留信息的同时将int9数字的最低有效位复制到8位DDR中。

在一些实施例中,可编程硬件架构的核心被配置为解释用于ML操作的多个ML命令/指令和/或从主机接收的数据,并基于接收到的ML命令中的数据来协调流传输引擎和推理引擎的活动。推理引擎可以包括密集操作引擎和不规则操作引擎。密集操作引擎是经过优化以利用规则操作(例如矩阵操作(诸如乘法、矩阵运算、tanh、Sigmoid等))高效处理密集数据的引擎。另一方面,不规则操作引擎是经过优化以利用不规则操作(例如存储器转置、对不规则数据结构(诸如树、图和优先级队列)的操作)高效处理零星数据的引擎。根据一些实施例,核心可以协调从主机接收的要处理的指令中的一些指令。在一些实施例中,核心可以是通用处理器,例如CPU。

在一些实施例中,核心被专门配置为在核心和推理引擎之间划分多个ML命令,以进行高效执行。待由推理引擎执行的ML命令和相关数据从核心和存储器被发送到指令流传输引擎和数据流传输引擎,以高效地流传输到推理引擎。如上所述,从存储器单元读取的数据被转换为int9格式。数据和指令流传输引擎被配置为响应于从核心接收到的编程指令,向推理引擎发送一个或多个数据流和ML命令。推理引擎被配置为根据从指令/数据流传输引擎接收的编程指令来处理从数据/指令流引擎接收的指令/数据流以进行ML操作。

要了解,在某些操作(例如tanh、Sigmoid等)之前,可能需要重新缩放推理引擎的密集操作引擎的数据输入。为了以高效的方式重新缩放,将输入到int32格式中的数据乘以整数标度值(scale value),然后进行移位。为了在计算中获得最高可能的精度和最低的误差,基于存储整数数据的寄存器大小(例如int32)来获得整数标度值和移位值之间的关系。

现在参照图1,描绘了被配置为支持机器学习的基于硬件的可编程系统/架构101的图的示例。尽管这些图将组件描绘为在功能上是分开的,但这种描绘仅出于说明的目的。显然,该图中描绘的组件可以被任意组合或划分为分离的软件、固件和/或硬件组件。此外,还将明显的是,不管这些组件如何组合或划分,这些组件都可以在同一主机或多个主机上执行,并且其中多个主机可以通过一个或多个网络连接。架构101中的每个引擎是专用的硬件块/组件,包括一个或多个微处理器以及片上存储器单元,该片上存储器单元存储由用户针对各种机器学习操作编程的数据和软件指令。当软件指令由微处理器执行时,每个硬件组件将变成有特殊用途的硬件组件,用于实践下面详细讨论的某些机器学习功能。在一些实施例中,架构101在单个芯片上,例如片上系统(SOC)。

在图1的示例中,架构101可以包括耦合到存储器(例如DDR)120和核心引擎130的主机110。存储器120可以耦合到直接存储器存取(DMA)引擎(未示出)和网络接口控制器(NIC)(未示出)以便接收外部数据。存储器120可以在内部被连接到数据流传输引擎140。核心130耦合到指令流传输引擎150,指令流传输引擎150耦合到数据流传输引擎140。核心130还耦合到通用处理器165。在一些实施例中,通用处理器165可以是核心130的一部分。指令流传输引擎150和数据流传输引擎140耦合到包括密集操作引擎161和不规则操作引擎163的推理引擎160。要了解,推理引擎160可以包括用于执行各种计算的阵列。要了解,对用于在推理引擎160中执行各种计算的阵列的任何讨论都是出于说明的目的,并且不应被解释为限制实施例的范围。例如,在一些实施例中,用于执行各种计算的阵列可以位于推理引擎160的外部。

要了解,外部数据可以是浮点格式,例如32位浮点。这样,当数据被存储在存储器120(例如8位DDR)中时,它可以被转换为整数格式类型,例如int8、uint8等。要了解,uint8的范围是0到255,而int8的范围是-128至127。相反,int9的范围是-256至255,因此可以同时表示int8和uint8,而无需进行任何偏移计算。使用int9作为uint8范围和int8范围使得能够将数据复制到标准8位DDR。要了解,关于32位浮点和8位DDR的使用的描述是出于说明的目的,并且不应被解释为限制实施例的范围。浮点数据最终被量化为int9而不是int8或uint8。此外,由于int9范围同时涵盖正值和负值,因此它导致零偏移,并且进一步简化了ML系统中int9数字的重新缩放。因此,当从存储器120(例如8位DDR)读取数据时,数据被转换为int9格式。要了解,一旦数据被转换为int9格式,当在计算中使用不同格式类型的混合时,就无需追踪操作数的类型。例如,使用int9消除了追踪正在执行的计算中的操作数是否为int8、uint8等的需要。

还要了解,在一些实施例中,存储器120(例如DDR)可以将浮点数(例如32位浮点)存储为四个8位值。这样,当将数据从存储器120(例如8位DDR)读取到片上存储器中时,在通用处理器165和/或不规则操作引擎163中执行从32位浮点到int9的量化。在一些实施例中,通用处理器165和/或不规则操作引擎163内的寄存器存储保持32位浮点值的32位宽。这样,浮点数可以被转换为int9数字以用于ML系统。然而,首先缩放32位浮点数,以便将其转换为int9格式。例如,适当的标度可以是:

标度=(浮点数上限范围–浮点数下限范围)/(int9上限范围–int9下限范围)=(末端(End)–(-End))/(255-(-255))=2End/(2(255))=End/255。

要了解,对于int9下限,当被扩展为包括-256时,可以使用相同的标度。要了解,图2A图示了32位浮点到int9全范围的对称量化和映射,而图2B图示了图2A中的映射以针对int9包括-256。如图所示,相同的标度可以同时用于图2A和图2B。图2C图示了32位浮点到int9的映射以及int9范围内的int8的表示。要了解,在int9范围内用于int8表示的标度与上面确定的标度不同。在一些实施例中,用于用9个位表示int8的标度可以是:

标度=(浮点数上限范围–浮点数下限范围)/(int8上限范围–int8下限范围)=(End-(-End))/(127-(-127))=End/127。

图2D图示了32位浮点到int9的映射以及int9范围内的uint8的表示。要了解,int9范围内的uint8的表示具有与图2A和图2B相同的标度。

在一些实施例中,当将数据从存储器120传输到阵列(例如推理引擎160等)中时,取决于要传输的数据是int8还是uint8,对要传输的数据进行符号扩展或零扩展。换言之,将数据从一种格式类型(例如int8、uint8等)转换为另一种格式类型(例如int9)。作为非限制性示例,当将数据从int8或uint8转换为int9格式时,可以通过将位数扩展1位,来将8位数据转换为9位数据。确定被转换的数据是有符号的(例如int8)还是无符号的(例如uint8)。如果被转换的数据是有符号的,则将int9的9位数据的最高有效位进行符号扩展;如果被转换的数据是无符号的,则将int9的9位数据的最高有效位被设置为零。要了解,int8或uint8被直接复制到int9数据的低阶位(即低8位阶)。要了解,与int8或uint8格式类型相比,int9数据可以被称为扩展数据(extended data)。在该示例中为int9格式类型的扩展数据被存储在推理引擎160中以对其进行操作。在一些实施例中,扩展数据可以被存储在推理引擎160的片上存储器(OCM)中,以由ML计算机阵列的处理瓦片来处理。要了解,在一些实施例中,可以将浮点数(例如32位浮点)转换为整数表示,例如,int9。在一个说明性实施例中,如图2A至图2D所示,对浮点数进行量化和适当缩放,以将其转换为int9格式类型。如图所示,一个缩放值可以被用于表示int9格式类型的int8的浮点数,而另一个缩放值可以被用于表示int9格式类型的uint8的浮点数。要了解,存储在存储器单元120(例如DDR)中的16位浮点数在从存储器单元120被存储到推理引擎160的OCM中时保持不变。对于非限制性示例,16位浮点的低7位与尾数的低7位相同,第8阶位被扩展但未在操作中使用,剩余的尾数位分别在第9和第10阶位,后面是指数和有符号位,有符号位后面是附加扩展位,该附加扩展位不用于任何操作。

要了解,推理引擎160可以包括以多个行和列(例如8行乘8列)的二维阵列布置的多个处理瓦片。每个处理瓦片可以包括至少一个OCM、一个POD单元和一个处理引擎/元件(PE)。此处,处理瓦片中的OCM被配置为以流传输方式从数据流传输引擎140接收数据。要了解,如上所述,接收到的数据可以是int9格式。OCM使得能够按处理瓦片对数据进行高效的本地访问。处理单元(例如POD和PE)被配置为分别对OCM中的接收数据执行高度专业化的任务,例如ML操作的密集计算和稀疏计算。

要了解,对于与ML操作相关联的各种ALU操作,相应处理瓦片的OCM可以以int9格式类型接收数据。要了解,在一些实施例中,存储在存储器120中的数据的格式类型(例如有符号的还是无符号的)被追踪,使得适当的指令可以被调度以被流传输以由适当的处理单元(例如处理瓦片的相应POD/PE)执行。换言之,通过处理瓦片,对以int9格式接收的数据执行各种ALU操作。以int9格式接收的数据可以是各种ALU操作的操作数。int9格式类型的各种ALU操作的结果可以被存储在相应的OCM中。

在一些实施例中,推理引擎160包括密集操作引擎161,该密集操作引擎161经过优化以利用规则操作(例如矩阵操作(诸如乘法、矩阵运算、tanh、Sigmoid等))高效处理密集数据(例如以int9格式从存储器120接收的数据)。另一方面,推理引擎160还可以包括不规则操作引擎163,该不规则操作引擎163经过优化以利用不规则操作(例如存储器转置、加法操作、对不规则数据结构(诸如树、图和优先级队列)的操作)高效处理零星数据(例如为int9格式类型)。根据一些实施例,核心130可以协调从主机110接收的待由通用处理器165(例如CPU等)处理的一些指令。

在一些实施例中,核心130被配置为执行通过通用高级语言编写的任何软件代码。核心130被配置为处理多个性能非关键操作,例如,数据/指令准备工作、数据收集、数据映射等。在一些实施例中,核心130还可以被配置为将接收到的ML命令分解为性能关键和非关键操作/任务,使得性能非关键操作可以由核心130处理,而性能关键操作(例如矩阵乘法)可以由推理引擎160处理。换言之,核心130被配置为在核心130和推理引擎160之间划分多个ML命令,以便高效地执行它们。在一些实施例中,核心130还可以被配置为将多个ML命令(也称为任务或子任务)分配/划分给各种组件(例如推理引擎160),以进行处理。在一些实施例中,核心130被配置为在存储器120中分配一个或多个位置以用于存储任务/命令、数据、在数据被处理之后的结果等,以供核心130或架构101中的其他组件(例如推理引擎160)访问和使用。这样,核心130和推理引擎160被配置为独自执行整个ML算法和操作,而不必依赖于或要求主机110执行某些ML命令或操作。通过支持并对可编程硬件架构101执行整个ML操作,核心130消除了将数据传输到主机110并返回执行任何不支持的ML操作的性能开销,并减轻了主机110实现更高性能的负担。

在一些实施例中,将待由推理引擎160执行的ML命令和相关数据(例如为int8格式)从核心130和存储器120发送到指令流传输引擎150和数据流传输引擎140,以便高效流传输到推理引擎160。在一些实施例中,数据/指令流传输引擎140-150被配置为:响应于从核心130接收的ML命令,将一个或多个数据流和编程指令发送到推理引擎160。要了解,在一些实施例中,追踪存储在存储器120中的数据的格式类型(例如有符号的还是无符号的),使得适当的指令可以被调度以被流传输到推理引擎160的密集操作引擎161和/或不规则操作引擎163。换言之,通过推理引擎160中的引擎,对以int9格式接收的数据执行各种ALU操作。以int9格式接收的数据可以是各种ALU操作的操作数。int9格式类型的各种ALU操作的结果可以被存储在推理引擎160的密集操作引擎161和/或不规则操作引擎163中。在一些实施例中,结果可以被存储在ML计算机阵列的处理瓦片的适当OCM中。

要了解,在一些实施例中,推理引擎160内的ALU操作的结果被存储在推理引擎160内的相应处理瓦片的存储器组件(例如OCM)内。存储在推理引擎160中的结果可以被发送以便存储到存储器单元120(例如DDR)。然而,在存储结果之前,如果结果的值超过了存储器单元120中的数据的格式类型的上限(例如最大值),则可以将结果的值调整为针对数据的上限范围,并且,如果结果的值小于存储器单元120的上限范围,则可以将结果的值调整为针对数据的下限范围(例如最小值)。要了解,当将来自相应处理瓦片的OCM的结果存储到存储器单元120中时,丢弃int9结果的最高有效位。

要了解,在一些实施例中,存储在相应OCM中的处理结果可以被发送以存储回存储器单元120(例如DDR)。然而,在存储结果之前,如果结果的值超过了存储器单元120中的数据的格式类型的上限(例如最大值),则可以将结果的值调整为针对数据的上限范围,并且,如果结果的值小于存储器单元120的上限范围,则可以将结果的值调整为针对数据的下限范围(例如最小值)。换言之,可以将数据限制在适当的范围内,例如int8范围、unit8范围等。要了解,当将来自相应处理瓦片的OCM的结果存储到存储器单元120中时,丢弃int9结果的最高有效位。而且,要了解,软件模块可以追踪存储在存储器单元120中的数据是有符号的还是无符号的,使得当将数据从推理引擎(例如推理引擎160的相应OCM)传输到存储器单元120(例如DDR)时,int9数据格式类型可以被正确地解释成适当的格式类型,例如,针对存储器单元120中int8格式的数据,int8;针对存储器单元120中uint8格式的数据,uint8;等等。

现在参照图3A和图3B,示出了如图1至图2D所述用于支持将存储在存储器(例如DDR)中的数据从第一格式(例如int8、uint8、浮点等)转换为第二格式类型(例如int9)的过程的示例。尽管为了说明的目的,附图以特定顺序描绘了功能步骤,但是过程不限于任何特定顺序或步骤布置。相关领域的技术人员要了解,可以以各种方式省略、重新布置、组合和/或更改该图中描绘的各个步骤。

如图3A和图3B所示,在步骤310中,将存储在存储器单元120(例如DDR)中的位数扩展1位,以形成扩展数据(例如int9)。这样,包括8位的int8或uint8被扩展为9位。要了解,在一些实施例中,存储在存储器单元120中的数据是浮点数。在步骤320中,确定存储在存储器120中的数据是有符号的(例如int8)还是无符号的(例如uint8)。在步骤330中,响应于确定数据是有符号的,对扩展数据进行符号扩展。相反,在步骤340中,响应于确定数据是无符号的,将扩展数据的最高有效位设置为零。将数据复制到低阶位,在步骤350中,因此是除最高有效位外的所有阶位。在步骤360中,将扩展数据复制到推理引擎160,例如推理引擎160的OCM。要了解,在步骤370中,追踪存储在存储器单元120(例如DDR)中的数据是有符号的还是无符号的,并且,这样,在步骤380中,调度针对扩展数据适当的指令。在步骤382中,可以对扩展数据执行各种ALU操作。在步骤384,将ALU操作的结果存储在OCM中。在步骤386,还将存储在OCM中的ALU操作的结果存储/复制到存储器单元120(例如DDR)。在步骤388中,在将结果从OCM存储到DDR之前,丢弃结果的最高有效位。要了解,可选地,在步骤390中,可以基于存储在存储器单元120中的数字格式类型的范围,在将ALU的结果的值从OCM存储到存储器单元120(例如DDR)之前,对其进行调整。例如,如果存储在OCM中的结果的值超过了存储在存储器单元120中的数字类型(例如int8或uint8等)的上限范围,则将结果调整并改变为数字(因此是int8、uint8等)的最大值或上限范围。

图4描绘了POD的架构的示例的图。要了解,图4中所示的组件数量、组件大小以及位数、矩阵大小等是出于说明的目的,而不旨在限制实施例的范围。尽管在以下讨论中将矩阵乘法用作非限制性示例,但是要了解,POD还被配置为执行ML操作的其他类型的密集计算任务。在图4的示例中,POD包括计算POD指令控件699,该计算POD指令控件699被配置为控制将数据/指令加载到各种组件(例如寄存器、tanh/sigmoid单元614等)中。要了解,POD包括矩阵乘法块602,该矩阵乘法块602是具有X行和Y列的二维阵列,其中该阵列中的每个元素/单元具有一定数量的寄存器(例如MIPS或无互锁管线级微处理器)。矩阵乘法块602被配置为将两个矩阵(X行和Z列的矩阵A以及Z行和Y列的矩阵B)相乘,以生成X行和Y列的矩阵C。要了解,即使存储在存储器单元120中的数据为不同的类型格式(例如int8、uint8、浮点数等),相乘的数据也可以是存储在它们相应OCM中的int9格式类型。

在图4的示例中,POD还包括三种类型的寄存器:A寄存器604、B寄存器606和C寄存器608,它们将矩阵数据馈送到矩阵乘法块602以进行矩阵乘法。A寄存器604包括一组寄存器,例如,m个寄存器,每个寄存器被配置为维持A矩阵的一个行/列被馈送到矩阵乘法块602的阵列的列。每个A寄存器可以具有若干条目(例如k个元素),每个条目具有一定数量的位宽,并且每个周期支持一次读或写操作。要了解,即使存储在存储器单元120中的数据为不同的格式类型(例如int8、uint8、浮动类型等),每个寄存器中的数据也可以是int9格式类型。换言之,数据从存储器单元120的一种格式被转换为不同的格式类型(例如int9),以被存储在处理瓦片的相应OCM中,以被用于PE和/或POD操作的ALU计算。这些条目允许每个A寄存器在矩阵乘法块602进行计算需要A矩阵的接下来的部分之前,先获取A矩阵的接下来的部分。B寄存器606包括一组寄存器,例如n个寄存器,每个寄存器被配置为维持B矩阵的一个行/列被馈送到乘法块602的阵列的行。类似于A寄存器604,每个B寄存器可以具有若干条目(例如k个元素),每个条目具有一定数量的位宽,每个周期支持一次读或写操作。这些条目允许每个B寄存器在矩阵乘法块602进行计算需要B矩阵的接下来的部分之前,先获取B矩阵的接下来的部分。C寄存器608被配置为保存由乘法块602产生的矩阵乘法结果(C矩阵)。C寄存器608包括若干存储体,每个存储体被配置为维持C矩阵的一个行/列。C矩阵被配置为具有m x n个元素。

在矩阵乘法过程中,矩阵乘法块602被配置为分别将矩阵A和B的元素从OCM读取到A和B寄存器中一次(而不是重复读取矩阵的每一行或每一列),从而节省了对OCM的存储器存取时间。具体地,每个矩阵乘法操作具有其固有的结构,其中第一矩阵的行将与第二矩阵中的所有列相乘,而第二矩阵的列将与第一矩阵中的所有行相乘。当矩阵乘法块602执行矩阵乘法操作时,A寄存器604的每一行保持不变,而B寄存器606的列被馈送到矩阵乘法块602,每次一列,以与A寄存器604中的行相乘。同时,B寄存器606的每一列保持不变,而A寄存器604的行被馈送到矩阵乘法块602,每次一行,以与B寄存器606的列相乘。这样,矩阵乘法块602被配置为同时将第一矩阵的每一行乘以第二矩阵的所有列并且将第二矩阵的每一列乘以第一矩阵的所有行。这些乘法的这些输出被累加并存储在C寄存器中,直到矩阵乘法过程完成为止。

如图4的示例所示,A寄存器604、B寄存器606和C寄存器608分别与对应的OCM流转化器(streamer)603、605或607相关联,其中每个OCM流转化器被编程并被配置为将数据从OCM流传输到对应的寄存器中,以确保矩阵乘法块602能够以流传输方式执行矩阵乘法操作。每个OCM流转化器都有要读取的OCM的地址范围、以及下一次读取要遵循的步幅。A或B类型的寄存器被配置为将每个存储体的下一行准备好信号发送到其对应的流转化器,其中该信号的位模式指示哪些存储体正在请求下一数据行。A或B寄存器的对应流转化器通过将对应数据行从OCM发送到寄存器来响应读取信号。流转化器在发送要传输的最后一个数据行时,将完成信号发送到其对应的寄存器。当寄存器的所有存储体都具有数据行时,A或B寄存器向矩阵乘法块602发送准备就绪信号,该信号表明下一组A或B寄存器准备好被读取到矩阵乘法块602中以进行矩阵乘法。在一些实施例中,每个寄存器存储体具有有效位,该有效位通知矩阵乘法块602哪些值是有效的并且应该对其进行操作。

当矩阵乘法完成时,例如,当到达A矩阵的行尾和B矩阵的列尾时,矩阵乘法块602通知C寄存器608:C寄存器608的条目中的所有累加完成,并且条目准备好经由其对应的流转化器607被写回到OCM。然后,C寄存器608的每个存储体将数据发送到OCM。如果OCM还没有准备好接受来自C寄存器608的存储体的数据,则该发送被暂缓并且在下一个周期中再次尝试,直到PE准备好接受来自存储体的数据。在一些实施例中,在下一个矩阵乘法操作期间,在下一组累加之前,向C寄存器608预加载数据或将其重置为零。这种预加载允许添加偏差作为下一个矩阵乘法的一部分。在一些实施例中,每个PE被配置为接受、处理并将来自POD的矩阵乘法块602的输出C矩阵写入OCM中。

根据一个示例,存储在相应OCM中的处理结果可以被发送以存储回存储器单元120(例如DDR)。然而,在存储结果之前,如果结果的值超过了存储器单元120中的数据的格式类型的上限(例如最大值),则可以将结果的值调整为针对数据的上限范围,并且,如果结果的值小于存储器单元120的下限范围,则可以将结果的值调整为针对数据的下限范围(例如最小值)。换言之,可以将数据限制在适当的范围内,例如int8范围、unit8范围等。要了解,当将来自相应处理瓦片的OCM的结果存储到存储器单元120中时,丢弃int9结果的最高有效位。而且,要了解,软件模块可以追踪存储在存储器单元120中的数据是有符号的还是无符号的,使得当将数据从推理引擎(例如推理引擎160的相应OCM)传输到存储器单元120(例如DDR)时,int9数据格式类型可以被正确地解释成适当的格式类型,例如,针对存储器单元120中int8格式的数据,int8;针对存储器单元120中uint8格式的数据,uint8;等等。

在一些实施例中,推理引擎160被配置为将每个PE进行的这些后(post)矩阵乘法操作与对应POD进行的矩阵乘法操作融合/集成,使得立即对来自矩阵乘法块602的输出执行这些后矩阵乘法操作,而无需先将输出发送并保存到OCM,然后针对这些后矩阵乘法操作再次从OCM读取C矩阵。通过绕过到OCM的往返过程(roundtrip),后矩阵乘法操作与矩阵乘法操作的融合节省了时间,提高了推理引擎160的效率。例如,要了解,在一些实施例中,可能需要对输出C矩阵执行附加常规操作,例如整流线性单元(RELU)、量化等。因此,可以在POD架构中集成一种切换机制来确定是否需要附加常规操作,并且,如果需要,则可以对输出进行操作,而不是将输出C矩阵写入另一存储器位置。例如,当需要整流线性操作时,将输出C矩阵流传输到RELU单元601,该RELU单元601配置为对C矩阵执行ReLU操作。类似地,当需要量化时,将输出C矩阵或RELU单元601的输出流传输到量化单元612,该量化单元612被配置为量化C矩阵或来自RELU操作的结果。

在一些实施例中,量化/重新量化操作所需的标度、移位和/或偏移值可以由核心130静态地设置,并且可以因不同ML操作而不同。在一些实施例中,这些值可以是下载到核心的ML模型的一部分,其中与ML操作相对应的值可以在量化操作开始之前从模型读取并被写入适当的寄存器中。要了解,重新量化执行对存储在C寄存器608中的输出值的重新缩放,以输入到量化612和/或tanh/sigmoid单元614,并且随后直接存储到其对应的OCM块中。要了解,在该示例中,对输出数据(例如C寄存器608)执行重新量化,但是在其他示例中,它可以对来自其他寄存器的其他输出执行重新量化。这样,对存储在C寄存器608中的数据执行重新量化是出于说明的目的,并且不应被解释为限制实施例的范围。在一些实施例中,将单个缩放值应用于输出的所有元素。要了解,缩放操作(其是除法操作)可以用整数乘法和移位操作来代替。还要了解,整数乘法的值(也称为整数标度值)与移位值之间的关系决定了系统中的准确度和误差。在一些实施例中,获得整数标度值和移位值之间的关系,并基于存储乘法(来自C寄存器608的输出和整数标度值的乘法)的结果的寄存器大小,选择整数标度值及其对应的移位值的最大可能值。在一些实施例中,来自C寄存器608的输出可以被表示为V,而量化乘数可以被表示为x,其中x可以大于或小于1。要了解,整数标度值和移位值之间的关系确定了量化乘数。整数标度值和移位值之间的关系由下面的等式(1)近似地给出。

x~整数标度值/(2移位值) (1)。

因此,

整数标度值=int(x*2移位值) (2)。

要了解,最大整数标度值受保存整数乘法的结果的寄存器大小的限制,因此,C寄存器608的输出,即V值,受到整数标度值的限制。例如,如果V是int32并且寄存器大小为64位,则整数标度值必须小于最大32位整数,否则它将溢出。换言之,最大允许值是2147483647。要了解,其他大小的最大允许值可以是不同的,并且以上提供的示例仅用于说明的目的,不旨在限制实施例的范围。这样,将满足下面的等式(3)中提出的条件。

整数标度值/最大允许值<1 (3)

在一些实施例中,为了获得最大可能的整数标度值,对等式(2)和(3)进行迭代。最初,移位值为0,并且每次迭代后,移位值都会增加一个值,例如1、2、5、6、7、11等。移位值确定可能的整数标度值,并且只要等式(3)所标识的条件成立,则再执行一次迭代。重复该过程,直到等式(3)不再成立为止,此时选择先前的移位值及其对应的整数标度值。要了解,即使最大的先前整数标度值及其对应的移位值在给定寄存器大小的情况下提供了最高的精度,也可以选择任何先前的移位值及其对应的整数标度值。用python示出了用于选择最大可能的整数标度值及其对应的移位值的上述过程:

def calculate rscale rshift(which type,x):

#给定量化乘数x,计算rscale和rshift的值

#逐元素的操作限于累加器中的49位,因此必须将最大的rscale减小到18位

#否则,使用64位累加器并且允许32位rscale值,

#仍然可以保持用于确定rshift的相同逻辑,因为rshift将更早退出

for i in tange(65):#即0-64,需要rshift 1到63,对于shift 63是正确的情况,需要具有一个更多的循环

要了解,一旦选择了整数标度值及其对应的移位值,就可以执行量化/重新量化操作。将C寄存器608的输出乘以整数标度值。将乘法的结果移位了上面所选择的移位值以形成缩放的整数数据。一旦缩放了数据,就可以执行附加操作,例如,tanh操作、sigmoid操作、取整操作、限幅/钳位操作等。在一些实施例中,取整操作是通过考虑由于移位操作而下降的最高有效位来执行的,并且基于已经下降的最高有效位来取整剩余结果。要了解,可以基于整数数据的范围来进一步调整缩放的整数数据。例如,如果存储在存储器单元120中的整数数据是int8,并且如果缩放的整数数据超过了int8的上限,则将缩放的整数数据改变并调整为int8的最大值或上限。类似地,如果存储在存储器单元120中的整数数据是uint8,并且如果缩放的整数数据超过了uint8的上限,则将缩放的整数数据改变并调整为uint8的最大值或上限。相反,如果缩放的整数数据的值低于存储在存储器单元120中的数据的最小值或下限范围,例如int8或uint8,则将缩放的整数数据调整并改变为存储器单元120中整数数据的最小值或下限范围。

现在参照图5,示出了一种用于在机器学习操作中重新缩放整数数据的方法。要了解,图5所示的方法是如图4所示的操作的方法流程。在步骤510中,如等式(1)中所述,确定整数标度值和移位值之间的关系。在步骤520中,针对等式(2)迭代地增加移位值并获得其对应的整数标度值,直到等式(3)中所示的条件不再成立,因此该值大于或等于1。在步骤530中,选择在等式(3)不再成立之前的移位值及其对应的整数标度值。要了解,在一些非限制性示例中,步骤510-530是在编译步骤期间并且在推理引擎160进行任何推理之前执行的。在步骤540中,例如从C寄存器608接收整数值,例如int32格式。在步骤550中,将接收到的整数值乘以已选择的整数标度值。在步骤560中,将乘法的结果移位了与所选择的整数标度值相对应的移位值。在步骤570中,可以执行进一步的操作,例如,tanh、sigmoid、取整、限幅、钳位等。在步骤580中,可以基于存储在存储器单元120中的整数数据的范围来调整缩放的整数数据的值。例如,如果int8类型数据被存储在存储器单元120(例如DDR)中,那么,如果缩放的整数数据超出了int8数据类型的上限,则将缩放的整数数据改变为int8类型数据的最大值或上限值。类似地,如果uint8类型数据被存储在存储器单元120(例如DDR)中,那么,如果缩放的整数数据超过uint8数据类型的上限,则将缩放的整数数据改变为uint8类型数据的最大值或上限值。相反,如果缩放的整数数据小于int8数据类型的下限,则将缩放的整数数据改变为存储在存储器单元120(例如DDR)中的int8数据类型的最小值或下限。类似地,如果缩放的整数数据小于uint8数据类型的下限,则将缩放的整数数据改变为存储在存储器单元120(例如DDR)中的uint8数据类型的最小值或下限。因此,基于寄存器大小的大小,可以实现更高的精度和准确度。

出于说明和描述之目的,已经提供了对所要求保护的主题的各个实施例的前述描述。并不旨在穷举或者将所要求保护的主题局限于所公开的精确形式。许多修改和变化对于本领域技术人员将是明显的。选择并描述实施例是为了最好地描述本发明及其实际应用的原理,从而使相关领域的技术人员能够理解所要求保护的主题、各个实施例以及适合于所设想的特定用途的各种修改。

22页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:一种数据处理装置

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!