极市导读
本文提出了一套全新量化算法(QoQ,即 W4A8KV4)和系统配套优化,实现了云端 LLM 推理的进一步加速和成本大幅降低。 >>加入极市CV技术交流群,走在计算机视觉的最前沿
太长不看版
大语言模型服务的最佳量化设置:W4A8KV4 量化及其完整实现方案。
量化方案:
Activation: Per-channel Symmetric INT8 量化
KV cache: Per-token Asymmetric INT4 group 量化
Weight: 渐进式组量化:先进行 Per-channel Symmetric INT8 量化,再进行 group=128 的 Asymmetric INT4 量化。
现有的 LLM 量化方法分为 3 种:W8A8:8-bit 权重,8-bit 激活,W4A16:4-bit 权重,16-bit 激活,W4A4:4-bit 权重, 4-bit 激活。前两种方法可以认为是精度几乎无损的。只有 W4A4 量化会导致精度下降,尽管这种方法被期待能提供更高的吞吐量。但是在当前 GPU 平台上,这种预期的性能提升没法实现。因此,优于 W8A8 或者 W4A16 的方案目前仍处于理论中。
本文给出了一个观察:当前的 4-bit 整数量化方法,在 GPU 上权重的反量化或者 partial sum 会很费时。比如 W4A16 量化,其权重是 INT4 格式,在 TensorCore 上以 FP16 精度计算。那么就需要在 GEMM Kernel 里进行反量化。再比如 W4A4 量化,为了精度够用,就必须对权重和激活使用 per-group 量化。比如 QuaRot[1],如果把 per-group 量化换成 per-channel 量化就会带来 0.2 的 perplexity 下降。per-group 量化需要反量化成 FP16 (因为 INT4 数值 partial sum 的结果是 INT32),这个反量化的过程在更慢的 CUDACore 上进行。基于上述分析,降低 CUDACore 的开销才是实现 LLM 服务最佳吞吐量的关键。这也是本文提出 W4A8KV4 量化的原因。
在 W4A8KV4 量化中,本文提出渐进式组量化的方法,先把权重使用 FP16 scales 量化为 INT8,再量化到 INT4。这种方法确保所有 GEMM 都在 INT8 TensorCore 上执行,速度快。本文还提出 SmoothAttention,降低 KV4 的精度损失。方法是:把量化难度从 Key 转移到 Query,而 Query 并不会做量化。
在 QServe 系统中,执行计算感知的权重重新排序并利用寄存器级并行性来减少反量化的时延。作者还利用了 KV4 量化带来的性能增益,使融合的注意力是 Memory bound 的。
QServe 在 A100 上将 Llama-3-8B 的最大可实现服务吞吐量提高了 1.2 倍,在 L40S 上提高了 1.4 倍;与 TensorRT-LLM 相比,Qwen1.5-72B 在 A100 上提高了 2.4 倍,在 L40S 上提高了 3.5 倍。值得注意的是,L40S GPU 上的 QServe 在 A100 上实现了比 TensorRT-LLM 更高的吞吐量。因此,QServe 有效地将 LLM 的美元成本降低了 3 倍。
本文目录
1 Qserve:高效 LLM 服务的 W4A8KV4 量化与系统联合设计
(来自 MIT 韩松团队,NVIDIA)
1 Qserve 论文解读
1.1 LLM 和量化的背景
1.2 为什么 LLM 服务一定要做 W4A8KV4 量化?
1.3 渐进式组量化:先量化到 8-bit 再量化到 4-bit
1.4 SmoothAttention:把量化难度从 Key 转到 Query
1.5 其他 LLM 量化优化方案
1.6 Qserve 系统 Runtime
1.7 实验设置
1.8 精度评测
1.9 效率评估
1 Qserve:高效 LLM 服务的 W4A8KV4 量化与系统联合设计
论文名称:QServe: W4A8KV4 Quantization and System Co-design for Efficient LLM Serving
论文地址:
https://arxiv.org/pdf/2405.04532
1.1 LLM 和量化的背景
大语言模型
大语言模型(LLM)是一类具有多层的 Causal Transformer 模型。每一层都结合了 Attention、FFN 和归一化层。每层的输入 是一个 张量,其中 是输入 token的数量, 表示注意力头的数量, 是每个头的隐藏维度。LLM 服务包括 2 个阶段:预填充(Prefilling)阶段,其中所有提示 token 同时呈现(每个请求 ),解码(Decoding)阶段,其中模型每次只处理 1 个 token(每个请求 )。
在 Attention Block 中, 首先进行线性投影以获得 ,其中 是 Key 或者 Value head 的数量。在标准的多头注意力(MHA)中有 。将 与 KV cache 中预先计算的 个 token 拼接起来以获得 ,并使用以下公式计算注意力:
结果 与输出投影矩阵 相乘,并将乘积添加到 中作为 FFN 的输入。 FFN 由线性投影层和激活函数构成,它则不混合 token 间的特征。
量化
整数量化将高精度数字映射到离散级别。该过程可以表述为:
其中, 是浮点数张量, 是 n -bit 量化结果, 是 scaling factor, 是 zero point。因此,反量化张量可以表示为:
以上这些称为非对称量化(Asymmetric Quantization),其中, 和 用于整数量化。式 2可以进一步简化为对称量化(Symmetric Quantization),其中 和 。
本文将 LLM 中的 位 weight, 位 activation 和 位 KV cache 量化表示为 WxAyKVz ,如果 ,则使用缩写符号 WxAy。除了位精度外,量化还可以应用于各种粒度。
Per-tensor 量化: 在整个 Tensor 之间共享 和 。
Per-token activation 量化,Per-channel weight 量化: 意味着 和 在 Tensor 的每一行之间共享。
Per-group 量化: 通过在每一行中的每 列使用不同的 和 进一步降低了参数共享的程度,其中 是组数。
1.2 为什么 LLM 服务一定要做 W4A8KV4 量化?
W4A8KV4 量化指的是对 weight,activation,KV cache 分别使用 4-bit,8-bit,4-bit 低精度数值表示。
量化 weight 和 KV cache (如 W4KV4): 可以减少 LLM 服务中的内存占用。
量化 weight 和 activation (如 W8A8): 可以提高峰值计算吞吐量。
因此,为 LLM 的部署选择正确的精度是一项艰巨的任务。现有的解决方案可以分为 3 类:W4A16 (per-group)、W8A8 (per-channel weight + per-token activation)、W4A4 (per-group)。那为什么 W4A8KV4 是一个更好的选择呢?
1) W4A8KV4 比 W8A8、W4A16 有更好的屋顶线 (Roofline)
作者通过屋顶线分析开始探索。A100 的峰值 FP16/INT8/INT4 Tensor Core 性能为 312/624/1248 TOPS,DRAM 带宽为 2 TB/s。也就意味着 A100 GPU 每秒最多执行 312T 次 FP16 乘法运算,或者 624T 次 INT8 乘法运算,或者 1248T 次 INT4 乘法运算,每秒最多搬运 2T 字节的权重数据。
先来看图 2(a),考虑一段真实世界的对话,输入 token 数 1024,输出 token 数 512,此时 Attention 和 GEMM 在 LLM 部署中占据绝大部分的运行时间。而且,decoding 阶段的运行时间大约是 prefilling 阶段的 6 倍。因此,要重点分析 decoding 阶段的 Attention 和 GEMM。
我们考虑一个 的 GEMM 运算(比如 维度是 维度是 ),其计算密度(MACs/element)约为 (在 远大于 时)。这种情况比较适合 LLM 解码阶段,因为 是 sequence 维度, 是 channel 维度。
根据图 3 中的 A100 屋顶线,当 时,W4A16 有更高的理论吞吐量,而当 时 W8A8 表现更好。当输入 Batch Size 较小时,LLM 中的 GEMM 是 Memory-bound 的, Memory Bandwidth 以权重流量为主。因此,W4A16 把权重量化为 4-bit,使得内存占用较小,性能较好。但是,当 很大时,GEMM 就变为了 Computation-bound 的。因此, W8A8 由于 INT8 Tensor Core 的吞吐量更高,速度更快。
因此,直观地讲,我们可以期待 W4A8 能够对于不同的 Batch Size,结合 W4A16 和 W8A8 二者的优势。这一点在图 3 中看得很清楚,只要我们可以使用 INT8 张量核上执行矩阵计算。
2) 为什么要 KV4?
在 LLM 解码中,无论 Batch Size 大小如何,Attention 的工作负载都可以看成一系列的 GEMV 操作。GEMV 操作的计算强度为 1 MACs/Element,因为可以视为 。根据下式 1,内存流量主要是受 KV cache 影响,因为每个序列的 。量化 KV cache 可以被视为有效地增加了 Memory Bandwidth。因此,KV4 在 KV8 上为注意力提供了 2 倍的峰值性能。而且,这种改进提供了不错的端到端加速机会,因为注意力在图 2(a)中占 batch=64的总运行时间的 以上。
3) 那为什么不做 W4A4KV4?GEMM 中的主循环开销
一个自然而然的后续问题是:**"为什么我们不选择更积极的 W4A4?"** 当 m (输入序列的数量) 超过 78 时,W4A4 开始获得更好的理论 GEMM 性能,因为 4-bit TensorCore 的性能是 8-bit TensorCore 的 2 倍。但是,除了显著的精度下降外,在现有的 GPU 架构 (Ampere 和 Hopper) 上无法实现这种理论的性能提升。如图 2(b) 所示,现有的 W4A4 服务系统 Atom[2]和 QuaRot[1]甚至比 TensorRT-LLM 的 W16A16 解决方案还要慢很多。
虽然原因也可以解释为这 2 个系统中的运行时间效率低下,但之前的文献中忽略了在 GPU 上映射 per-group 量化 W4A4 GEMM 的固有困难。最先进的系统实现的 GEMM TensorCore 的数据流如图4所示。对于 的问题,每个线程块通过顺序遍历 reduction 维度 来计算 输出块。这个顺序循环称为主循环(main loop)。主循环超过 100 次迭代,并主导了 GEMM kernel 的运行时间。
在 FP16 和 W8A8 GEMM (图 5) 中,主循环完全在 TensorCore 上执行。
TensorRT-LLM-W4A16 (图 6) 和 Atom-W4A4 (图 7) 都需要在主循环进行反量化操作,在 CUDACore 上完成。W4A16 需要 INT4 到 FP16 权重转换,而 Atom-W4A4 需要 INT32 到 FP32 部分和转换和累积。Atom 的主循环的反量化过程有两个实质性的效率瓶颈。其一,在 A100 和 H100 等现代数据中心 GPU 上,FP32 CUDACore 的峰值性能仅为其 INT4 TensorCore 的 2%。也就是说,对 Atom 的 partial sum 进行 1 次反量化操作相当于 50 次 TensorCore MACs。因此,主循环主要由缓慢的 CUDACore 操作主导,而不是快速的 TensorCore 操作。其二,Atom 创建了两组寄存器 (一个用于 FP32,一个用于 INT32) 来保存部分和。较大的 GEMM (比如 prefilling 阶段) 在 GPU 上通常是 register-bound 的,导致存储部分和的高寄存器消耗。需要注意的是,GPU 依赖大量 in-flight warps 之间的低成本上下文切换来隐藏延迟。因此,较少数量的并发执行的 warps 限制了延迟隐藏的机会,进一步加剧了主循环开销。
作在图 8 中预览 QServe 的 W4A8 per-group 量化的 GEMM Kernel 设计。采用 2 级渐进组量化方法来确保所有计算都是在 INT8 TensorCore 上执行的。此外,应用 4 路寄存器级并行来同时解码 4 个 INT4 权重,进一步减少主循环开销。
为了在不影响 LLM 性能的情况下释放 W4A8KV4 的全部潜力,本文提出了具有渐进式组量化、SmoothAttention 和各种一般量化优化的 QoQ 算法。
1.3 渐进式组量化:先量化到 8-bit 再量化到 4-bit
组量化 (Group Quantization) 常被用于提升低比特量化的精度。但是反量化的 overhead 也会一票否决组量化带来的性能提升。因此,本文针对的就是这一点,希望给出一个不太增加反量化 overhead 的组量化解决方案,即:渐进式组量化 (Progressive Group Quantization)。
给定权重 Tensor ,首先使用 per-channel symmetric INT8 量化。
其中, 是 INT8 量化后的 weight Tensor(8-bit), 是 channel-wise 的量化的 scale 参数(16-bit)。
然后,作者进一步在中间权重张量上使用 Per-group Asymmetric INT4 量化:
其中, 是 INT4 量化之后的 unsigned weight Tensor(4-bit), 是 INT4 group-wise 量化的 unsigned zero point(4-bit), 是 INT4 group-wise 量化的 unsigned scale(8-bit)。
对于 W4A8 GEMM 计算,首先将 4-bit 量化之后的 weight Tensor 根据式 5 反量化为 8-bit weight Tensor ,然后进行 INT8 矩阵乘法,就好像它是 W8A8 的 Per-channel量化一样。
a) 保护量化范围
直接应用式 4 和 5 并不能保证中间的反量化权重完全位于 8-bit 整数的表征范围内。例如,INT8 量化之后,一组 8-bit 权重位于 [−113,120] 中。4-bit 非对称量化的 scale factor 为:⌈(120− −113)/(15−0)⌋ = 16,zero point 为:⌈0− −113/16⌋ = 7。因此,值 120 会被量化为 ⌈120/16 + 7⌋ = 15,再被反量化为 (15−7)×16 = 128,超出了最大的 8-bit 整数 127。一个简单的解决方案是在反量化过程中打开算术指令中的 saturation 选项。但是,简单地应用 saturation 会严重损害计算吞吐量,将速度降低高达 67%。
作者提出保护量化范围的做法,动机是假设 INT8 到 unsigned INT4 量化的这步的:
scale: , zero point:
这步量化和反量化过程可以写成:
那如果我们希望反量化的结果 在 [−128,127] 中,则反量化之前的 INT8 量化这一步的量化结果 的范围就应该在 [−119,119] 中,避免反量化的溢出。这个过程如图 9 上方所示。
b) 与之间的量化相比
如图 9 下方所示,之前的方法直接应用目标精度的 Per-group 量化,然后对 group-wise 的浮点 scaling factors 进行 Per-channel 量化。因此,反量化的中间结果可能超过 INT8 的表示范围,需要进一步反量化到浮点值去计算。
1.4 SmoothAttention:把量化难度从 Key 转到 Query
作者在图 10 中可视化了采样 Key 和 Value cache 的 activation 幅值的分布。观察到:Value 矩阵没有显著的异常值,而 Key 矩阵往往在每个 head 具有固定的异常值通道。 这些异常值比大多数激活值大约 10 倍。虽然它们可以很容易地被先前的工作 SmoothQuant[3]中的 KV8 量化来处理,但对于 KV4 量化而言依然是具有挑战性。
受 SmoothQuant[3]的启发,本文提出了 SmoothAttention,通过 Per-channel 的 factor 缩小了 Key cache 中的异常通道:
SmoothQuant 将量化难度从 activation 迁移到 weight,因此需要通过搜索迁移强度在激活和权重量化之间进行专门的平衡。相比之下,由于不量化 Query,因此只需要专注于 Key,简单地选择 SmoothAttention scale factor 为:
在实践中, 已经足够好。如图 10 所示,SmoothAttention 之后,Key cache 中的异常值被大大平滑。
为了消除 SmoothAttention 缩放的额外 Kernel 调用开销,首选将 scale 融合到前面线性层的权重中。然而,现代 LLM 将旋转位置嵌入(RoPE)应用于 Keys 和 Query,就需要额外的处理。实践中,RoPE 对通道 与每个头部内的通道 配对。因此,为了使 SmoothAttention 适配 RoPE,作者添加了一个硬约束 :
之后,可以轻松地将 scale 融合到前层的权重中:
1.5 其他 LLM 量化优化方案
a) 对输入作 Rotation
在 Transformer Block 中,定义 input module 为每个 Block 的输入所参与的那个组件,比如 QKV 的投影层或者 FFN 的第 1 层。受 QuaRot 等的启发,如图11所示,作者给 Block 的 input activation 乘以一个 Rotation 矩阵。旋转之后,每个 channel 的激活值就变成了所有其他通道的线性组合,从而有效地抑制了 outlier channel。
为了保持线性层的数学等价性,为相应的权重相应地乘以相反方向的旋转矩阵。由于旋转是酉变换,可以将旋转矩阵与之前的线性层的权重融合。简单地选择缩放的 Hadamard 矩阵作为旋转矩阵。
b) 对输出作 Smoothing
定义 output module 为每个 Block 生成输出的那个组件,比如 Output 的投影层或者 FFN 的第 2 层。受 SmoothQuant[3]的启发,作者对 Block 的中间激活乘以一个逐通道的平滑因子来达到 smoothing 的效果。原始的 SmoothQuant 不会平滑 Block 的中间激活。而且,如果直接使用与 input module (比如,q_proj、up_proj) 具有相同的迁移强度,则 Llama-2-7B 模型的评估的 Wikitext-2 困惑度将下降多达 0.05。在实践中,作者发现迁移强度 \alpha 应该接近 0。也就是说,平滑因子 \lambda 主要由权重决定,而不是激活决定,这与 SmoothQuant 的观察结果非常不同。
c) Activation-Aware 通道重新排序
Atom[2]和 AWQ[4]都观察到将一些重要的权重 (salient weights) 维持在 FP16 可以提升模型精度。这些 salient weights 可以通过 activation 的分布来识别。作者使用激活感知通道重新排序。使用 \max\left(|\mathbf{X}|\right) 来确定权重 channel 的显著性,然后重新排序通道,使具有相似显著性的通道在同一个量化组中。
比如图 13 中,对上方权重进行重新排序了,依据是下方激活值。激活值 9.2 的那个 weight channel 排第 1,对应的 weight (0.6 ... 0.5) 放在最左侧第 1 列。激活值 5.0 的那个 weight channel 排第 2,对应的 weight (-0.5 ... -0.6) 放在最左侧第 2 列。
d) 权重裁剪
权重裁剪(Weight Clipping)是一种流行的量化优化技术。它将 Clipping ratio 应用于式 2的动态范围,让 和 。之前的 QuaRot , Atom ,AWQ ,GPTQ 等方法通过 grid search 搜索 ,以最小化量化误差 或者输出均方误差 。
在 QServe 里,最小化所有线性层的层输出误差:
1.6 Qserve 系统 Runtime
以上是 QoQ 量化算法,旨在最小化 W4A8KV4 量化引起的精度损失。然而,实现图 3 中的理论吞吐量优势仍然很有挑战性。因此,下面介绍 QServe 的系统设计,它由两个重要原则指导:1) 减少 GEMM kernel 的主要循环开销。2) 使融合的 Attention Kernel Memory bound。
QServe runtime 如图 14 所示,QServe 中的所有 GEMM 都在 W4A8 上运行,在 INT8 TensorCore 上执行计算并生成 FP16 输出。所有注意力层在 CUDACore 上执行 FP16 的计算。因此,QServe 中的每个 LLM 块都有 FP16 输入和 FP16 输出。
激活值量化
为了确保每个 GEMM 都接受 INT8 激活,作者将激活量化融合到 QKV 投影和第一个 FFN 层的前一层 LN 中,或者第 2 层 FFN 的 activation kernel。然后,在 Attention 的 Output 投影之外加入一个单独的量化节点。
KV 缓存管理
为了避免内存碎片,作者遵循 vLLM[6]和 TensorRT-LLM[7]采用 paged KV caches。与在 KV cache 上执行 Per-tensor 静态量化 (离线计算的比例因子) 的这两个框架相比,QServe 需要每头动态 KV 量化来保持由于较低的位精度。因此,在每个 KV cache 页面中紧跟量化 KV 特征之后存储每个 head 的 FP16 scale factor 和 zero point,从而允许这些值的即时更新。Qserve 也支持 in-flight batching,类似于 vLLM 和 TensorRT-LLM。
Qserve 中的 W4A8 GEMM
主循环开销使得量化 GEMM 很难实际实现图 3 Roofline 画的理论性能提升。因此,QServe W4A8 GEMM 的重点是减少主循环开销。Qserve 通过计算感知权重重新排序 (compute-aware weight reorder) 来解决指针算术运算的成本,并通过 subtraction after multiplication 寄存器级并行 (register-level parallelism),来减少反量化开销。这里涉及到一些硬件相关的知识,建议读者参考原始论文。
1.7 实验设置
a) 算法
QoQ 量化算法是在 PyTorch 上使用 HuggingFace 实现的。
-
Activation: per-channel symmetric INT8 量化 -
KV cache: per-token asymmetric INT4 group 量化 -
Weight:"W4A8KV4 g128" 指的是 QServe 在权重上使用渐进式组量化:先进行 per-channel symmetric INT8 量化,再进行 group=128 的 asymmetric INT4 量化。"W4A8KV4" 是 weight 使用 per-channel 量化的对应版本。
b) 系统
QServe 服务系统是使用 CUDA 和 PTX 组装实现的,用于高性能 GPU Kernel。作者还提供了一个纯粹基于 PyTorch 的前端框架,以实现更好的灵活性。对于吞吐量基准测试,除非另有说明,否则在 PyTorch 2.2.0 下使用 CUDA 12.2 执行所有实验。报告的吞吐量数字是 NVIDIA GPU 上的真实测量。对于基线系统,作者使用来自 QuaRot 和 Atom 的 TensorRT-LLM v0.9.0 和最新主要 branch。除 QuaRot 之外的所有系统都启用了 Paged attention,它们不提供相应的支持。
1.8 精度评测
a) Benchmarks
作者在 Llama-1、Llama-2、Llama-3 家族、Mistral-7B、Mixstral8x7B 和 Yi-34B 模型上评估了 QoQ。作者评估了语言建模和 Zero-Shot 任务的性能。具体来说,在 WikiText2 上评估了困惑度,并在 PIQA (PQ)、ARC、HellaSwag (HS) 和 WinoGrande (WG) 上使用 lm_eval 进行评估。
b) Baselines
作者将 QoQ 与广泛使用的PTQ LLM 量化技术 SmoothQuant、GPTQ、AWQ 和最近发布的最先进的 4-bit 权重激活量化框架 Atom 和 QuaRot 对比。对于 SmoothQuant,按照 TensorRT-LLM 中的设置对 KV cache 使用 static per-tensor symmetric 8-bit 量化。对于 GPTQ,使用他们最新的版本和 "重新排序" 技巧,表示为 "GPTQ-R"。对于 QuaRot 和 Atom,主要使用 Pile 验证数据集作为校准数据集进行评估。对于 "W4A8KV4g128" 设置,QuaRot 和 Atom 不支持渐进式组量化,因此使用普通组权重量化 (即每组都有一个 FP16 比例因子) 对它们进行评估。不支持的模型和量化设置报告为 NaN。
c) WikiText2 perplexity
图 15 比较了 QoQ 和其他 Baseline 之间的 Wikitext2 困惑结果。对于 Llama-2-7B,与 W8A8 SmoothQuant 和 W4A16AWQ 相比,QoQ 仅将困惑度提高高达 0.16 QoQ 始终优于 W4A4 或 W4A8KV4 量化精度的原子。与 W4A4 Quarot 相比,QoQ 也表现出高达 0.49 的 perplexity 改进。
d) Zero-Shot 精度
作者在图 16 中报告了 5 个常识任务的 Zero-Shot 精度。 QoQ 明显优于其他 4 位量化方法。尤其是在 Winogrande 任务中,与 Quarot 相比,QoQ 精度高了 4.82%。与 FP16 相比,QoQ 在 7B、13B 和 70B 大小的 Llama-2 模型中仅引入 1.03%、0.89% 和 0.40% 的精度损失。
1.9 效率评估
作者将 QServe 与 TensorRTLLM (FP16、W8A8 和 W4A16)、Atom (W4A4) 和 QuaRot (W4A4) 进行比较来评估 QServe 在 A100-80G-SXM4 和 L40S-48G GPU 上的效率。使用 1024 的输入序列长度和 512 的输出序列长度。注意 Atom 只支持 Llama-2-7B,QuaRot 不支持 GQA。因此,在测量基线系统的性能时跳过这些不支持的模型。
作者在图 17 中展示了相对性能比较,图 18 中展示了绝对吞吐量值。对 A100 使用 per-channel 量化,对 L40S 使用 per-group 量化。这是因为 L40S 具有更强的反量化 CUDA Kernel。相对于 TensorRT-LLM 的最佳性能配置,QServe 在 A100 上取得了显著改进:Llama-1-30B 的吞吐量提高了 2 倍,Llama-2 模型的吞吐量提高了 1.2-1.4 倍,Mistral 和 Yi 的吞吐量提高了 1.2 倍,Qwen-1.5 的吞吐量提高了 2.4 倍。在 L40S GPU 上的性能改进特别显著,作者观察到在所有评估的7个模型中,吞吐量提高的范围 1.47 倍到 3.47 倍。值得注意的是,尽管与 A100 相比,L40S 的内存容量要小得多,QServe 在 A100 上有效保持了与 TensorRT-LLM 相同的 batch size 大小。这一成就归功于对权重和 KV cache 应用了激进的 4-bit 量化。通过图 18,可以清楚地观察到,使用 QServe 在 L40S 上对 34B 以下 7 个模型中的 5 个提供服务比使用 TensorRT-LLM 在 A100 上实现了更高的吞吐量。Qserve 在 A100 上比 Atom 和 QuaRot 的性能提升更为突出,因为这些系统没有优于 TensorRT-LLM。在 L40S 上,QServe 在运行 Llama-2-7B 时仍然实现了比 Atom 更高的 10% 的吞吐量,尽管使用了更高的量化精度。此外,QServe 实现的精度比 Atom 好得多,如图 16 所示。
参考
1.Quarot: Outlier-free 4-bit inference in rotated llms
2.Atom: Low-bit Quantization for Efficient and Accurate LLM Serving
3.SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models
4.Awq: Activation-aware weight quantization for llm compression and acceleration
5.GPTQ: Accurate post-training compression for generative pretrained transformers
6.Efficient Memory Management for Large Language Model Serving with PagedAttention
7.TensorRT-LLM: A TensorRT Toolbox for Optimized Large Language Model Inference
公众号后台回复“极市直播”获取100+期极市技术直播回放+PPT
极市干货
# 极市平台签约作者#
科技猛兽
知乎:科技猛兽
清华大学自动化系19级硕士
研究领域:AI边缘计算 (Efficient AI with Tiny Resource):专注模型压缩,搜索,量化,加速,加法网络,以及它们与其他任务的结合,更好地服务于端侧设备。
作品精选


