下冰雹 · 2023年10月25日 · 黑龙江

AI芯片设计--专用硬件的映射操作

在第5章中讨论了实现专用DNN硬件的各种关键设计考虑因素和技术。还介绍了将特定工作负载层的计算映射到特定DNN加速器设计的概念,以及选择正确映射的类似编译器的过程对优化能效和性能的行为很重要。

映射涉及到在加速器的硬件功能单元上进行DNN计算所需的每个操作(包括交付适当的操作数)在空间和时间上的放置和调度映射有以下关键步骤。

1. 确定数据流: 如果目标DNN加速器支持多个数据流,则映射必须选择一个数据流。在第5章介绍的设计的loop nest表示中,数据流以for循环的数量和顺序显示。对于多级存储,循环可以在每个级别上具有独立可选的顺序。在所有这些数量级之间的选择可以对加速器的行为产生重大影响,因此是映射的重要组成部分。然而,仅仅选择一个数据流是不够的,因为它没有定义循环边界。

2. 确定数据tile大小: 在选择数据流之后,我们需要确定每个级别上的每个存储实例在一定时间内所处理的每种数据类型的数据块。因此,这种tiling是在空间和时间上进行的,并且会对需要移动的数据量产生重大影响。例如,对于存储级别L1上的权重平稳(WS)数据流,输入激活块和partial sum块的大小决定了权重块在L1中被重用的次数,L1的存储容量限制了这三个数据块的大小。从设计的loop nest表示的角度来看,这一步确定for循环边界。

3. 将操作绑定到硬件: 给定了loop nest顺序和固定的循环边界,最后一步是确定每次循环迭代时操作(算术计算或数据访问)绑定到硬件(PE或buffer)的位置。例如,一种可能性是简单地定义并行循环的第i次迭代的算术运算到ID为i的PE。在不失去一般性的情况下,我们将假设这个简单的绑定在本章的其余部分使用。然而,在某些情况下,更复杂的绑定方案可能是有益的,例如,当parallel-for循环的范围不等于PE的数量时,或者当可以考虑硬件的某些物理属性时(例如,特定PE或buffer彼此之间的物理接近度)。

特定DNN加速器上的特定工作负载形状的所有可能映射的集合,称为该工作负载的映射空间(map space)。考虑到映射中的自由度,映射空间可能非常大。此外,加速器设计的许多属性都是固定的,例如PE的数量、buffer的数量和大小以及片上网络(NoC)的连接性,导致映射合法性受到复杂的约束。因此,映射空间往往是不规则的(即在不受约束的映射空间中存在许多非法点)。

映射空间的大尺寸和不规则性,以及不同的映射可能导致硬件上的性能或能源效率显著不同,导致人们强烈希望能够在映射空间中找到最佳映射。用于查找这种映射的工具称为映射器(mapper)。为了完成它的工作,映射器需要能够表达和搜索映射空间,并评估和量化不同映射的能源效率和性能。在本章中将介绍执行这种搜索的机制,包括一些可以用来系统地描述映射的分析框架。首先将探讨映射的构成。

6.1 Mapping和Loop Nests

将工作负载形状映射到DNN加速器涉及许多选择,包括:从加速器支持的数据流中选择数据流,并将所有操作数的空间和时间tiling到加速器的存储和计算组件中。对于CONV层和FC层,这些因素可以用第5章中描述的loop nest来表示。因此,可以从选择和参数化loop nest的角度来查看创建映射的过程。

为了提供一个映射到DNN加速器设计的有指导意义的例子,考虑图6.1所示的简单DNN加速器设计。该体系结构假定有两个PE,每个PE处理单个输入通道,多个输出通道的1-D卷积。每个 PE 的buffer可以保存唯一输入通道的输入特征图,以及当前正在处理的输出通道的输出特征图和weight。由于PE一次只能保存单个输出通道的weight,因此处理新的输出通道需要从GLB加载其weight,并且将来自先前输出通道的输出特征图发送到GLB。假设PE可以配置为运行output stationary数据流或weight stationary数据流。

image.png
图6.1: 映射目标结构的单输入通道1-D卷积与多输出通道。这个设计有一个GLB和两个PE,每个 PE 都有用于单个通道的输入和输出特征图和weight的buffer。每个PE配置了预加载的input feature map,并通过从GLB加载该通道的weight,计算该通道的output feature map并将该fmap发送回GLB来处理每个输出通道。

