Phantom:用于稀疏CNN的高性能计算核心
1 现有稀疏CNN计算核心的问题与挑战
在稀疏卷积神经网络(Sparse CNNs)的计算中,现有的一些方法存在诸多不足。例如,部分方法虽在计算时丢弃零值,但仍会对其进行检索和存储。像Tensaurus通过引入压缩交错稀疏切片(CISS)数据流来加速密集和稀疏张量分解,不过它仅能支持单边稀疏性。
一些近期的稀疏通用矩阵乘法(SpGEMM)加速器,目标是进行通用的稀疏矩阵 - 稀疏矩阵乘法,但各自存在不同问题:
- Extensor和Sigma采用输出固定(内积)数据流进行稀疏矩阵乘法,然而在处理高度稀疏矩阵时效率低下,因为即使有效计算(非零×非零)较少,仍需遍历行和列的每个元素,导致大量计算资源浪费。
- SpArch和OuterSPACE使用输入固定(或外积)数据流以避免内积数据流的低效问题,但外积数据流的输出重用性较差,部分输出数量多于最终输出,会造成显著的内存流量问题。
- MatRaptor引入通道循环稀疏行(C2SR)数据流以提高重用性和内存效率,它是CSR格式的改进版本,但输出矩阵需要复杂的编码。
- SCNN、SparTen和Eyeriss v2能利用双边稀疏性,但存在效率低下的微架构、不支持全连接(FC)层和非单位步长卷积、PE设计复杂以纳入压缩稀疏列(CSC)压缩格式或系统负载不平衡等问题。
Phantom核心则能解决上述所有问题,同时提供更高的性能和能源效率。
2 Phantom核心的主要贡献
Phantom核心有两大主要贡献:
- 同时考虑激活和权重的稀疏性,并对未来计算进行前瞻性分析,仅确定有效的乘法累加(MAC)操作(非零权重×非零激活)。
- 由于处理单元(PE)采用多线程设计,数据调度会根据输入和权重矩阵的稀疏性以非线性方式动态处理,确保仅将有效计算映射到多线程PE上,避免计算周期的浪费。这与那些以恒定方式将数据调度到PE并在读取零值时停止计算的设计不同,后者会浪费计算周期。
以一个3×3卷积为例,一个3×8的输入与一个3×3的滤波器进行卷积,产生一个1×6的输出。从这个例子可以看出,平均有55%的计算涉及与零值的乘法,导致计算周期浪费,有效吞吐量显著下降。Phantom核心通过前瞻掩码技术,跳过涉及零值的无效计算,从而最大化有效吞吐量。
3 稀疏掩码表示
与近期使用压缩稀疏行(CSR)或CSC格式表示非零数据的方法不同,Phantom使用一种称为稀疏掩码的二进制掩码来表示权重和激活数据。稀疏掩码提供了一种高效且简单的数据表示方式,无需显式存储零值就能识别零值和非零值数据,也不需要存储CSC(和CSR)格式所需的计数和数据指针。
对于特定矩阵,以列主序格式存储两个数组:
- 数据数组:包含非零数据。
- 二进制数组:包含稀疏掩码。其中,稀疏掩码数组中的1表示存储的非零值的位置,0表示未存储的零值数据。
为处理特定类型的卷积,稀疏掩码和数据数组会被分割成块并调度到核心。为便于理解,下面以3×3单位步长卷积为例,解释Phantom核心的工作原理。
| 矩阵类型 | 存储内容 |
|---|---|
| 权重矩阵(W) | 非零权重数据及对应的稀疏掩码(SPMW) |
| 输入矩阵(IA) | 非零激活数据及对应的稀疏掩码(SPMIA) |
4 Phantom核心架构
Phantom核心接受稀疏掩码格式的数据,由五个主要模块组成,其架构如图所示:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(SPM和数据输入) --> B(前瞻掩码LAM):::process
B --> C(自上而下选择器TDS):::process
C --> D(线程映射TM):::process
D --> E(计算引擎CE):::process
E --> F(输出缓冲区OB):::process
F --> G(SPM和数据输出)
- 前瞻掩码(LAM)和自上而下选择器(TDS)模块利用稀疏掩码提取有效计算和线程选择的信息。
- 线程映射器(TM)根据前两个模块的信息,将输入和权重数据高效地映射到计算引擎(CE)中乘法器线程的数据寄存器上。
- 计算引擎(CE)由多线程PE数组和一级(L1)可配置加法器组成。
- 输出缓冲区(OB)模块由一组先进先出(FIFO)缓冲区和二级(L2)累加器组成,用于生成最终输出。
5 前瞻掩码操作
在卷积操作中,两个向量的点积是基本计算单元。考虑双边稀疏性,稀疏向量 - 向量点积有四种可能的乘法结果:
- 零权重×零激活
- 零权重×非零激活
- 非零权重×零激活
- 非零权重×非零激活
只有非零权重数据与非零激活数据相乘才是有效的乘法。前瞻掩码(LAM)模块会对未来n个卷积块进行前瞻分析,以确定有效乘法的位置,n被称为前瞻因子(Lf)。
LAM模块通过对权重矩阵和输入块的稀疏掩码进行按位与操作来生成输出掩码。例如,在一个测试示例中,设置n为3,需要两个周期来完成六个按位与操作以生成六个输出掩码。n个按位与门在每个周期边缘产生输出(LAM1、LAM2、LAM3),经过两个周期可以遍历整个3×8的激活矩阵。按位与门输出中的1表示有效的向量 - 向量点积的位置,0表示结果为零的乘积。通过使用一系列n个按位与门,可以准确确定n个卷积块中有效计算的位置。
6 自上而下选择器
自上而下选择器(TDS)在每个周期边缘接收LAM输出,并选择LAM输出的一个子序列,以最大化计算引擎(CE)中PE内乘法器线程的利用率。这里共有p个并行选择器,p等于CE中PE的总数,在本设计中p = 3。TDS模块开发了两种选择算法:
6.1 顺序选择
顺序选择中,三个选择器并行处理三个以逗号分隔的列。选择过程按顺序从上到下对整个列进行迭代。以第一列为例,第一个选择器遍历当前迭代中的前n个元素(n等于前瞻因子,这里为3),如011(黑色)、011(深灰色)和010(浅灰色)。第一个011(黑色)被赋予最高优先级并被选中,选择器会统计该条目中1的数量并存储结果,然后处理下一个条目。如果当前条目和前一个条目1的数量之和大于n,则当前和下一个条目在当前迭代中不被考虑,而是用零替换。在这个例子中,011(黑色) + 011(深灰色) = 4 > 3,所以只有第一个011(黑色)被选中,其余两个条目在第一次迭代中被替换为零。每个选中输出中的1对应一个有效的乘法。由于单个PE中有三个乘法器线程,如果选中的值总共包含三个1,则该PE内的所有线程都被利用,利用率达到100%。如果条目的出现顺序与选择优先级不一致,利用率会降低。选择器总共需要四次迭代(周期)来选择第一列中的所有值,第二和第三列需要三个周期进行选择,但需要等待第一列选择完成额外的一个周期,这可能导致计算空闲和PE乘法器利用率不足。
6.2 乱序选择
顺序选择高度依赖输入的出现顺序,可能导致PE中乘法器线程利用率不足。乱序选择方法在选择第一个条目(如011黑色)后,会考虑迭代中的所有后续条目进行选择。例如,在第一次迭代中,选择011(黑色)后,下一个值011(深灰色)因011(黑色) + 011(深灰色) = 4 > n而不被考虑,但后续值010(浅灰色)因011(黑色) + 010(浅灰色) ≤ n而被考虑。这种小而有效的改变大大提高了线程利用率和吞吐量。乱序选择器的硬件开销约为顺序选择器的1.03倍,但可将硬件利用率提高多达60%。因此,Phantom采用TDS的乱序选择变体以实现更高的线程利用率和高效映射。
乱序选择的实现涉及一个具有独立读写端口的小块内存,每个周期接收LAM输出。高优先级(P1)和低优先级(P2)用于控制选择,内存的读地址(rd_addr)在每次选择值时递增,选中的值的标签位设置为1,标签位用于输出缓冲时的累加操作。下一次输入时选择优先级会反转,以确保上一次迭代中错过的值在当前迭代中获得最高优先级。最终输出为map11、map12和map13。
7 线程映射器
线程映射器(TM)接收TDS的输出(map1x、map2x和map3x),并利用这些信息将长度均衡的稀疏数据(权重和激活)映射到多线程PE的内部寄存器中。长度均衡是通过使用稀疏掩码在特定位置添加适当的零来实现的。
在本设计中,对于三个PE,虽然有2⁹ = 512种组合,但映射器只需存储那些1的总数不超过每个PE乘法器数量(这里为3)的组合,这将需要存储的组合总数大幅减少(从512种减少到(⁹₀)+(⁹₁)+(⁹₂)+(⁹₃) = 130种,内存占用减少74%)。每个PE有一个50位的内部寄存器,其中48位是数据位,2位是L1加法器控制位。前48位分为一组16位(激活和权重各8位)。存储所有三个映射器的总内存需求约为2.5 kB。
通过观察发现,映射器2和3与映射器1以类似方式映射数据,只是权重和数据的位置位不同。因此,移除映射器2和3,仅顺序使用映射器1三次,并在之后调整位置位。这样虽然会引入两个周期的初始延迟,但内存占用可减少约66%(从2.5 kB降至0.83 kB),同时在PE中添加适当的延迟寄存器以补偿初始延迟。
8 计算引擎
Phantom核心使用多线程计算引擎(CE)块。在本设计中,CE块由三个多线程PE组成,每个PE包含三个乘法器线程。映射器将数据映射到各个线程,线程进行独立计算。PE内线程的输出会提供给L1加法器,L1加法器的配置由映射器的最后2位控制,有以下四种配置情况:
| 配置位 | 操作 |
| ---- | ---- |
| 00 | PE内乘法器线程的各个输出不进行相加,直接传递 |
| 01 | 前两个乘法器线程(th0,x、th1,x)的输出相加,第三个线程(th2,x)的输出直接传递 |
| 10 | th1,x和th2,x的输出相加,th0,x的输出直接传递 |
| 11 | 所有乘法器线程的输出相加 |
从周期调度示例可以看出,即使输出的稀疏度为55%(从图中左侧计算零的数量,30/54),所有乘法器线程仍能得到有效利用。在第一和第二个周期,硬件利用率达到100%。
9 输出缓冲区
输出缓冲区(OB)模块在 Phantom 核心中起着生成最终输出的关键作用。它由一组 FIFO 缓冲区和二级(L2)累加器构成。
当计算引擎(CE)中的多线程 PE 完成计算后,中间结果会被发送到输出缓冲区。FIFO 缓冲区用于临时存储这些中间结果,按照先进先出的原则进行数据管理,确保数据的顺序性。
L2 累加器则对 FIFO 缓冲区中的中间结果进行累加操作。在累加过程中,利用之前在自上而下选择器(TDS)的乱序选择实现中设置的标签位,对需要累加的数据进行准确识别和处理。通过这种方式,将各个线程的计算结果进行整合,最终生成卷积操作的最终输出。
10 Phantom 核心的优势总结
Phantom 核心通过一系列创新设计,有效解决了现有稀疏 CNN 计算核心存在的问题,展现出显著的优势:
-
高效处理稀疏性
:同时考虑激活和权重的稀疏性,利用前瞻掩码技术准确识别有效计算,避免了大量无效的零值计算,大大提高了计算效率。以 3×3 卷积为例,能有效减少因零值乘法导致的计算周期浪费,提高有效吞吐量。
-
灵活的数据调度
:采用多线程设计和动态的非线性数据调度方式,根据输入和权重矩阵的稀疏性进行数据调度,确保只有有效计算被映射到多线程 PE 上,充分利用计算资源,避免了传统设计中因恒定数据调度和零值计算导致的资源浪费。
-
简单高效的数据表示
:使用稀疏掩码进行数据表示,无需显式存储零值,也不需要复杂的计数和数据指针,简化了数据存储和处理过程,提高了数据处理效率。
-
优化的硬件设计
:通过自上而下选择器的乱序选择算法,提高了乘法器线程的利用率和吞吐量;线程映射器对内存占用的优化,减少了硬件资源的需求;计算引擎中灵活的 L1 加法器配置,能够根据不同情况进行高效计算。
11 应用场景与展望
Phantom 核心在稀疏卷积神经网络领域具有广泛的应用场景。随着深度学习的发展,稀疏 CNN 在图像识别、自然语言处理等领域得到了越来越多的应用。Phantom 核心的高性能和能源效率使其非常适合这些对计算资源要求较高的应用场景。
在图像识别中,稀疏 CNN 可以通过减少冗余计算,提高识别速度和准确率。Phantom 核心能够进一步优化计算过程,加速图像识别任务的处理。
在自然语言处理方面,对于大规模文本数据的处理,稀疏 CNN 可以有效降低计算复杂度。Phantom 核心的高效计算能力可以帮助提高自然语言处理模型的训练和推理速度。
未来,随着技术的不断进步,Phantom 核心有望在更多领域得到应用。例如,在边缘计算场景中,对设备的计算能力和能源效率提出了更高的要求,Phantom 核心的优势将更加凸显。同时,也可以进一步研究和优化 Phantom 核心的架构,以适应不断变化的应用需求和硬件环境。
12 总结
本文详细介绍了 Phantom 核心的架构和工作原理。从现有稀疏 CNN 计算核心存在的问题出发,阐述了 Phantom 核心的主要贡献,包括同时考虑双边稀疏性、动态数据调度等。通过对稀疏掩码表示、核心架构的各个模块(前瞻掩码、自上而下选择器、线程映射器、计算引擎和输出缓冲区)的详细分析,展示了 Phantom 核心如何高效处理稀疏卷积计算。
Phantom 核心通过一系列创新设计,有效提高了计算效率和硬件利用率,减少了计算资源的浪费,为稀疏卷积神经网络的发展提供了一种高性能的计算解决方案。在未来的深度学习应用中,Phantom 核心有望发挥重要作用,推动相关领域的技术进步。
| 核心模块 | 主要功能 | 优势 |
|---|---|---|
| 前瞻掩码(LAM) | 确定有效计算位置 | 准确识别有效计算,避免零值计算浪费 |
| 自上而下选择器(TDS) | 选择最大化线程利用率的 LAM 输出子序列 | 提高乘法器线程利用率和吞吐量 |
| 线程映射器(TM) | 将稀疏数据映射到多线程 PE 的内部寄存器 | 优化内存占用,减少硬件资源需求 |
| 计算引擎(CE) | 进行卷积计算 | 灵活配置 L1 加法器,高效利用线程资源 |
| 输出缓冲区(OB) | 生成最终输出 | 整合中间结果,确保输出准确性 |
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(输入数据) --> B(Phantom核心):::process
B --> C(输出结果)
B --> D(前瞻掩码LAM):::process
B --> E(自上而下选择器TDS):::process
B --> F(线程映射器TM):::process
B --> G(计算引擎CE):::process
B --> H(输出缓冲区OB):::process
D --> E
E --> F
F --> G
G --> H
以上流程图展示了 Phantom 核心从输入数据到输出结果的整体处理流程,各个模块之间相互协作,共同完成稀疏卷积计算任务。通过这种模块化的设计,Phantom 核心能够高效、准确地处理稀疏数据,为深度学习应用提供强大的计算支持。
超级会员免费看
3003

被折叠的 条评论
为什么被折叠?



