当前位置: 首页 > article >正文

大模型开发和微调工具Llama-Factory-->量化2(AQLM和OFTQ)

3.AQLM(2024.1)

AQLM(Additive Quantization of Language Models)作为一种只对模型权重进行量化的 PTQ 方法,在 2-bit 量化下达到了当时的最佳表现,并且在 3-bit4-bit 量化下也展示了性能的提升。

尽管 AQLM 在模型推理速度方面的提升并不是最显著的,但其在 2-bit 量化下的优异表现意味着您可以以极低的显存占用来部署大模型。

作者们探讨了如何通过加性量化(Additive Quantization, AQ)方法实现大型语言模型(LLMs)的极端压缩,目标是将模型的比特数压缩到每个参数仅2到3比特。

背景

大模型的参数量通常达到数十亿级别,需要大量的计算和存储资源。为了在普通的硬件上运行这些模型,研究者们一直在寻找有效的模型压缩技术。

在这里插入图片描述

图 1:在 LLAMA2 的 7, 13 和 70B 模型上,AQLM(2 位)相对于最先进的 QuIP#(2 位)和原始 16 位权重的比较。

原理

AQLM 算法基于加性量化(AQ)方法,这是一种用于信息检索的经典多码本量化(MCQ)技术。

AQLM算法的核心思想将权重矩阵的量化问题转化为一个优化问题,通过学习加性量化的权重表示来近似保持原始模型的输出

AQLM算法包含两个主要的创新点

  1. 学习加性量化:算法不是简单地对权重进行直接量化,而是通过学习的方式,将权重矩阵量化为输入适应性的方式。这种方法考虑了模型输入的分布,以更好地保持模型的输出。
  2. 层块联合优化:算法不仅优化单个层的权重,而是在多个层块上联合优化代码本参数。这样做可以更好地保持整个模型块的输出,从而提高压缩后的模型性能。

AQLM算法的具体实现包括三个阶段:

在这里插入图片描述

图 3:AQLM 压缩权重格式。横轴和纵轴分别为输入特征和输出单位。深度代表代码集索引。
重构过程,从左到右:
i) 压缩权重代码
ii) 放大一个权重组,每个代码是其各自代码库中的索引
iii) 从每个代码库中选择代码
iv) 如 (2) 所示将代码相加
v) 乘以比例(每个输出维度一个比例)。

  • 代码搜索:使用束搜索(beam search)算法来更新量化代码。

  • 代码本更新:使用Adam优化器来更新码本,以最小化量化误差。

  • 层内联合微调:在量化后的模型上进行微调,以进一步减少量化误差。

    在这里插入图片描述

实验

  1. 比较低比特量化的结果

    在这里插入图片描述

  1. 推理速度

    在这里插入图片描述

4.OFTQ(大约 2023)

OFTQ(On-the-fly Quantization) 指的是模型无需校准数据集直接在推理阶段进行量化

OFTQ 是一种动态后训练量化技术.

因此,在使用OFTQ量化方法时,您需要指定预训练模型、指定量化方法 quantization_method 和指定量化位数 quantization_bit 下面提供了一个使用 bitsandbytes 量化方法的配置示例:

model_name_or_path: meta-llama/Meta-Llama-3-8B-Instruct
quantization_bit: 4
quantization_method: bitsandbytes  # choices: [bitsandbytes (4/8), hqq (2/3/4/5/6/8), eetq (8)]

1.bitsandbytes(2022)

区别于 GPTQ, bitsandbytes 是一种动态后训练量化技术

bitsandbytes 使得 大于 1B 的语言模型也能在 8-bit 量化后不过多地损失性能。

经过bitsandbytes 8-bit 量化的模型能够在保持性能的情况下节省约 50% 的显存

2.HQQ(2023)

依赖校准数据集的方法往往准确度较高,不依赖校准数据集的方法往往速度较快。

HQQ(Half-Quadratic Quantization, 半二次量化)希望能在准确度和速度之间取得较好的平衡

作为一种动态后训练量化方法,HQQ 无需校准阶段, 但能够取得与需要校准数据集的方法相当的准确度,并且有着极快的推理速度。

来自官网

背景

作者们提出了一种称为 半二次量化(HQQ) 的新量化技术。
作者提出的方法不需要校准数据,可以显着加快大型模型的量化,同时通过基于校准的方法提供压缩质量竞争。
例如,与广泛采用的 GPTQ 相比,HQQ 需要
不到 5 分钟的时间
来处理巨大的Llama-2-70B。我们的 Llama-2-70b 量化为 2 bit的量化,以大幅度的余量优于完整的 Llama-2-13b,以提供可比的内存使用情况。

引言

量化有两类方法:

无数据校准技术(例如 bitsandbytes)仅依赖于使用权重而无需外部数据

基于校准的方法(例如依赖于外部数据集的 GPTQ 和 AWQ ) 。