与该设计相对应的loop nest如下面的Design 6.1所示。该设计使用输入特征图 (i[]) 和filter weight (f[]) 执行单输入通道、多输出通道1D conv,生成具有多个输出通道 (o[]) 的输出特征图。这些变量(及其大小)在第1-3行中定义。暂时跳过第7-9行,最外面的for循环(第13行)表示M个输出通道的tiling,并且该循环的每次迭代都会从global buffer读取tile大小的weight。这些tile被发送到由第17行中的parallel-for表示的并行PE单元,其中m1对应于执行处理的PE的ID。活动输出通道的索引在第18行中根据输出通道tile number (m2) 和执行processing的PE的ID (m1)计算。最后,使用WS数据流(第23-26行)或OS数据流(第28-31行)在PE处理单元中执行实际卷积。

在Design 6.1的嵌套循环中,有一组变量控制其行为。首先是变量W、M、S和Q在第1-3行中使用,它们定义了workload的shape。其次,是控制嵌套循环行为的变量M2、M1和PE_dataflow。对于这种设计,这些变量构成了workload到design的mapping,因为它们控制了活动在空间和时间上的放置和调度。在代码中,这些变量从关联数组中使用名称映射进行赋值。我们假定映射的内容是由mapper根据某些优化标准设置的。

在这个设计中,映射只有两个组件。映射的第一个组件是从支持的两个数据流中选择一个。这是由PE_dataflow映射变量控制的,该变量指定了for循环中使用的索引变量(“s”和“q”)的迭代顺序。因此,PE_dataflow本质上为表示PE数据流的for循环设置了排列顺序,将PE的数据流表示为weights-outputs (" sq ")或outputs-weights (" qs "),分别对应于weight-stationary和output-stationary数据流。

第二个组件是由映射变量M2和M1控制的输出通道相关数据的spatio-temporal tiling。这些变量的乘积必须至少等于输出通道的数量,因此M<=D M2 * M1。此外,空间tiling大小(M1)受到设计中PE的实际数量的限制,因此M1<=D2。

任何映射都必须满足的条件称为映射约束,映射器mapper的目标是在这些约束下优化系统行为。在这个例子中为了优化吞吐量,希望通过设置M1=2来实现PEs的充分利用,但在更复杂的场景中,不能总是实现完美的充分利用。即使是M1=2,奇数个输出通道(M)也会导致m2循环的最后一次迭代(第13行)中PE未被充分利用。

image.png

上面的例子很简单,因为存储层次的每个层次上都没有几个索引变量(没有用于输入特征映射或filter weight、batch size或输入通道的额外维度),只有输出通道被tiling。因此,映射的选择既有限又明显。在更现实的设计中,许多(有时是全部)索引变量将出现在层次结构的每一层,并且可能存在大量的循环顺序排列。这将使映射空间更大。

更现实的设计的另一个特征是映射约束的数量和复杂性。这种限制的来源包括每个存储单元的缓冲区容量限制(按操作数类型分区或从共享池分配)以及单元之间不完整的NoC连接(包括绕过存储级别的选项)。这导致了更大的和不规则的映射空间,使得相应地更复杂的搜索。然而,这个过程与传统处理器的编译过程有一些相似之处,这将在下面讨论。

6.2 Mapper和编译器

DNN加速器良好映射的确定,可以被视为类似于通用处理器的编译,如图6.2所示[184]。在传统的计算机系统中,编译器将程序翻译成机器可读的二进制代码以便执行;在DNN的处理过程中,Mapper将所需的DNN每层计算及其形状和大小转换为硬件兼容的映射以便执行。编译器通常只对性能进行优化,而Mapper通常会对性能和能效进行优化

如第5章所述,DNN加速器支持的数据流是设计的关键属性。因此,受支持的数据流可以被认为类似于通用处理器体系结构的一个最显著的属性,因为它规定了系统中正确形成的程序的构成。类似于指令集体系结构(ISA)或内存一致性模型的角色,数据流描述了硬件实现的特征,并定义了映射器必须遵循的许多规则,以便生成硬件兼容的映射。

image.png
图6.2: (a) 通用处理器的编译过程和 (b) DNN加速器的映射过程之间的类比

在许多情况下,架构的一个关键特征是它在各代实现中保持稳定(或仅以“向上兼容”的方式演变)。以这种方式,将数据流视为类似于架构,在DNN加速器家族中,可用的数据流集合将在很大程度上保持跨实现的不变。与GPU一样,架构的某些方面的稳定性(包括支持的数据流)可能会降低DNN加速器的稳定性,因为它们的快速发展和越来越依赖编译器/映射器来掩盖设计之间的差异。

