Transformers 中原生支持的量化方案概述

本文旨在对 transformers 支持的各种量化方案及其优缺点作一个清晰的概述,以助于读者进行方案选择。

目前,量化模型有两个主要的用途:

  • 在较小的设备上进行大模型推理

  • 对量化模型进行适配器微调

到目前为止,transformers 已经集成并 原生 支持了 bitsandbytes 和 auto-gptq 这两个量化库。请注意,🤗 optimum 还支持更多的量化方案,但本文不会涉及这一块内容。

要详细了解每种方案的更多信息,可查看下文列出的相关资源,或者阅读相应的 transformers 文档。

另请注意,下文内容仅适用于 PyTorch 模型, Tensorflow 和 Flax/JAX 模型不在讨论范围之内。

目录

  • 资源

  • bitsandbytes 与 auto-gptq 之比较

  • 深入研究速度基准

  • 总结与最后的话

  • 致谢

资源

  • GPTQ 博文 – 概述什么是 GPTQ 量化方法以及如何使用它。

  • bistandbytes 4 比特量化博文 - 本文介绍了 4 比特量化和 QLoRa,QLoRa 是一种高效的微调方法。

  • bistandbytes 8 比特量化博文 - 本文解释了如何与 bitsandbytes 配合使用 8 比特量化。

  • 有关 GPTQ 基础用法的 Google Colab 笔记本 - 本笔记本展示了如何使用 GPTQ 方法量化你自己的 transformer 模型,如何用量化模型进行推理,以及如何对量化模型进行微调。

  • 有关 bitsandbytes 基础用法的 Google Colab 笔记本 - 该笔记本展示了如何在推理中使用 4 比特模型及其所有变体,以及如何在免费的 Google Colab 实例上运行 GPT-neo-X (20B 模型)。

  • Merve 撰写的关于量化的博文 - 本文简要介绍了量化以及 transformers 中原生支持的量化方法。

bitsandbytes 与 auto-gptq 之比较

本节我们将讨论 bitsandbytes 和 gptq 量化各自的优缺点。请注意,这些比较主要基于社区的反馈,它们具有一定的时效性,会随着时间的推移而变化,比如说其中一些功能缺失已被纳入相应库的路线图中了。

bitsandbytes 有什么好处?

简单: bitsandbytes 依旧是量化任何模型的最简单方法,因为它不需要量化校准数据及校准过程 (即零样本量化)。任何模型只要含有 torch.nn.Linear 模块,就可以对其进行开箱即用的量化。每当在 transformers 中添加新架构时,只要其可以用 accelerate 库的 device_map="auto" 加载,用户就可以直接受益于开箱即用的 bitsandbytes 量化,同时该方法对性能的影响也是最小的。量化是在模型加载时执行的,无需运行任何后处理或准备步骤。

跨模态互操作性: 由于量化模型的唯一条件是包含 torch.nn.Linear 层,因此量化对于任何模态都可以实现开箱即用。用户可以开箱即用地加载诸如 Whisper、ViT、Blip2 之类的 8 比特或 4 比特模型。

合并适配器 (adapter) 时性能下降为 0: (如果你对此不熟悉,请参阅 此文 以获得有关适配器和 PEFT 的更多信息)。如果你在量化基础模型之上训练适配器,则可以将适配器合并在基础模型之上进行部署,而不会降低推理性能。你甚至还可以在反量化模型之上 合并 适配器!GPTQ 不支持此功能。

autoGPTQ 有什么好处?

文本生成速度快: 对 文本生成 任务而言,GPTQ 量化模型的速度比 bitsandbytes 量化模型的速度更快,下文我们会详细比较。

n 比特支持: GPTQ 算法可以将模型量化至 2 比特!但这可能会导致严重的质量下降。我们建议使用 4 比特,这个值对 GPTQ 而言是个很好的折衷。

易于序列化: GPTQ 模型支持任意比特的序列化。只要安装了所需的软件包,就支持开箱即用地从 TheBloke 空间 中加载后缀为 -GPTQ 的模型。bitsandbytes 支持 8 比特序列化,但尚不支持 4 比特序列化。

AMD 支持: 开箱即用支持 AMD GPU!

bitsandbytes 还有哪些潜在的改进空间?

文本生成速度比 GPTQ 慢: 使用 generate 接口时,bitsandbytes 4 比特模型比 GPTQ 慢。

4 比特权重不可序列化: 目前,4 比特模型无法序列化。社区用户经常提出这样的请求,我们相信 bitsandbytes 维护者应该很快就能解决这个问题,因为这已经在其路线图中了!

autoGPTQ 还有哪些潜在的改进空间?

校准数据集: 对校准数据集的需求可能会让一些用户难以用上 GPTQ。此外,模型量化可能需要几个小时 (例如,根据 该论文第 2 节,175B 的模型需要 4 个 GPU 时)。

