稀疏计算协同:FPGA驱动进步
©作者|wcychuiyuw
来源|神州问学
引言
在当今科技飞速发展的时代,端侧算力的重要性日益凸显,其中 ASIC (专用集成电路) 和 SoC 架构 (System on Chips) 成为端侧算力不可或缺的重要组成部分。它们以其独特的性能优势,在众多领域发挥着关键作用。而随着人们对隐私性、即时响应的需求增大,端侧算力的需求也水涨船高。为了应对这一挑战,模型压缩技术应运而生。模型压缩的三大技术包括量化、稀疏化计算以及知识蒸馏。
为了顺应端侧AI应用的趋势,许多芯片厂商也在将模型压缩的算法进行硬件适配,例如英伟达的 Blackwell 在硬件上适配了 FP4 的量化精度。但是稀疏计算方面,GPU的架构通常不能在模型的稀疏性和准确度上保持平衡,相比之下,FPGA (可编程逻辑阵列) 平台因其灵活性能够更好地支持非结构化稀疏、块稀疏等稀疏化模式,并通过改进内存带宽利用和编译效率来克服当前硬件的局限性。可以说,在稀疏计算的硬件适配尚未大范围普及的当下,FPGA 是稀疏计算软硬件协同的良好实验环境。
稀疏计算通过对模型中的数据进行稀疏化处理,能够有效减少计算量和存储需求。那么,这种神奇的稀疏计算究竟是如何运作的呢?它又怎样在 FPGA 这一软硬件结合的极佳实验环境中实现大模型推理应用呢?让我们一同深入探究稀疏计算的奥秘。
一、稀疏计算简介
1.从稀疏矩阵谈起
稀疏计算的概念来源于稀疏矩阵。通常来说,如果一个矩阵绝大多数的元素都为0,那么该矩阵就是稀疏矩阵。对于稀疏矩阵,我们可以只保留其非0的部分,来减少存储资源的消耗,提高运算效率。
对于一个M*N阶矩阵,通常来说它的存储复杂度是O(MN),而当其是稀疏矩阵的时候,我们便可以只记录其中的非零元素。一种可行的存储稀疏矩阵的数据结构是 (row, column, value) 的三元组,通常按照行号 row 进行排序。这样一来,存储复杂度就变为了O(n),其中n为矩阵中非0元素的个数。
利用这样的数据结构也可以进行稀疏矩阵的运算。矩阵的加法在这种数据结构下,就变成了汇总两个矩阵中的非零元素,并将处于相同位置的非零元素相加,矩阵转置就变成了交换行号和列号再重新按行号排序的过程。稀疏矩阵相乘的过程是先将第二个矩阵转置以便排序和比较,然后通过遍历两个矩阵的所有非零元素,将第一矩阵中行号为 x 的元素与转置后第二矩阵中行号为 y 的对应元素相乘并累加,从而得到结果矩阵中 (x, y) 的值。
下图展示了基于这种数据结构进行矩阵乘法的过程。
计算过程中,矩阵A和矩阵B相乘,仅上述四种组合可能得到非零元素,其余的0元素可以不计。因此乘法的结果如下。
当然,除了稀疏计算领域,稀疏化在信息压缩的领域也有着广泛的应用。在时域中稠密的信号在变换域中往往