除了数据流之外,映射空间上的其他约束也包括在类似于体系结构的特征中。这些反映了诸如缓冲区大小和NoC连接等特性,mapper必须考虑这些特性,以确保生成的映射能够正确运行。事实上,缓冲区大小等属性是加速器体系结构的一部分,这与处理器的体系结构有很大的不同,因为处理器中的存储大小(如缓存大小)通常不包括在该体系结构中因此,DNN加速器缓冲区的大小更类似于处理器的寄存器文件的大小,这表现为创建合法二进制文件的不可侵犯的约束。

有关硬件实现的详细信息,包括存储访问的延迟、吞吐量和存储层次中每个层次的存储访问和NoC流量的能耗,类似于处理器的微体系结构,原因如下: (1) 它们可能在不同的实现中有很大的差异; (2) 虽然它们在性能和能效优化中起着至关重要的作用,但没有必要考虑它们的特性,因为即使忽略它们,mapper也会生成函数式的、次优的映射。

编译器或mapper的最终输入是来自硬件的行为统计信息。通过使用这些统计数据,编译器/映射器可以通过迭代优化来更好地确定最佳优化。但是,在许多情况下,这种信息是不可得的,编译器/映射器必须对它所做的选择的影响作出自己的预测。对于DNN加速器,这涉及到对设计进行建模,以为给定mapping映射适合的指标。6.4节将介绍一个如何生成此类映射的示例。

根据上述信息,编译器的输出是一个可以在处理器上运行的优化二进制程序。类似地,mapper的目标是在映射空间中搜索优化最合适指标的映射,并为体现该最佳映射的DNN加速器生成配置。通常,配置由一组值组成,这些值将加载到DNN加速器的配置寄存器中。

6.3 Mapper的结构

图6.3给出了mapper的所有输入和输出,可以想象一个mapper的抽象内部结构。该流程涉及为给定的工作负载和DNN加速器创建映射空间的表示,根据感兴趣的指标(例如,性能、能效或组合)搜索该空间以找到最佳映射,评估搜索所提出的映射的指标,并在选择所需映射之后为加速器创建配置,该配置将导致该映射的执行。

image.png
图6.3: 映射器的框图

给定DNN问题定义/shape和DNN加速器的数据流/约束(架构),映射空间构建步骤创建一个映射空间。优化搜索步骤迭代来自映射空间的映射。它通过将映射发送到性能/功耗模型来评估它们的特性,该模型还考虑了DNN加速器的问题定义/shape、数据流/约束(架构)和实现细节(微架构),并返回该映射的性能或能量统计信息。最终,优化搜索会生成一个“最佳”映射,映射到配置步骤会将其转换为配置。

6.3.1 映射空间和迭代空间

在图6.3中,映射器的两个输入——DNN问题定义/shape和数据流/约束(DNN加速器架构)——是第一步的输入,第一步被标记为映射空间构建。此步骤的职责是为给定的网络shape和体系结构创建所有可能的合法映射的枚举。图中的灰色框表示包含映射空间中所有合法映射的映射空间。

对于一些DNN加速器(例如,像第6.1节中的简单设计),可以详尽地枚举映射空间中的映射。然而,这通常是不可行的,因此映射空间的更抽象的表示可能是有用的。用于表征映射空间的一个常见抽象是使用编译器领域中常用的一个概念,称为迭代空间,其起源可以追溯到[185, 186]。对于由单个嵌套循环组成的问题定义,例如用于1D卷积的问题(参见Design 6.2),迭代空间是一个多维空间,嵌套循环体的每次执行都对应一个点。图6.4是这个简单的一维卷积的迭代空间。每个黄色椭圆表示循环体(第8行的MAC操作)对卷积的给定索引(w, s, q)的执行。迭代空间中的每个点也与问题数据空间中的点相关联。具体来说,数据空间中的每个点都与该点的计算操作数相关联。在这个例子中,数据空间是输入(i[])、滤波器权重(f[])和输出(o[])。因此,点(w, s, q) =(4, 1, 3)的数据空间操作数为i[4]、f[1]和o[3]。

image.png
图6.4: 1-D卷积的迭代空间-每个黄色椭圆表示迭代空间中的一个点,对应于空间中(w, s, q)点的计算。i[]、f[]和o[]数组的输入和输出操作数的值由这些坐标确定。例如,迭代点(w, s, q) =(4,1,3)访问i[4]、f[1]和o[3]的值。