目前仅可用于语言模型: 截至目前,用 autoGPTQ 对模型进行量化的 API 仅支持语言模型。使用 GPTQ 算法量化非文本 (或多模态) 模型应该是可行的,但原始论文或 auto-gptq 代码库中尚未对此有详细说明。如果社区对这方面很有兴趣,将来可能会考虑这一点。

深入研究速度基准

我们决定在不同硬件上使用 bitsandbytes 和 auto-gptq 在推理和适配器微调这两大场景上进行一系列广泛的基准测试。推理基准测试应该让用户了解不同推理方法之间可能存在的速度差异,而适配器微调基准测试应该让用户在需要决定选择 bitsandbytes 还是 GPTQ 基础模型进行适配器微调时有一个清晰的判断。

基本设置如下:

  • bitsandbytes: 使用 bnb_4bit_compute_dtype=torch.float16 进行 4 比特量化。确保使用 bitsandbytes>=0.41.1 ,以用上 4 比特加速核函数。

  • auto-gptq: 确保 auto-gptq>=0.4.0 以用上 exllama 加速核函数进行 4 比特量化。

推理速度 (仅前向)

该基准测试仅测量预填充 (prefill) 步骤,该步骤对应于训练期间的前向传递。测试基于单张英伟达 A100-SXM4-80GB GPU,提示长度为 512,模型为 meta-llama/Llama-2-13b-hf 。

batch size = 1 时:

量化方法act_order比特数group_size加速核加载时间 (秒)每词元延迟 (毫秒)吞吐 (词元/秒)峰值显存 (MB)
fp16NoneNoneNoneNone26.036.95827.05829152.98
gptqFalse4128exllama36.233.71129.66310484.34
bitsandbytesNone4NoneNone37.6452.0019.2311018.36

batch size = 16 时:

量化方法act_order比特数group_size加速核加载时间 (秒)每词元延迟 (毫秒)吞吐 (词元/秒)峰值显存 (MB)
fp16NoneNoneNoneNone26.069.94228.7653986.51
gptqFalse4128exllama36.295.41167.6834777.04
bitsandbytesNone4NoneNone37.64113.98140.3835532.37

我们可以看到,bitsandbyes 和 GPTQ 的预填充速度相当,batch size 比较大时 GPTQ 稍快一些。欲了解有关该基准测试的更多详细信息,请参阅此 链接。

生成速度

下面测试推理过程中模型的生成速度,你可以在 此处 找到基准测试脚本,用于重现我们的结果。

use_cache

我们先测试 use_cache 参数的影响,以更好地了解在生成过程中键值缓存对速度的影响。

该基准测试在 A100 上运行,提示长度为 30,生成词元数也为 30,模型为 meta-llama/Llama-2-7b-hf 。

use_cache=True 时:

e9f3f1ef77abeb33d9bb591361806ae2.png
use_cache=True A100 基准测试结果

use_cache=False 时:

8180597dafba351483e3f77f36cbfd6f.jpeg
use_cache=False A100 基准测试结果

通过这两个基准测试,可以得出结论,使用注意力缓存时,生成速度会更快,该结论符合预期。此外,一般来说,GPTQ 比 bitsandbytes 更快。例如, batch_size=4 且 use_cache=True 时,GPTQ 速度快了一倍!因此,我们下一个基准测试中会直接使用 use_cache=True 。请注意, use_cache=True 会消耗更多显存。

硬件

下面,我们看看量化模型在不同的硬件上的表现。我们使用的提示长度为 30,生成 30 个词元,使用的模型是 meta-llama/Llama-2-7b-hf 。

单张 A100:

20730731939f4f2852a3c687e64144a8.png
A100 基准测试结果

单张 T4:

850c92aa6d40f0be93a5a9551362960c.jpeg
T4 基准测试结果

单张 Titan RTX:

3412e727885070eb833f00e143348947.jpeg
TITAN RTX 基准测试结果

从上面的基准测试中,我们可以得出结论,对于这三款 GPU,GPTQ 都比 bitsandbytes 更快。

生成长度

在下面的基准测试中,我们将尝试不同的生成长度,看看它们对量化模型速度的影响。实验基于 A100,我们使用的提示长度为 30,并改变生成词元的长度。使用的模型是 meta-llama/Llama-2-7b-hf 。

生成 30 个词元:

e9326f6f819467ca8dc1d4ad423eaf90.png
A100 基准测试结果

生成 512 个词元:

aa5d1a702774f0db9140647db8006935.jpeg
生成 512 个词元的 A100 基准测试结果

从以上基准测试中,我们可以得出结论,无论生成长度如何,GPTQ 都比 bitsandbytes 更快。

