用活跃权重替代完整矩阵:在 CPU 上对脉冲模型进行 INT8 解码

27 九月 202624 视图

文章介绍了一种采用二元脉冲门控的语言模型 C++ 实现:稀疏投影以 INT8 处理,计算仅针对激活权重进行。在单线程测试中,早期 INT8 版本达到 23.31 个 token/秒,而 FP32 为 9.82 个 token/秒,并将权重内存占用从 3355.2 MiB 降至 1087.4 MiB;将稠密投影改为 INT4 则降低了解码吞吐量。

用活跃权重替代完整矩阵:在 CPU 上对脉冲模型进行 INT8 解码

脉冲如何改变权重处理方式

在文章 «Spike-Aware INT8 Execution for Spiking Language Models on Commodity CPUs» 中,Ting Liu 描述了如何在 CPU 上解码脉冲语言模型。

  • 二值脉冲激活使得只需读取活跃的权重列。
  • 乘法被替换为权重求和。

这种方法的实际意义在于,不处理未激活的列。收益取决于激活的稀疏程度,而不仅仅是权重格式。

INT8 路径的工作方式

研究人员在一个拥有 874M 参数的脉冲门控语言模型上测试了 C++ 实现。该实现针对稀疏投影和密集投影使用不同模式。

  • 稀疏投影以列主序格式存储 INT8 权重。
  • 累加以整数形式执行,每个输出通道只应用一次缩放。
  • 密集投影保留行主序访问方式和 FP32 激活。

这是一种混合方案,而不是将模型的所有操作都转换为 INT8。选择标准是:是否愿意在密集投影中保留 FP32,以换取稀疏 INT8 路径。

报告了哪些速度和存储指标

研究人员在单线程条件下比较了早期检查点。在这项测试中,INT8 的解码吞吐量更高,权重存储量更小。

早期检查点,单线程解码速度权重存储量
FP329.82 tokens/s3355.2 MiB
INT823.31 tokens/s1087.4 MiB

最终检查点另有一组在 AMD Ryzen 7 5800X 上的结果,其测试条件与早期检查点的对比不同。

最终检查点 INT8 模式指标
解码,单线程22.63 tokens/s
解码,四线程47.90 tokens/s
512 个 token 序列的预填充,八线程94.68 tokens/s

这些指标不能直接汇总到同一张对比表中,因为它们对应不同的检查点和运行模式。评估吞吐量时,检查点版本和线程数都很重要。

INT4 方案带来了哪些变化

密集投影采用 INT4 后,存储量进一步减少了 17.4%。但解码吞吐量也随之下降了 46.6%。

论文的修订版撤回了无效的纯 INT4 结果。因此,所报告的这一权衡适用于密集投影中的 INT4,而非完全采用 INT4 的模型。

选择标准是优先考虑存储量,而非解码速度。不能将纯 INT4 的结果用作性能证明。

已知的能耗情况

一项针对 ARM 上输出头的独立研究记录了两种候选项检查配置在截断解码窗口内的能耗指标均较高。

论文的修订版还补充了数值验证,以及基于 ARM 墙上功耗的能耗研究。仅凭 CPU 速度测试数据,不足以得出节能结论。

常问问题

用活跃权重替代完整矩阵:在 CPU 上对脉冲模型进行 INT8 解码