给定迭代空间,问题的执行需要访问迭代空间中的每个点。对于卷积,运算可以按任何顺序执行(因为没有依赖关系,乘积和中的加法是交换的),可以按任何次序访问迭代空间中的点。注意,重要的是要注意,访问顺序不是由定义层计算的规范决定的,而是由所需计算的固有特性决定的。这可能会令人困惑,因为用于指定层的计算的语言(例如,像我们在这里所做的那样使用循环嵌套)可能与用于描述计算的映射版本的语言具有相同的语法,因此规范似乎定义了访问顺序。使用更通用的表示法,如张量索引表示法(见第2.3.1节),它没有定义访问顺序,可能会有所帮助。在其他情况下,tile的存在可能暗示一个是外观

然而,通过迭代空间的特定访问顺序确实对应于特定的映射,包括其数据流。例如,WS数据流的映射将通过图6.5中的迭代空间访问顺序来表征。在这种情况下,迭代空间中要访问的点的序列可以通过遵循权重平稳循环嵌套中的变量值来确定,例如设计6.3。

image.png
图6.5: WS数据流的一维卷积的迭代空间的遍历(绿色箭头)。

正如这个例子所示,很明显,第5章中描述的循环嵌套可以指定许多有用的遍历顺序。在这些循环嵌套中,迭代变量被直接(或通过非常简单的函数)用作数据张量的索引。然而,有些遍历序列并不完全遵循循环嵌套模式,这些更复杂的模式可以通过对for循环变量使用更复杂的计算来创建对数据张量的引用来创建。这种遍历的结果将是数据张量的一组更加多样化的参考模式。这种遍历顺序的好处和硬件成本在很大程度上仍然是一个悬而未决的问题。

硬件中的并行性可以在迭代空间中表示为通过迭代空间中的节点的多个同时遍历路径。第5章中介绍的parallel-for循环自然会导致这样的多个遍历。

与多次同时遍历迭代空间相关的一个有趣现象是,并行遍历的数量可能不等于硬件单元的数量(例如PEs),或者遍历的长度可能不完全相等。这些现象可能是硬件限制的结果,导致了前一章在5.7.4节描述的折叠和重复映射模式。就loop nest而言,当模型的shape参数(例如partial sum宽度Q)没有被完美地分解(即不完美分解)到每层循环限制(例如Q2、Q1和Q0)时,就会出现这种情况。在任何情况下,不完美的因子分解都可能导致硬件资源未被充分利用,从而降低性能。mapper的工作是决定何时使用不完美的因子分解(尽管利用率较低)来优化映射。

在具有memory hierarchy和互连网络层次结构的DNN加速器中,迭代空间也将具有层次结构,其中迭代空间点对应于整个层次结构中的数据移动操作和计算。该层次结构还需要结合同时遍历路径的存在来考虑,从而引入层间和层内数据传输的机会。如果这还不够复杂,那么这些不同路径的执行还有可能在时间上发生偏差。这种时间偏差可能会导致存储层次结构各级的数据引用和通信模式发生变化。对这些问题的考虑是当前研究的一个领域,不幸的是,远远超出了本书的范围。

总之,考虑到所有上述考虑,用于指定迭代空间中允许的访问顺序、考虑允许的数据流和其他约束的规则可以用于指定所有合法映射(即,映射空间)。

6.3.2 映射器搜索

创建映射空间后,映射器的职责变为图6.3中的优化搜索步骤。优化搜索步骤的目的是找到针对某些目标(例如性能、能量或能量/延迟乘积)进行优化的映射。

可以通过从map空间中选择映射,然后确定该映射满足优化目标的程度来进行搜索。该确定通常是通过性能/功耗模型来进行的。除了映射之外,这些模型还需要DNN问题定义/shape、DNN加速器的数据流/约束以及微架构实现细节,以便预测该映射的性能或能耗。

6.3.3 映射器模型和配置生成

DNN加速器的性能建模方法可以从详细的循环级仿真到简单的分析模型。此外,在DNN处理的递归应用中,该模型可以实现为神经网络,用于预测性能。

DNN加速器的功耗可以使用架构级能量估计方法(如accelererg [187])或能耗预测的解析模型(如第6.4节中描述的)进行估计。

解释结果并决定搜索模式取决于搜索算法,这超出了本文的讨论范围。但在找到“最佳”映射后,该映射会通过映射器的映射到配置步骤转换为DNN加速器的配置。

能效分析框架会在后续文章单独介绍。

作者:Damon
来源:知乎

推荐阅读

更多IC设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
20183
内容数
1307
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息