适配器微调 (前向 + 后向)

对量化模型进行全模型微调是不可能的。但是,你可以利用参数高效微调 (PEFT) 来微调量化模型,在其之上训练新的适配器。我们使用一种名为“低秩适配器 (LoRA)”的微调方法: 无需微调整个模型,仅需微调这些适配器并将它们正确加载到模型中。我们来对比一下微调速度吧!

该基准测试基于英伟达 A100 GPU,我们使用 Hub 中的 meta-llama/Llama-2-7b-hf 模型。请注意,对于 GPTQ 模型,我们必须禁用 exllama 加速核,因为它不支持微调。

9cee905f992ef8b9b7a288ab700d2c34.png
A100 微调基准测试结果

从结果中,我们可以得出结论,bitsandbytes 的微调速度比 GPTQ 更快。

性能退化

量化对于减少内存消耗非常有用。然而,它也会带来性能退化。我们使用 Open-LLM 排行榜 来比较性能!

对于 7B 模型:

模型均值ARCHellaswagMMLUTruthfulQA
meta-llama/llama-2-7b-hf54.3253.0778.5946.8738.76
meta-llama/llama-2-7b-hf-bnb-4bit53.453.0777.7443.838.98
TheBloke/Llama-2-7B-GPTQ53.2352.0577.5943.9939.32

对于 13B 模型:

模型均值ARCHellaswagMMLUTruthfulQA
meta-llama/llama-2-13b-hf58.6659.3982.1355.7437.38
TheBloke/Llama-2-13B-GPTQ (revision = 'gptq-4bit-128g-actorder_True')58.0359.1381.4854.4537.07
TheBloke/Llama-2-13B-GPTQ57.5657.2581.6654.8136.56
meta-llama/llama-2-13b-hf-bnb-4bit56.958.1180.9754.3434.17

从上面的结果中,我们可以得出结论,模型越大,退化越少。更有意思的是,所有的退化都很小!

总结与最后的话

通过本文,我们比较了多种设置下的 bitsandbytes 和 GPTQ 量化。我们发现,bitsandbytes 更适合微调,而 GPTQ 更适合生成。根据这一观察,获得最佳合并模型的一种方法是:

  • (1) 使用 bitsandbytes 量化基础模型 (零样本量化)

  • (2) 添加并微调适配器

  • (3) 将训练后的适配器合并到基础模型或 反量化模型 之中!

  • (4) 使用 GPTQ 量化合并后的模型并将其用于部署

我们希望这个概述让每个人都能更轻松地将 LLM 应用至各自的应用场景中,我们期待看到大家用它构建自己的有趣应用!

致谢

我们要感谢 Ilyas、Clémentine 和 Felix 在基准测试上的帮助。

我们还要感谢 Pedro Cuenca 对本文撰写的帮助。

🤗 宝子们可以戳 阅读原文 查看文中所有的外部链接哟!


英文原文: https://hf.co/blog/overview-quantization-transformers

原文作者: Younes Belkada,Marc Sun,Ilyas Moutawwakil,Clémentine Fourrier,Félix Marty

译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理

审校/排版: zhongdongy (阿东)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/142825.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VScode不打开浏览器实时预览html

下载Microsoft官方的Live Preview就行了 点击预览按钮即可预览

深圳联强优创手持PDA身份证阅读器 身份证核验手持机

身份证手持机外观比较小巧,方便携带,支持条码识别、人脸识别、NFC卡刷卡、内置二代证加密模块,可离线采集和识别二代身份证,进行身份识别。信息读取更便捷、安全高效。采用IP65高防护等级,1.5M防摔,可以适应…

RFID汽车制造工业系统解决方案

随着物联网技术的不断发展,汽车行业的信息化水平也在不断提高,随着近几年国产汽车的带动,汽车配件配套市场也已形成了一定的规模,初步形成比较完整成熟的零部件配套体系。 RFID汽车制造工业系统解决方案 与其他行业对比&#xff0…

人工智能与发电玻璃:未来能源技术的融合

人工智能与发电玻璃:未来能源技术的融合 摘要:本文探讨人工智能与发电玻璃这两项技术的结合,共同推动能源领域的创新。本文将介绍发电玻璃工作原理及应用、人工智能在发电玻璃的应用领域以及共同为可持续能源发展做出贡献。 一、引言 随着科…

Android自定义控件:一款多特效的智能loadingView

先上效果图(如果感兴趣请看后面讲解): 1、登录效果展示 2、关注效果展示 1、【画圆角矩形】 画图首先是onDraw方法(我会把圆代码写上,一步一步剖析): 首先在view中定义个属性:priv…

虹科示波器 | 汽车免拆检修 | 2010款奥迪A5车怠速时发动机偶尔自动熄火