虽然基于校准的方法提供了更好的量化质量,但它们存在两个主要问题:

  1. 校准数据偏差:根据所提供的校准数据,量化质量可能会受到负面影响。

  2. 量化时间:校准可能是一个繁重的计算过程,尤其是对于非常大的模型,这使得测试和部署多个模型变得困难。

如果我们能够以无需校准的量化方法的速度实现基于校准的方法的质量,那不是很棒吗?

这正是我们通过半二次量化 (HQQ) 方法提出的建议

原理

偏离分布的权重,即所谓的异常值,会带来特别的挑战。

群精确调谐量化(GPTQ)和激活感知层量化(AWQ)是试图克服这一问题的算法,它们依靠校准数据来最小化层输出的误差。

HQQ 是一种用于大语言模型压缩的创新量化方法,其核心思想是将权重分布划分为两个区域,并对这两个区域分别采用不同的量化策略。

主要步骤如下:

  1. 权重分布分析
    • 首先分析模型权重的分布特征
    • 找到一个合适的阈值(通常是分位数),将权重分为两个区域
  2. 区域划分
    • 高值区域(tail region): 包含绝对值较大的权重
    • 主体区域(body region): 包含绝对值较小的权重,通常占大多数
  3. 差异化量化
    • 对主体区域使用线性量化
    • 对高值区域使用非线性量化(通常是对数量化)
  4. 量化映射
    • 为两个区域分配不同的比特数
    • 通常主体区域使用较少的比特(如4-bit)
    • 高值区域使用较多的比特(如8-bit)

这种方法的优势在于:

  1. 更好地保持模型精度
    • 对重要的高值权重给予更多的量化精度
    • 减少量化误差对模型性能的影响
  2. 存储效率
    • 大多数权重使用低比特量化,节省存储空间
    • 只有少量高值权重使用高比特量化
  3. 计算效率
    • 保持了较低的内存带宽需求
    • 适合在边缘设备上部署

特别重要的是:

  • HQQ能在保持模型性能的同时实现高压缩率
  • 相比普通的uniform quantization,能更好地处理长尾分布的权重

实验

  1. 时间很快

    在这里插入图片描述
    在这里插入图片描述

  2. Llama2 基准

    在这里插入图片描述

    在这里插入图片描述

结论

本文证明,通过我们提出的半二次量化 (HQQ) 方法进行免校准量化,其质量可与 GPTQ 和 AWQ 等依赖数据的流行方法相媲美。

我们证明了 HQQ 的有效性,即使是在不同模型大小和应用的极端低位量化情况下也是如此。

此外,通过利用半二次分裂等高效优化技术,我们的方法即使在 Llama-2-70B 等现有最大模型中也能将量化时间缩短到几分钟。

3.EETQ(2023)

EETQ(Easy and Efficient Quantization for Transformers)是一种只对模型权重进行量化的PTQ方法。

具有较快的速度和简单易用的特性。

没找到论文和相应的文章,只找到了 Github

特点

  • 新特性🔥: 引入gemv算子 提升性能10%~30%.
  • 高性能的 INT8 权重训练后量化算子
    • 提取自FasterTransformer的高性能GEMM内核,可以更加方便集成至您的项目中
    • 无需量化感知训练
  • 使用 Flash-Attention V2 优化 attention 的推理性能
  • 简单易用,只需一行代码即可适配您的 PyTorch 模型

性能测试

在这里插入图片描述


http://www.kler.cn/a/419117.html

相关文章:

  • Scala学习记录,全文单词统计
  • 会议直击|美格智能亮相2024紫光展锐全球合作伙伴大会,融合5G+AI共拓全球市场
  • Vue中实现函数限流:节流和防抖
  • Linux虚拟机安装nginx踩坑记录
  • C-操作符
  • Kafka AdminClient API 来获取特定 Kafka 消费组的消费延迟
  • Ubuntu在NVME硬盘使用Systemback安装记录
  • Design Linear Filters in the Frequency Domain (MATLAB帮助文档)
  • Python json 序列化
  • mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
  • Linux —— 《线程控制》
  • nmap基本用法
  • 【小白学机器学习39】如何用numpy生成总体,生成样本samples
  • 【RISC-V CPU debug 专栏 2.3 -- Run Control】
  • .NET周刊【11月第4期 2024-11-24】
  • React与Ant Design入门指南
  • springboot336社区物资交易互助平台pf(论文+源码)_kaic
  • Linux命令进阶·如何切换root以及回退、sudo命令、用户/用户组管理,以及解决创建用户不显示问题和Ubuntu不显示用户名只显示“$“符号问题
  • 桶排序(代码+注释)
  • webUI自动化(十)iframe切换
  • 【docker集群应用】Docker数据管理与镜像创建
  • Flutter:encrypt插件 AES加密处理
  • 10.请求拦截和响应拦截
  • Rust代写 OCaml代做 Go R语言 SML Haskell Prolog DrRacket Lisp
  • Jackson库--ObjecMapper
  • vue3 与 spring-boot 完成跨域访问