@ickma2311: 高效AI讲座13:LLM部署技术 该讲座帮助我很好地理解了AWQ、vLLM和FlashAttention…

X AI KOLs Timeline 新闻

摘要

一场关于LLM部署技术的讲座,涵盖AWQ、vLLM、FlashAttention、量化和激活平滑,以实现高效服务。

高效AI讲座13:LLM部署技术 该讲座帮助我很好地理解了AWQ、vLLM和FlashAttention。它们都基于相同的系统思路:高效的LLM服务 = 在保持质量的同时减少内存移动。 - AWQ:激活感知的INT4权重量化 - vLLM:用于KV缓存内存管理的PagedAttention - FlashAttention:分块 + 融合以避免HBM流量 LLM部署不仅仅是更少的FLOPs。它涉及内存层次结构、内核和调度。 我的笔记:https://ickma2311.github.io/ML/HW-SW-codesign/efficient-ai-lecture-13-llm-deployment-techniques.html…
查看原文 导出为 Word 导出为 PDF
查看缓存全文

缓存时间: 2026/05/14 06:31

高效AI讲座第13讲:LLM部署技术 这场讲座让我很好地理解了AWQ、vLLM和FlashAttention。它们都围绕同一个系统思想:高效的LLM服务 = 减少内存移动同时保持质量。 - AWQ:针对激活的INT4权重量化 - vLLM:用于KV缓存内存管理的PagedAttention - FlashAttention:通过分块与融合避免HBM流量 LLM部署不仅仅是更少的FLOPs,它关乎内存层级、内核和调度。 我的笔记:https://ickma2311.github.io/ML/HW-SW-codesign/efficient-ai-lecture-13-llm-deployment-techniques.html…


LLM部署技术 – ∇ ickma.dev

来源:https://ickma2311.github.io/ML/HW-SW-codesign/efficient-ai-lecture-13-llm-deployment-techniques.html 本讲座讨论部署大语言模型的系统方面。

核心思想是:

LLM部署的瓶颈主要不在于算术运算本身,而在于内存移动、量化误差、KV缓存管理和请求调度。

对于训练,难点在于如何分布一个大型模型。对于部署,难点在于如何在保持模型质量的前提下,以低延迟和高吞吐量服务大量请求。

量化

量化降低数值位宽,使推理能使用更少的内存带宽、更少的存储和更便宜的算术运算。

对于LLM,权重通常比激活更容易量化。激活更难量化,因为少数通道可能包含非常大的异常值。一个有用的观察是,这些异常值往往出现在固定的通道中。

这使得我们可以重新平衡量化问题:

  • 缩小困难激活通道的幅度
  • 放大对应权重通道的幅度
  • 保持相同的矩阵乘法结果

激活平滑

假设一个线性层计算:

\[ Y = XW. \]

如果一个激活通道的幅度远大于其他通道,激活量化就需要一个很大的比例因子,大多数值会损失精度。

激活平滑引入一个正的对每个通道的缩放向量\(s\):

\[ \hat{X}=X\operatorname{diag}(s)^{-1}, \qquad \hat{W}=\operatorname{diag}(s)W. \]

那么:

\[ \hat{X}\hat{W} = X\operatorname{diag}(s)^{-1}\operatorname{diag}(s)W = XW. \]

因此计算不变,但量化的难度从激活转移到了权重。

一种常见的平滑选择是:

\[ s=\sqrt{\frac{\max |X|}{\max |W|}}, \]

其中最大值是从校准数据中按通道计算的。

离线校准

在校准过程中,我们使用代表性数据运行模型,并测量每个通道的激活范围。

目标不是训练新参数。目标是估计哪些激活通道难以量化,并选择平衡激活和权重范围的平滑缩放因子。

离线平滑

在平滑过程中,缩放因子被折叠到静态模型参数中。

例如,前一个归一化层可以被调整以输出平滑后的激活,而当前线性层的权重通道被反向缩放。

重要的部署特性是这种转换可以在离线时折叠。在运行时,模型不需要额外的显式缩放操作。

推理

平滑后,激活受异常值影响较小,更容易量化。模型可以以更少的质量损失使用高效的低位或INT8操作。

这是SmoothQuant风格部署的核心思想:

  • 激活难以量化
  • 权重可以吸收部分缩放
  • 等价的变换使得运行时量化更容易

仅权重量化

LLM解码通常是内存受限的。在自回归解码过程中,系统在生成一个token的同时反复从内存中流式读取模型权重。

这意味着即使是A8W8也可能不够。权重带宽可能成为瓶颈,因此将权重量化到INT4非常有价值。

简单的近似取整量化在非常低的位宽下可能会严重失败。例如,对大型OPT模型应用简单的RTN会导致巨大的困惑度峰值。极端权重量化需要更谨慎的方法。

AWQ

AWQ代表激活感知权重量化(Activation-aware Weight Quantization)。

