基于模式的剪枝
非结构化和结构化剪枝方案代表了设计空间中的两个极端。在非结构化剪枝中,任何权重都可以被修剪,这其实是一种细粒度的方法。相反,在结构化修剪中,整个过滤器或通道的权重将被同时修剪,我们将其视为一种粗粒度的方法。
工程师们当然希望能够寻求一种方法可以同时拥有这两种方式的优点,即非结构化剪枝的高精度和结构化剪枝的硬件友好性。为了实现此目标,我们引入了设计空间中的一个新维度粗粒度结构中的细粒度模式,并针对这一维度设计了基于模式的剪枝方案。该方案同时具有灵活性和一定的结构规则性,并利用编译器优化作为算法级压缩和嵌入式硬件加速之间的桥梁。
方案的灵活性既符合理论和算法级别的优化需求,也能与编译器代码的生成所兼容,以保持或最大化指令级和线程级的并行性。
方案的规则性可以满足一个编译器优化的重要方面,即消除冗余负载,从而进一步提高硬件性能。基于模式的剪枝方案由内核模式剪枝和连通性剪枝两部分组成。
内核模式剪枝:对于每个卷积内核,修剪固定数量的权重,使其余权重形成特定的“模式”。如下图所示,我们在每个卷积核中只剩下白色位置的权重,即在3×3内核中的9个权重中保留4个非零权重。我们可以推广到其他内核大小和全连接层。对于每个内核,他们保留了从预定义的模式库中选择最适合模式的灵活性。
(a)在卷积内核上的内核模式剪枝;(b)通过移除卷积内核进行的连通性剪枝
从理论和算法角度来说,这种剪枝方式与人类视觉系统的连接结构更加匹配。从编译器角度来说,由于模式化剪枝具有一定的结构规则性,可以实现编译器在过滤器级别和内核级别重新排序并生成代码,将具有相同模式的内核分组用于连续执行,从而最大程度地提高指令级别的并行性。从硬件角度来说,这种“四项权重模式”非常适合嵌入式处理器中的SIMD架构,适用于CPU和GPU。
连通性剪枝:连通性剪枝是将整个内核删除。这也可以认为是切断了神经网络中某些输入通道和输出通道的连接,因此被称为连通性剪枝。我们使用连通性剪枝配合内核模式剪枝,从而进一步提高权重的剪枝率。相较于滤波器/通道剪枝,它具有更高的灵活性,从而保障了更高的模型精度。它还可以让编译器使用重新排序功能将删除的内核和关联的计算进行分组,而不会影响其他计算,从而保持计算并行度。
编译器优化
卷积核与输出通道重排:通过将具有相同长度和模式的卷积核组合在一起,就解决了模式化剪枝带来的两个挑战,即密集的控制流指令,以及线程分散和负载不均衡问题。由于卷积核模式数量相对有限,可以通过适当的卷积核内核重新排序将具有相似模式的内核进行编组,从而显著减少控制流指令并提高指令级并行度。此外,由于每个输出通道中的内核具有相似的计算工作量,如果采用不同的线程处理不同的输出通道,就可以正确解决线程分散和负载不均衡问题,从而增强线程级并行度。
压缩权重存储:这种存储格式是专门为卷积核模式和连通性剪枝设计的。和卷积核与输出通道重排结合后,这种紧凑的数据结构可以比传统的压缩稀疏行(Compressed Sparse Row,CSR)格式产生更好的压缩率。
消除负载冗余:在内核执行代码生成过程中,通过分析处理两个寄存器级负载冗余问题,解决了基于卷积核模式化剪枝对内存性能的挑战。在内存和缓存之间的数据移动通过高级数据平铺技术进行了优化的前提下,负载冗余消除具有更加重要的意义。
参数自动调整:根据测试关键性能参数的不同配置自动调整计算参数的设置。这些关键性能参数包括各种不同GPU存储器的种类、不同的数据平铺大小,以及每个处理单元上每个DNN层的循环置换策略。