专栏名称: 极市平台
极市平台是由深圳极视角推出的专业的视觉算法开发与分发平台,为视觉开发者提供多领域实景训练数据库等开发工具和规模化销售渠道。本公众号将会分享视觉相关的技术资讯,行业动态,在线分享信息,线下活动等。 网站: http://cvmart.net/
目录
相关文章推荐
Quora文选英语  ·  老外说𝒐𝒖𝒕 𝒐𝒇 ... ·  17 小时前  
Quora文选英语  ·  老外说𝒕𝒂𝒍𝒌 𝒕𝒐 𝒕𝒉𝒆 ... ·  昨天  
知乎日报  ·  知乎瞎扯|你捡过最大的漏是什么? ·  2 天前  
知乎日报  ·  票房已突破 26 亿,如何评价《唐探 1900》? ·  3 天前  
51好读  ›  专栏  ›  极市平台

扩散模型部署有新解,直接量化为4bit?韩松团队等提出SVDQuant:16GB笔记本上加速8.7 倍

极市平台  · 公众号  ·  · 2024-12-05 22:00

正文

↑ 点击 蓝字 关注极市平台
作者丨科技猛兽
编辑丨极市平台

极市导读

在 12B FLUX.1-dev 上,与 BF16 模型相比,它减少了 3.6 倍的 memory。通过消除 CPU offloading,在 16GB 笔记本电脑 4090 GPU 上时,它比 16 bit 模型提供了 8.7 倍的加速,比 NF4 W4A16 基线快 3 倍 >> 加入极市CV技术交流群,走在计算机视觉的最前沿

太长不看版

量化文生图扩散模型的成功范式。

Diffusion Model 的部署一直都是个很大的问题,因为随着这种模型越做越大就需要更多的 memory 造成更大的时延,而这些对于部署而言都是不利的。

本文给出了一个很激进的量化方案: 把扩散模型的 weight 和 activation 都量化为 4 bit。 在如此激进的量化层面上,weight 和 activation 都高度敏感,传统 LLM 的 post-training quantization 方法,如 smoothing 就不好使了。

因此,本文提出了一种 4-bit 量化算法:SVDQuant。SVDQuant 的核心操作不像 smoothing 那样在 weight 和 activation 之间重新分配异常值 (Outlier),而是使用一个 low-rank 分支来吸收这些异常值。SVDQuant 首先通过将异常值从 activation 转移到 weight 来巩固异常值,然后使用高精度的 low-rank 分支通过奇异值分解 (SVD) 获取权重异常值。这个过程使得 weight 和 activation 的量化都得到了简化。但由于激活的额外数据移动,简单地独立运行 low-rank 分支会产生显著的额外开销,使得量化很难获得实际加速。

为了解决这个问题,本文 co-design 了推理引擎 Nunchaku,把 low-rank 分支的 kernel 吸收到 low-bit 分支中,切断冗余的内存访问。它也可以无缝支持现成的低秩适配器 (LoRA),而无需重新量化。作者在 SDXL, PixArt-Σ, 和 FLUX.1 上都进行了实验。12B FLUX.1 模型的内存使用量减少了 3.5 倍,在 16GB 笔记本电脑 4090 GPU 上的 4-bit权重量化基线上实现了 3.0 倍的加速。

图1:SVDQuant 是一种训练后量化,用于 4 bit 权重和激活,可以很好地保持视觉保真度。在 12B FLUX.1-dev 上,与 BF16 模型相比,它减少了 3.6 倍的 memory。通过消除 CPU offloading,在 16GB 笔记本电脑 4090 GPU 上时,它比 16 bit 模型提供了 8.7 倍的加速,比 NF4 W4A16 基线快 3 倍

下面是对本文的详细介绍。

本文目录

1 SVDQuant:吸收异常值量化 4-bit 扩散模型
(来自 MIT 韩松团队,NVIDIA)
1 SVDQuant 论文解读
1.1 SVDQuant 研究背景
1.2 量化过程介绍
1.3 问题定义
1.4 SVDQuant 方法介绍
1.5 推理引擎 Nunchaku
1.6 SVDQuant 支持的模型数据集和评价指标
1.7 实验结果

1 SVDQuant:吸收异常值量化 4-bit 扩散模型