其关键观察是:

并非所有权重通道都同等重要,重要性通过激活而不是权重幅度来识别更好。

保持或保护极少数的显著通道可以极大地提高INT4仅权重量化下的质量。

选择显著通道

AWQ使用激活统计数据选择显著通道。连接到大激活的权重通道如果量化不当,会对输出误差贡献更多。

这就是为什么激活感知的重要性比仅基于权重幅度更有用。

使用缩放而非混合精度

一个直接的想法是将前1%的显著权重保持在高精度。但同一张量内的混合精度对硬件来说很别扭。

AWQ转而使用缩放。

对于显著通道,在量化前放大权重,并对应缩小激活:

\[ WX \approx Q(W \cdot s)(s^{-1}X). \]

缩放保留了数学计算,同时减少了重要权重通道的相对量化误差。

为什么缩放有帮助?

对于标准量化:

\[ \operatorname{Err}(Q(w)\cdot x) = \Delta \cdot \operatorname{Err}\left(\operatorname{Round}\left(\frac{w}{\Delta}\right)\right) \cdot x. \]

对于缩放后的权重:

\[ \operatorname{Err}\left(Q(w\cdot s)\cdot \frac{x}{s}\right) = \Delta’ \cdot \operatorname{Err}\left(\operatorname{Round}\left(\frac{w\cdot s}{\Delta’}\right)\right) \cdot \frac{x}{s}. \]

如果\(s\)适中并且只应用于一小部分通道,全局量化步长可能大致保持不变,因此\(\Delta’ \approx \Delta\)。这些通道的误差贡献大致减少了\(s\)倍。

最优缩放搜索

AWQ搜索最小化重构误差的缩放因子:

\[ \mathcal{L}(s) = \left|Q(W\cdot s)(s^{-1}X)-WX\right|. \]

缩放因子由激活统计参数化:

\[ s=s_X^\alpha, \qquad \alpha^*=\arg\min_\alpha \mathcal{L}(s_X^\alpha). \]

搜索很小且校准高效,因为它不是试图回归每个权重,而是为保持层输出选择通道缩放规则。

优势

AWQ有几个实际优势:

  • 实现简单
  • 对硬件内核友好
  • 需要相对较少的校准数据
  • 比更重的基于回归的方法对校准分布偏移更鲁棒
  • 可跨指令调优和多模态模型工作

INT4推理内核

仅权重量化的INT4减少了内存流量,但硬件通常读取字节,而不是单个4位值。

这使得打包布局变得重要。

AWQ风格的内核可以离线预打乱INT4权重,以便运行时高效解包。该布局允许SIMD指令并行解码多个权重:

  1. 掩码提取低4位值
  2. 将字节块右移4位
  3. 再次掩码提取另一个4位值

经验是压缩不仅是算法问题。位布局必须匹配硬件的向量操作。

内核融合

高效的LLM内核避免不必要的DRAM访问。

对于注意力,融合内核可以组合操作,如批量矩阵乘法、掩码、softmax和第二次矩阵乘法,同时将中间结果保持在快速内存中。

对于量化后的GEMM,反量化可以融合到矩阵乘法中:

  • CUDA核心解包并反量化INT4权重
  • 张量核心使用反量化值进行矩阵乘法
  • 完整的解压模型从不写回内存

这就是低位推理既依赖量化方法又依赖内核设计的原因。

剪枝与稀疏性

权值稀疏性

对于LLM剪枝,激活感知的标准可以胜过简单的权重幅度。

一个有用的剪枝得分是:

\[ |W| \cdot |X|. \]

这保留了在模型实际看到的激活下重要的权重。

上下文稀疏性

静态稀疏性永久移除权重。这可能损害准确性,因为相同的稀疏子网络必须服务于每个输入。

上下文稀疏性是输入相关的。不同的输入激活不同的注意力头、MLP特征或神经元。像DejaVu这样的系统尝试预测哪些计算对当前上下文是不必要的,并动态跳过它们。

关键区别:

  • 静态稀疏性问哪些权重是全局不必要的
  • 上下文稀疏性问哪些计算对这个输入是不必要的

混合专家

混合专家(Mixture-of-Experts)模型在模块级别使用稀疏激活。

不是将每个token通过相同的密集前馈网络,而是路由器为每个token选择少数专家。

这解耦了总参数数量和每token推理成本:

  • 更多专家增加了总模型容量
  • 只有选中的专家为每个token运行
  • 推理成本可以保持在更小的密集模型附近

容量因子

路由并不总是平衡的。一些专家可能接收到比其他更多的token。

容量因子控制每个专家允许处理的token数量:

\[ \text{expert capacity} = \frac{\text{tokens per batch}}{\text{number of experts}} \times \text{capacity factor}. \]

低的容量因子效率高,但当路由不平衡时存在丢弃token的风险。较高的容量因子提供松弛容量,但增加了内存和计算开销。