一、故障现象 一辆2010款奥迪A5车,搭载CDN发动机,累计行驶里程约为16.3万km。车主进厂反映,发动机怠速偶尔出现抖动,紧接着自动熄火;重新起动,发动机又能正常工作;故障频率较低,有时…

Elastcsearch入门案例之 —— 搜索聚合

前言 在前面的Mall项目脚手架整合中涉及到的Elasticsearch的内容仅仅只是在表面给出了一个在SpringBoot中的使用示例,但其实对于Elasticsearch的一些基础概念和底层的原理并没有过多的涉及,这种学习方式是浮躁的,所以这篇文章荔枝会对其中欠缺…

NSSCTF题库——web

[SWPUCTF 2021 新生赛]gift_F12 f12后ctrlf找到flag [SWPUCTF 2021 新生赛]jicao——json_decode() 加密后的格式 $json {"a":"php","b":"mysql","c":3}; json必须双引号传输 构造:GET里json{"x"…

蓝桥杯 冒泡排序

冒泡排序的思想 冒泡排序的思想是每次将最大的一下一下移动到最右边,然后将最右边这个确定下来。 再来确定第二大的,再确定第三大的… 对于数组a[n],具体来说,每次确定操作就是从左往右扫描,如果a[i]>a[i1],我们将…

Linux-AWK(应用最广泛的文本处理程序)

目录 一、awk基础 二、awk工作原理 三、OFS输出分隔符 四、awk的格式化输出 五、awk模式pattern 一、awk基础 使用案例: 1.准备工作 请在Linux中执行以下指令 cat -n /etc/passwd > ./passwd 练习: 1.从文件 passwd 中提取并打印出第五行的内…

基于混合蛙跳算法优化概率神经网络PNN的分类预测 - 附代码

基于混合蛙跳算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于混合蛙跳算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于混合蛙跳优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

《深入浅出进阶篇》洛谷P4147 玉蟾宫——悬线法dp

上链接:P4147 玉蟾宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P4147 上题干: 有一个NxM的矩阵,每个格子里写着R或者F。R代表障碍格子,F代表无障碍格子请找出其中的一个子矩阵&#xff0c…

金蝶云星空设置单据体行高

文章目录 金蝶云星空设置单据体行高表单插件Python脚本 金蝶云星空设置单据体行高 表单插件 新建类继承AbstractBillPlugIn,重写OnInitialize方法进行设置 public override void OnInitialize(InitializeEventArgs e){base.OnInitialize(e);this.View.GetControl&…

卡尔曼滤波器第 1 部分 - 简介

一、说明 这是卡尔曼滤波器系列的第一部分。但这并不是另一本定义繁重的读物,它会给你带来一堆行话和方程式!在本文中,我们首先关注需要解决方案的问题(当然是卡尔曼滤波器),然后直观地了解卡尔曼滤波器。只…

CDN加速技术:节点部署的专业指南

随着互联网的迅猛发展,网站的访问量也在不断增加。为了提供更快、更稳定的用户体验,许多网站都采用了剑盾上云CDN(内容分发网络)技术。在CDN加速中,节点的合理部署是关键一环,决定了加速效果的优劣。本文将…

美国通胀预期高企,现货黄金价格继续承压下滑

上周五现货黄金持续振荡下滑,金价失守1940美元关口,最低至1933.17美元/盎司,最终收跌1.09%,报1936.51美元/盎司,创10月17日以来新低;今日(周一)截止汉声集团分析师发稿前&#xff0c…

python趣味编程-使用 Tkinter 的数字到单词转换器

数字到单词转换器应用程序是用Python编程语言编写的。该项目包含演示数字到单词转换的编码脚本。在 Python 中使用 Tkinter 的数字到单词转换器应用程序是一个应用程序,其主要目的是将您输入的数字转换为单词。数字到单词转换器应用程序提供学习资源,帮助您更好地了解Python编…

【python自动化】Playwright基础教程(五)事件操作②悬停输入清除精讲

【python自动化】Playwright基础教程(五)事件操作②悬停&输入&清除精讲 本章目录 文章目录 【python自动化】Playwright基础教程(五)事件操作②悬停&输入&清除精讲鼠标悬停 - hover鼠标悬停实战 输入内容 - fill输入内容实战清空内容实战 输入内容 - type模拟…

CSS省略号n行公式

记得改图中的n,这是你需要的几行省略号!复制中间的5行就行了。 .text {overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: n; //n为你想省略的行数,需要改-webkit-box-orient: vertical; } 这是…

单链表(8)

单链表的特点 可以发现,在单链表的for循环里,初始化就总结为这两种情况 上图中 用第一条(要改变链表的结构,增加,减少结点个数等)的有:尾插,插入,删除pos位置值&#x…
最新文章