论文名称:SVDQuant: Absorbing Outliers by Low-Rank Components for 4-Bit Diffusion Models

论文地址:

http://arxiv.org/pdf/2411.05007

Quantization Library:

http://github.com/mit-han-lab/deepcompressor

Inference Engine:

http://github.com/mit-han-lab/nunchaku

1.1 SVDQuant 研究背景

扩散模型通过在海量数据上进行训练,可以从简单的文本提示生成令人惊叹的图像。为了追求更高的图像质量和更精确的文本到图像对齐,研究者开始扩大扩散模型。Stable Diffusion 1.4 只有 800M 参数,而 SDXL 扩展到 2.6B 参数。AuraFlow v0.1[1]进一步扩展为 6B 参数,最新模型 FLUX.1[2]扩展到了 12B 参数。如图2所示,与大语言模型 (LLM) 相比,扩散模型的计算量要大得多。它们的计算成本随模型大小的增加而迅速增加,给现实世界的模型部署带来了令人望而却步的内存和时延障碍,特别是对于需要低延迟的交互用例。

图2:LLM 和扩散模型的计算量 vs. 参数量。LLM 的计算是用 512 的 context 和 256 输出 tokens 来衡量的,扩散模型的计算是针对单步的

由于摩尔定律放缓,硬件供应商转向低精度推理以维持性能提升。例如,NVIDIA 的 Blackwell Tensor Cores 引入了一个新的 4-bit floating point (FP4) 精度,与 FP8 相比,性能翻倍。因此,使用 4-bit 推理来加速扩散模型很有吸引力。在 LLM 领域,研究人员利用量化来压缩模型大小并提高推理速度。

但是,扩散模型与 LLM 不同,LLM 的时延主要受权重加载的限制,对于小 Batch size 的扩散模型计算量仍然很大。仅仅量化权重不可以加速扩散模型。为了实现加速,weight 和 activation 必须量化为同等位宽。否则,较低精度的计算性能优势将被抹除。

因此,本文专注于将扩散模型的 weight 和 activation 量化为 4 bits。这种具有挑战性和激进的方案往往容易出现严重的质量下降。本文提出了一种新的通用量化范式 SVDQuant。

其可以用下图3概括。SVDQuant 的核心思想是引入一个低成本的分支来吸收两边的异常值。为了实现这一点, 首先通过平滑将它们从激活 迁移到权重 来聚合异常值。然后将奇异值分解 (SVD) 应用于更新的权重 , 将其分解为低秩分支 和残差 。low-rank 分支以 16-bit 运行, 允许仅将残差量化为 4 位, 这显着减少了异常值幅度。

图3:SVDQuant 方案。(a) 最初,激活 X 和权重 W 都包含异常值,这使得 4 位量化具有挑战性。(b) 将异常值从激活迁移到权重,从而得到新的激活和权重。虽然新的激活更容易量化,但新的权重现在变得更加困难。(c) SVDQuant 进一步将权重分解为低秩分支和残差分支。低秩分支 16 位运行,减轻了量化难度

但是直接运行 low-rank 分支会产生大量的内存访问开销,抵消了 4-bit 推理加速。为了克服这个问题,我们一起设计了一个专门的推理引擎 Nunchaku,将低秩分支计算融合到 4-bit 量化和计算 Kernel 中。这种设计能够在有额外的分支的情况下实现推理加速。

1.2 量化过程介绍

量化是加速网络中线性层的有效方法。给定一个张量 ,量化过程定义为:

式中, 的 low-bit 表示, 是比例因子, 是最大量化值。对于有符号的 位整数量化, 。对于 1 位尾数和 2 位指数的 4 位浮点量化, 。因此,去量化张量可以表述为 。对于输入 和权重 的线性层, 其计算可以近似为:

相同的近似适用于卷积层。为了加快计算速度, 现代算术逻辑单元需要具有相同位宽的

本文专注于用于加速的 W4A4 量化,其中权重和激活的异常值都有很大的障碍。抑制这些异常值的传统方法包括量化感知训练 (QAT)[3]和 Rotation[4][5][6]。QAT 需要大量的计算资源,特别是对于超过 10B 参数的模型 (例如,FLUX.1)。由于扩散模型中使用自适应归一化层,Rotation 不适用。归一化权重由于需要运行时候在线生成,所以没办法离线集成到投影层权重里。所以,在线生成的激活和权重都会产生显著的计算开销。