注意力稀疏性

注意力稀疏性通过避免不重要的token、头或值获取来减少工作量。

例子:

  • 剪掉累积注意力分数低的token
  • 移除贡献小的头
  • 当查询-键分数太小时跳过的值向量获取
  • 从低精度开始,仅在置信度低时使用更高精度

目标是避免在不太影响输出的信息上花费完整的注意力成本。

LLM服务系统

LLM服务指标

部署质量通过面向用户的延迟和系统范围的吞吐量来衡量。

首token时间

首token时间(TTFT)是提交请求和收到第一个生成token之间的延迟。

它对交互性尤其重要。高TTFT会让模型感觉响应迟钝。

每个输出token时间

每个输出token时间(TPOT)是生成第一个token后每个后续token的平均生成时间。

这控制了响应明显的流式速度。

延迟

端到端延迟为:

\[ \text{latency} = \text{TTFT} + \text{TPOT} \times \text{number of generated tokens}. \]

吞吐量

吞吐量是所有用户和请求每秒生成的总token数。

用户往往关心延迟。服务提供商也关心吞吐量,因为它决定了相同硬件能服务多少流量。

PagedAttention

KV缓存是LLM服务中的一个主要内存问题。

浪费来自两个来源:

  • 输出长度未知,因此系统可能过度分配缓存内存
  • 并非所有分配的缓存内存在每个阶段都被活跃使用

PagedAttention从操作系统中借用了分页的概念。

不是要求每个序列有一个连续的KV缓存块,PagedAttention将缓存分解为固定大小的块。

然后它使用一个块表将逻辑token块映射到物理内存块。

工作原理

  1. 将每个序列的KV缓存分割为逻辑块。
  2. 按需分配物理GPU内存块。
  3. 将逻辑块存储在非连续的物理内存中。
  4. 使用块表将逻辑块ID转换为物理块ID。

这避免了大的连续分配并减少了碎片。

优势

PagedAttention提高了服务效率,因为:

  • 内存分配更接近实际需求
  • 更多并发请求可以放入GPU内存
  • 通过更大的有效批处理,吞吐量增加
  • 共享提示前缀可以重用物理KV缓存块

这种内存共享特性对于束搜索、并行采样以及多个延续共享相同提示的工作负载非常有用。

FlashAttention

标准注意力是内存受限的。

核心问题是内存层级:

  • GPU SRAM小但非常快
  • GPU HBM大但慢得多
  • 实例化完整的\(N \times N\)注意力矩阵导致大量HBM流量

FlashAttention不改变注意力的数学计算。它改变了IO模式。

分块

FlashAttention将计算分解为适合SRAM的块。

它加载\(Q\)、\(K\)和\(V\)的块,局部计算注意力,避免将完整的注意力矩阵写入HBM。

内核融合

FlashAttention将操作如分数计算、掩码、softmax和值聚合融合到一个IO感知的内核中。

这减少了内存流量,使长上下文注意力实用得多。

关键思想是:

注意力效率不仅是FLOPs,也是数据在内存层级中移动的次数。

推测解码

自回归解码逐个生成token。对于小批量,该过程通常是内存受限的,因为每个token步骤都会流式读取大量模型权重。

推测解码使用两个模型:

  • 一个小型草稿模型
  • 一个大型目标模型

草稿模型快速提出几个token。目标模型并行验证这些草稿token。

如果草稿token与目标模型的分布一致,可以一次接受多个token。如果不一致,目标模型纠正序列。

重要的特性是推测解码可以在提高速度的同时保持目标模型的输出分布,当草稿模型足够准确时,通常能达到2倍到3倍的加速。

批处理

批处理通过共同服务多个请求来提高GPU利用率。

方法工作原理权衡
无批处理一次处理一个请求简单但低效
静态批处理等待固定批次大小适合离线任务,但增加等待时间
动态批处理在装满或超时后批处理平衡吞吐量和延迟
连续批处理逐个token调度请求最适合LLM服务,因为新请求可在其他完成时加入

连续批处理,也称为飞行中批处理,尤其重要,因为LLM请求具有不同的提示长度和生成长度。token级调度避免了已完成请求留下的空闲槽位。

总结

LLM部署是一个系统优化的栈:

  • SmoothQuant将激活困难转移到权重
  • AWQ通过激活感知缩放保护显著权重通道
  • INT4内核需要硬件友好的打包和融合反量化
  • 稀疏性仅在运行时能利用时才节省工作
  • MoE增加参数数量而不对每个token激活每个参数
  • PagedAttention使KV缓存内存管理更高效
  • FlashAttention通过分块和融合减少HBM流量
  • 推测解码和批处理提高服务吞吐量和延迟

共同的主题是高效的LLM服务取决于将模型变换与内存层级和运行时调度器匹配。

相似文章