共计 5992 个字符,预计需要花费 15 分钟才能阅读完成。
大语言模型在了解和生成人类程度的文字方面所展现出的不凡能力,正在许多畛域带来利用上的变革。然而,在生产级硬件上训练和部署大语言模型的需要也变得越来越难以满足。
🤗 Hugging Face 的外围使命是 让优良的机器学习普惠化 ,而这正包含了尽可能地让所有人都可能应用上大模型。本着 与 bitsandbytes 单干 一样的精力,咱们将 AutoGPTQ 代码库集成到了 Transformers 中,让用户应用 GPTQ 算法 (Frantar et al. 2023) 在 8 位、4 位、3 位,甚至是 2 位精度下量化和运行模型成为可能。当应用 int4 量化时,精度的降落能够忽略不计,同时在小批量推理上放弃着与 fp16
基线相当的速度。须要留神的是,GPTQ 办法与 bitsandbytes 提出的训练后量化办法有所不同: 它须要在量化阶段提供一个校准数据集。
本次集成反对英伟达 GPU 和基于 RoCm 的 AMD GPU。
目录
- 相干资源
- GPTQ 论文总结
- AutoGPTQ 代码库——一站式地将 GPTQ 办法利用于大语言模型
- 🤗 Transformers 对 GPTQ 模型的本地化反对
- 应用 Optimum 代码库 量化模型
- 通过 Text-Generation-Inference 应用 GPTQ 模型
- 应用 PEFT 微调量化后的模型
-
改良空间
- 已反对的模型
- 论断和结语
- 致谢
相干资源
本文及相干版本公布提供了一些资源来帮忙用户开启 GPTQ 量化的旅程:
- 原始论文
- 运行于 Google Colab 笔记本上的根底用例 —— 该笔记本上的用例展现了如何应用 GPTQ 办法量化你的 transformers 模型、如何进行量化模型的推理,以及如何应用量化后的模型进行微调。
- Transformers 中集成 GPTQ 的 阐明文档
- Optimum 中集成 GPTQ 的 阐明文档
- TheBloke 模型仓库 中的 GPTQ 模型。
GPTQ 论文总结
通常,量化办法能够分为以下两类:
- 训练后量化 (Post Training Quantization, PTQ): 适度地应用一些资源来量化预训练好的模型,如一个校准数据集和几小时的算力。
- 量化感知训练 (Quantization Aware Training, QAT): 在训练或进一步微调之前执行量化。
GPTQ 属于训练后量化,这对于大模型而言分外乏味且有意义,因为对其进行全参数训练以及甚至仅仅是微调都非常低廉。
具体而言,GPTQ 采纳 int4/fp16 (W4A16) 的混合量化计划,其中模型权重被量化为 int4 数值类型,而激活值则保留在 float16。在推理阶段,模型权重被动静地反量化回 float16 并在该数值类型下进行理论的运算。
该计划有以下两方面的长处:
- int4 量化可能节俭靠近 4 倍的内存,这是因为反量化操作产生在算子的计算单元左近,而不是在 GPU 的全局内存中。
- 因为用于权重的位宽较低,因而能够节俭数据通信的工夫,从而潜在地晋升了推理速度。
GPTQ 论文解决了分层压缩的问题:
给定一个领有权重矩阵 $W_{l}$ 和输出 $X_{l}$ 的网络层 $l$,咱们冀望取得一个量化版本的权重矩阵 $\hat{W}_{l}$ 以最小化均方误差 (MSE):
$${\hat{W}_{l}}^{*} = argmin_{\hat{W_{l}}} \|W_{l}X-\hat{W}_{l}X\|^{2}_{2}$$
一旦每层都实现了上述指标,就能够通过组合各网络层量化后果的形式来取得一个残缺的量化模型。
为解决这一分层压缩问题,论文作者采纳了最优脑量化 (Optimal Brain Quantization, OBQ) 框架 (Frantar et al 2022)。OBQ 办法的出发点在于其察看到: 以上等式能够改写成权重矩阵 $W_{l}$ 每一行的平方误差之和
$$ \sum_{i=0}^{d_{row}} \|W_{l[i,:]}X-\hat{W}_{l[i,:]}X\|^{2}_{2} $$
这意味着咱们能够独立地对每一行执行量化。即所谓的 per-channel quantization。对每一行 $W_{l[i,:]}$,OBQ 在每一时刻只量化一个权重,同时更新所有未被量化的权重,以弥补量化单个权重所带来的误差。所选权重的更新采纳一个闭环公式,并利用了海森矩阵 (Hessian Matrices)。
GPTQ 论文通过引入一系列优化措施来改良上述量化框架,在升高量化算法复杂度的同时保留了模型的精度。
相较于 OBQ,GPTQ 的量化步骤自身也更快: OBQ 须要破费 2 个 GPU 时来实现 BERT 模型 (336M) 的量化,而应用 GPTQ,量化一个 Bloom 模型 (176B) 则只需不到 4 个 GPU 时。
为理解算法的更多细节以及在困惑度 (perplexity, PPL) 指标和推理速度上的不同测评数据,可查阅原始 论文。
AutoGPTQ 代码库——一站式地将 GPTQ 办法利用于大语言模型
AutoGPTQ 代码库让用户可能应用 GPTQ 办法量化 🤗 Transformers 中反对的大量模型,而社区中的其余平行工作如 GPTQ-for-LLaMa、Exllama 和 llama.cpp 则次要针对 Llama 模型架构实现量化策略。相较之下,AutoGPTQ 因其对丰盛的 transformers 架构的平滑笼罩而广受欢迎。
正因为 AutoGPTQ 代码库笼罩了大量的 transformers 模型,咱们决定提供一个 🤗 Transformers 的 API 集成,让每个人都可能更容易地应用大语言模型量化技术。截止目前,咱们曾经集成了包含 CUDA 算子在内的最罕用的优化选项。对于更多高级选项如应用 Triton 算子和 (或) 兼容注意力的算子交融,请查看 AutoGPTQ 代码库。
🤗 Transformers 对 GPTQ 模型的本地化反对
在 装置 AutoGPTQ 代码库 和 optimum
(pip install optimum
) 之后,在 Transformers 中运行 GPTQ 模型将非常简单:
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("TheBloke/Llama-2-7b-Chat-GPTQ", torch_dtype=torch.float16, device_map="auto")
请查阅 Transformers 的 阐明文档 以理解无关所有个性的更多信息。
咱们的 AutoGPTQ 集成有以下诸多长处:
- 量化模型可被序列化并在 Hugging Face Hub 上分享。
- GPTQ 办法大大降低运行大语言模型所需的内存,同时放弃着与 FP16 相当的推理速度。
- AutoGPTQ 在更宽泛的 transformers 架构上反对 Exllama 算子。
- 该集成带有基于 RoCm 的 AMD GPU 的本地化反对。
- 可能 应用 PEFT 微调量化后的模型 。
你能够在 Hugging Face Hub 上查看你所青睐的模型是否曾经领有 GPTQ 量化版本。TheBloke,Hugging Face 的顶级贡献者之一,曾经应用 AutoGPTQ 量化了大量的模型并分享在 Hugging Face Hub 上。在咱们的共同努力下,这些模型仓库都将能够与咱们的集成一起开箱即用。
以下是一个应用 batch size = 1 的测评后果示例。该测评后果通过在英伟达 A100-SXM4-80GB GPU 上运行失去。咱们应用长度为 512 个词元的提醒文本,并准确地生成 512 个新词元。表格的第一行展现的是未量化的 fp16
基线,另外两行则展现应用 AutoGPTQ 不同算子的内存开销和推理性能。
gptq | act_order | bits | group_size | kernel | Load time (s) | Per-token latency (ms) | Throughput (tokens/s) | Peak memory (MB) |
---|---|---|---|---|---|---|---|---|
False | None | None | None | None | 26.0 | 36.958 | 27.058 | 29152.98 |
True | False | 4 | 128 | exllama | 36.2 | 33.711 | 29.663 | 10484.34 |
True | False | 4 | 128 | autogptq-cuda-old | 36.2 | 46.44 | 21.53 | 10344.62 |
一个更全面的、可复现的测评后果能够在这里 获得。
应用 Optimum 代码库 量化模型
为了将 AutoGPTQ 无缝集成到 Transformers 中,咱们应用了 AutoGPTQ API 的一个极简版本,其可在 Optimum 中取得 —— 这是 Hugging Face 针对训练和推理优化而开发的一个工具包。通过这种形式,咱们轻松地实现了与 Transformers 的集成,同时,如果人们想要量化他们本人的模型,他们也齐全能够独自应用 Optimum 的 API!如果想要量化你本人的大语言模型,请查阅 Optimum 的 阐明文档。
只需数行代码,即可应用 GPTQ 办法量化 🤗 Transformers 的模型:
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig
model_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id)
quantization_config = GPTQConfig(bits=4, dataset = "c4", tokenizer=tokenizer)
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", quantization_config=quantization_config)
量化一个模型可能破费较长的工夫。对于一个 175B 参数量的模型,如果应用一个大型校准数据集 (如“c4”),至多须要 4 个 GPU 时。正如下面提到的那样,许多 GPTQ 模型曾经能够在 Hugging Face Hub 上被获得,这让你在大多数状况下无需自行量化模型。当然,你仍能够应用你所专一的特定畛域的数据集来量化模型。
通过 Text-Generation-Inference 应用 GPTQ 模型
在将 GPTQ 集成到 Transformers 中的同时,Text-Generation-Inference 代码库 (TGI) 曾经增加了 GPTQ 的反对,旨在为生产中的大语言模型提供服务。当初,GPTQ 曾经能够与动静批处理、paged attention、flash attention 等个性一起被利用于 宽泛的 transformers 模型架构。
例如,这一集成容许在单个 A100-80GB GPU 上服务 70B 模型!而这在应用 fp16 的模型权重时是不可能的,因为它超出了最大可用的 GPU 内存。
你能够在 TGI 的 阐明文档 中找到更多无关 GPTQ 的用法。
须要留神的时,TGI 中集成的算子不能很好地扩大到较大的批处理大小。因而,这一形式尽管节俭了内存,但在较大的批处理大小上产生速度的降落是合乎预期的。
应用 PEFT 微调量化后的模型
在惯例的办法下,你无奈进一步微调量化后的模型。然而,通过应用 PEFT 代码库,你能够在量化后的模型之上训练适应性网络!为实现这一指标,咱们解冻了量化过的基座模型的所有网络层,并额定增加可训练的适应性网络。这里是一些对于如何应用 PEFT 训练 GPTQ 模型的例子: Colab 笔记本 和 微调脚本。
改良空间
尽管咱们的 AutoGPTQ 集成在极小的预测品质损失代价下,带来了引人瞩目的劣势。但在量化技术利用和算子实现方面仍有晋升的空间。
首先,只管 AutoGPTQ (在咱们的认知范畴内) 曾经集成了 exllama 中所实现的最佳性能的 W4A16 算子 (权重为 int4 数值类型,激活值为 fp16 数值类型),其仍有很大的改良空间。来自 Kim 等人 的实现和 MIT Han Lab 的办法仿佛非常牢靠。此外,依据咱们的外部测评,仿佛暂未有开源的高性能的 Triton 版本的 W4A16 算子实现,这也是一个值得摸索的方向。
在量化层面,咱们须要再次强调 GPTQ 办法只对模型权重进行量化。而针对大语言模型的量化,存在其余的办法,提供了以较小的预测品质损失为代价,同时量化权重和激活值的计划。如 LLM-QAT 采纳 int4/int8 的混合精度计划,同时还对 KV Cache 实施量化。这一技术的弱小长处是能理论应用整数运算算法来进行计算,一个例子是 英伟达的张量外围反对 int8 计算。然而,据咱们所知,目前暂无开源的 W4A8 量化算子,但这可能是一个 值得摸索的方向。
在算子层面,为更大的批处理大小设计高性能的 W4A16 算子依然是一大挑战。
已反对的模型
在初始实现中,临时只反对纯编码器或纯解码器架构的大语言模型。这听起来仿佛有较大的局限性,但其实曾经涵盖了以后绝大多数最先进的大语言模型,如 Llama、OPT、GPT-Neo、GPT-NeoX 等。
大型的视觉、语音和多模态模型在现阶段暂不被反对。
论断和结语
本文中,咱们介绍了 Transformers 对 AutoGPTQ 代码库 的集成,使得社区中的任何人都能够更不便地利用 GPTQ 办法量化大语言模型,助力令人激动的大语言模型工具和利用的构建。
这一集成反对英伟达 GPU 和基于 RoCm 的 AMD GPU,这是向反对更宽泛 GPU 架构的量化模型的普惠化迈出的一大步。
与 AutoGPTQ 团队的单干十分富有成效,咱们非常感谢他们的反对和他们在该代码库上的工作。
咱们心愿本次集成将使每个人都更容易地在他们的应用程序中应用大语言模型,咱们急不可待地想要看到大家行将应用它所发明出的所有!
再次揭示不要错过文章结尾分享的有用资源,以便更好地了解本次集成的个性以及如何疾速开始应用 GPTQ 量化。
- 原始论文
- 运行于 Google Colab 笔记本上的根底用例 —— 该笔记本上的用例展现了如何应用 GPTQ 办法量化你的 transformers 模型、如何进行量化模型的推理,以及如何应用量化后的模型进行微调。
- Transformers 中集成 GPTQ 的 阐明文档
- Optimum 中集成 GPTQ 的 阐明文档
- TheBloke 模型仓库 中的 GPTQ 模型。
致谢
感激 潘其威 对卓越的 AutoGPTQ 代码库的反对和所作的工作,以及他对本次集成的帮忙。
感激 TheBloke 应用 AutoGPTQ 量化大量的模型并分享在 Hugging Face Hub 上,以及他在本次集成中所提供的帮忙。
感激 qwopqwop200 对 AutoGPTQ 代码库的继续奉献,目前,他正致力于将该代码库的应用场景拓展至 CPU,这一个性将在 AutoGPTQ 的下一版本中公布。
最初,咱们还要感激 Pedro Cuenca 对本文的撰写所提供的帮忙。
英文原文: <url>https://hf.co/blog/gptq-integration</url>
原文作者: Marc Sun, Félix Marty, 潘其威, Junjae Lee, Younes Belkada, Tom Jobbins
译者: 潘其威
审校 / 排版: zhongdongy (阿东)