aliases:
- Lin 等 - 2024 - QServe W4A8KV4 Quantization and System Co-design for Efficient LLM Serving-zh
created_date: 2024-11-26
modified_date: 2024-11-29
Comments: 最后实现了一套以 QoQ 算法为上层,Qserve 系统为下层的加速器(太多看不懂了,扫描搁置
state: 🤔
2024-11-26
Qserve 是在 Atom 之后做的工作
不幸的是,这种预期的性能提升在当前的 GPU 平台上并未得到一致的观察。例如,最先进的 W4A4 服务系统 Atom 在 TensorRT-LLM 上运行 Llama-2-7B 模型时,在 A100GPU 上表现出 20-25% 的较低性能,与它的 W4A16 和 W8A8 对应版本相比。
另一方面,对于 W4A4 量化,为了达到合理的精度,W4A4 方法必须对权重和激活应用分组量化,同时在子通道基础上共享 FP16 缩放因子
W4A4 会造成严重的精度下降,需要用其他方式优化这个精度下降而远不能达到无损的环节:因此,减少 CUDA 内核的开销对于实现 LLM 服务的最优吞吐量至关重要。基于这一原则,我们引入了 QoQ(Quattuor-Oct̄o-Quattuor,或拉丁语中的 4-8-4) 算法,将 LLM 量化为 W4A8KV4 精度:4 位权重位激活和 4 位 KV 缓存。此外,我们还提出了 QServe,它为 W4A8KV4 量化提供了高效的系统支持。
因此 Qserve 实际上是与 Tender 类似的系统解决方案
在 QoQ 算法中,我们引入了 progressive group 和 quantization。此方法首先使用每通道 FP16 尺度将权重量化为 8 位,然后将这些 8 位中间值量化为 4 位。这种方法确保所有 GEMMs 都在 INT8 张量核心上执行。此外,我们通过 SmoothAttention 减轻了 KV4 量化带来的精度损失,将激活量化的问题从键转移到查询上,后者并未进行量化。
似乎也是为了更好利用其 cuda 并行性,涉及硬件信息
为了提高低比特量化精度,通常使用 group quantization。然而,如第 III-B 节所述,系统实现中的解量化开销可能会抵消这些精度改进.
对于 Per-group 量化,进一步通过在每个行内的每 g 列使用不同的 s 和 z 来减少参数共享的程度,其中 g 是组大小。
如图 5d 所示。我们采用两层 progressive group quantization 方法以确保所有计算都在 INT8 张量核心上进行。我们选择权重去量化而不是部分求和去量化, 因为这样可以降低寄存器压力。此外,我们应用了 4 路 register-level parallelism 来同时解码四个 INT4 权重,进一步减少了主循环的开销。
因此,主循环主要由慢速 CUDA 核心操作主导,而不是快速的张量核心操作。其次,Atom 创建了两组寄存器 (一组用于 FP32,一组用于 INT32) 来持有部分求和。由于 GPU 输出静止数据流的本性,较大的 GEMM 问题 (例如预填充阶段) 通常受限于寄存器,导致存储 partialsums 时消耗大量寄存器。每个线程块内消耗大量寄存器限制了可以同时执行的线程块数量。值得注意的是,GPU 依赖于大量在飞行的线程块之间的低成本上下文切换来隐藏延迟。因此,同时执行的线程块数量较少限制了延迟隐藏的机会,进一步加剧了主循环的开销。
最后实现了一套以 QoQ 算法为上层,Qserve 系统为下层的加速器(太多看不懂了,扫描搁置);实现了一套在软件层面的算法和系统协同。
对于
相对来说,Qserve 的主循环如下图所示:使用 2 阶段的渐进量化方法,使得所有计算在张量核心上运行。可以看到是 INT4 量化,然后张量核心上是 INT 的计算。
对于 W4A8 GEMM 计算,4 位量化权重张量
为了消除平滑注意力缩放中平滑化内核调用开销的额外内核调用开销,将缩放融合到前一个线性层的权重中是首选的。然而,现代大语言模型 (LLM) 使用旋转位置嵌入 (RoPE) 同时应用于键和查询,这需要额外的处理
如图 8 所示,受到 [2]、[4] 的启发,我们通过乘以旋转矩阵来旋转块输入激活。为了保持线性层的数学等价性,我们相应地在反向方向旋转对应的权重。旋转后,每个通道的激活是所有其他通道的线性组合,因此有效地抑制了异常通道。此外,由于旋转是一种单位变换,我们可以将旋转矩阵与之前的线性层的权重融合。我们简单地选择缩放后的汉达矩阵作为旋转矩阵。
原文没有看懂的地方挺多的,可以看到一些优化方法的影子,如逐组量化,GEMM 优化等,还有不少不知道的概念,如主循环开销的优化,计算感知和内存绑定等,本笔记也基本上是记录了一点认为当时理解了一点的东西,文件没有彻底弄明白,只能说作为软件和系统级别的观察还不够。