1.3 问题定义

SVDQuant 的核心思想是引入额外的 low-rank 分支,可以吸收 weight 和 activation 中的量化困难。最后,作者提供了一个具有 Kernel 融合的协同设计推理引擎 Nunchaku,以最小化 4 bit 模型中 low-rank 分支的开销。

设线性层为 , 权重为 , 则量化误差为:

式中, 是 Frobenius 范数。

Proposition 1 (误差分解): 量化误差可以分解为:

从命题中可以看出, 误差受权重和输入的大小 以及它们各自的量化误差 的限制。为了最小化整体量化误差, 目标是优化这4项。

1.4 SVDQuant 方法介绍

Smoothing 是减少异常值的有效方法。可以通过缩小输入 并使用每通道平滑因子 相应地调整权重矩阵 来平滑激活中的异常值。如图 4(a)(c) 所示, 平滑输入 表现出减小的幅度和更少的异常值,从而导致较低的输入量化误差。然而,在图 4(b)(d) 中,转换后的权重 在幅度和异常值的存在方面都显着增加,这反过来又提高了权重量化误差。因此,整体误差减少有限。

图4:PixArt-Σ 中输入和权重的示例值分布,λ 是平滑因子,红色表示异常值。最初,权重和激活值都包含大量异常值。Smoothing 之后,激活的异常值减少,权重展示出更多异常值。减去 SVD low-rank 分支之后,剩下的部分的范围更窄,并且不受异常值的影响

用 low-rank 分支吸收增加的权重异常值。 本文核心的做法是引入一个 16-bit low-rank 分支, 并进一步将权重量化难度迁移到该分支。具体来说,将转换后的权重分解为 ,其中 是秩 的两个低秩因子, 是残差。那么 可以近似为:

与直接进行 4-bit 量化, 即 相比, 本文的方法首先以 16-bit 精度计算 low-rank 分支 , 然后用 4-bit 量化逼近残差 。实践中, 一般设置 , 通常为 16 或者 32。因此, low-rank 分支的附加参数和计算可以忽略不计。现在, 仍然需要仔细的系统设计来消除冗余内存访问。

根据上式5,量化误差可以写成:

根据命题 4.1, 由于 已经没有异常值, 因此只需要专注于优化 及其量化误差

Proposition 2 (量化误差界): 对于式1 中描述的任何张量 和量化方法,如 。假设 的元素服从正态分布, 则有:

其中 表示 中的元素数。

因此,量化误差 受残差 大小的限制。

因此,本文目标是找到使 最小化的最优 ,这可以通过简单的奇异值分解 (SVD) 来解决。给定 的 SVD,最优解为

图5 绘制了原始权重 、转换后的权重 和残差 的奇异值分布。原始权重 的奇异值高度不平衡。平滑后,转换后的权重 的奇异值分布更加陡峭,前几个值明显更大了。

图5:不同变量的前 64 个奇异值分布。转换后的矩阵的前 32 个奇异值表现出陡峭的下降,而其余的值更渐进

通过去除这些主导值, Eckart-Young-Mirsky 定理表明残差 的大小显着降低。因为有 , 原始的幅值为 , 其中 的第 个奇异值。

此外, 实践表明, 与 相比, 表现出更少的异常值, 具有显着压缩的值范围, 如图 4(d) (e)所示。在实践中,可以通过分解 并相应地调整 多次迭代来进一步减少量化误差,然后选择误差最小的结果。

因此,SVDQuant 的思路:

  • 原始模型中,根据 Proposition 1 得到的误差分为 4 项,都要考虑。
  • 使用了 Smoothing 操作之后, 此时 已经基本没有异常值了, 但是此时 中的异常值加剧。还是不好。
  • 使用了本文提出的 low-rank 分支之后,将误差表达式变为了 5 式,继而将量化误差等效为 7 式 (由于此时 已经基本没有异常值了)。
  • 根据 Proposition 2 得到 7 式的量化误差相当于以残差






请到「今天看啥」查看全文