Press "Enter" to skip to content

使用AutoGPTQ和transformers来使LLMs更轻量

大型语言模型展示了在理解和生成类似人类文本方面的出色能力,彻底改变了各个领域的应用。然而,它们对于训练和部署的消费者硬件的需求变得越来越具有挑战性。

🤗 Hugging Face的核心使命是普及良好的机器学习,这包括尽可能使大型模型对所有人都可访问。在与bitsandbytes合作的同样精神下,我们刚刚在Transformers中集成了AutoGPTQ库,使用户能够使用GPTQ算法(Frantar等人,2023年)将模型量化为8、4、3甚至2位精度并运行。4位量化的准确度几乎没有下降,并且在小批量大小的推理速度上与fp16基准相当。请注意,GPTQ方法与bitsandbytes提出的事后训练量化方法略有不同,因为它需要通过校准数据集。

这个集成适用于Nvidia GPU和RoCm-powered AMD GPU。

目录

  • 资源
  • GPTQ论文的简要摘要
  • AutoGPTQ库 – 用于高效利用GPTQ的一站式库
  • 🤗 Transformers中对GPTQ模型的本机支持
  • 使用Optimum库对模型进行量化
  • 通过文本生成推理运行GPTQ模型
  • 使用PEFT对量化模型进行微调
  • 改进的空间
    • 支持的模型
  • 结论和最后的话
  • 致谢

资源

这篇博文和发布附带了一些资源,帮助您开始使用GPTQ量化:

  • 原始论文
  • 基本用法的Google Colab笔记本 – 该笔记本展示了如何使用GPTQ方法量化您的transformers模型,如何进行推理以及如何使用量化模型进行微调。
  • Transformers集成文档
  • Optimum集成文档
  • 具有兼容GPTQ模型的The Bloke存储库。

GPTQ论文的简要摘要

量化方法通常属于以下两类:

  1. 事后训练量化(PTQ):我们使用适度的资源对预训练模型进行量化,例如校准数据集和几小时的计算。
  2. 量化感知训练(QAT):在训练或进一步微调之前进行量化。

GPTQ属于PTQ类别,对于庞大的模型来说,这特别有意义,因为完整的模型训练甚至微调都可能非常昂贵。

具体而言,GPTQ采用了混合int4/fp16量化方案,其中权重被量化为int4,而激活保持为float16。在推理过程中,权重会动态解量化,并在float16上执行实际计算。

这个方案的好处有两个:

  • int4量化时接近x4的内存节省,因为解量化接近计算单元在一个融合内核中进行,而不是在GPU全局内存中进行。
  • 由于使用较低的位宽来处理权重,数据通信所节省的时间可能导致加速。

GPTQ论文解决了逐层压缩问题:

给定带有权重矩阵WlW_{l}Wl​和层输入XlX_{l}Xl​的层lll,我们希望找到权重W^l\hat{W}_{l}W^l​的量化版本,以最小化均方误差(MSE):

W^l∗=argminWl^∥WlX−W^lX∥22{\hat{W}_{l}}^{*} = argmin_{\hat{W_{l}}} \|W_{l}X-\hat{W}_{l}X\|^{2}_{2}W^l​∗=argminWl​^​​∥Wl​X−W^l​X∥22​

一旦每个层面的问题得到解决,通过合并逐层解决方案可以得到全局问题的解决方案。

为了解决这个逐层压缩问题,作者使用了最优脑量化框架(Frantar等人,2022年)。OBQ方法从以下观察开始,即上述方程可以写成WlW_{l}Wl​的每一行的平方误差之和。

这意味着我们可以独立地量化每一行,这称为通道内量化。对于每一行Wl[i,:]W_{l[i,:]}Wl[i,:]​,OBQ逐个量化一个权重,同时始终更新尚未量化的所有权重,以补偿量化单个权重所产生的误差。所选权重的更新具有闭合形式的公式,利用Hessian矩阵。

GPTQ论文通过引入一组优化方法改进了这个框架,这些方法降低了量化算法的复杂性,同时保持了模型的准确性。

与OBQ相比,GPTQ的量化步骤本身也更快:使用OBQ将一个BERT模型(336M)量化需要2个GPU小时,而使用GPTQ,一个Bloom模型(176B)可以在不到4个GPU小时内量化。

要了解有关确切算法和不同困惑度和加速比的基准测试的更多信息,请查看原始论文。

AutoGPTQ库-高效利用GPTQ进行LLM的一站式库

AutoGPTQ库使用户能够使用GPTQ方法量化🤗 Transformers模型。虽然并行社区努力,如GPTQ-for-LLaMa、Exllama和llama.cpp,严格实现了Llama体系结构的量化方法,但AutoGPTQ通过对各种Transformer体系结构的平滑覆盖而受到广泛关注。

由于AutoGPTQ库覆盖了更多的Transformer模型,我们决定提供一个集成的🤗 Transformers API,使LLM量化更加易于使用。目前,我们已经集成了最常见的优化选项,例如CUDA内核。有关Triton内核或融合注意力兼容性等更高级选项,请查看AutoGPTQ库。

🤗 Transformers中对GPTQ模型的本机支持

安装AutoGPTQ库和optimumpip 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集成具有许多优点:

  • 量化模型可序列化,并可在Hub上共享。
  • GPTQ大大降低了运行LLM所需的内存需求,而推理延迟与FP16推理持平。
  • AutoGPTQ支持各种体系结构的Exllama内核。
  • 集成支持AMD GPU的本机RoCm支持。
  • 可用PEFT进行微调。

您可以在Hub上查看您喜欢的模型是否已经量化。Hugging Face的顶级贡献者之一TheBloke使用AutoGPTQ量化了许多模型,并在Hugging Face Hub上共享了它们。我们共同努力,确保这些存储库与我们的集成开箱即用。

这是批量大小为1的基准样本。该基准测试在单个NVIDIA A100-SXM4-80GB GPU上运行。我们使用512的提示长度,并生成了恰好512个新标记。第一行是未量化的fp16基准,而其他行显示了使用不同AutoGPTQ内核的内存消耗和性能。

一个更全面可复现的基准测试在这里。

使用 Optimum 库对模型进行量化

为了将 AutoGPTQ 与 Transformers 无缝集成,我们使用了 Optimum 的精简版 AutoGPTQ API,Optimum 是 Hugging Face 的训练和推理优化工具包。通过采用这种方法,我们实现了与 Transformers 的轻松集成,同时允许用户在需要时使用 Optimum API 来量化他们自己的模型!如果您想要对自己的 LLMs 进行量化,请查看 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 小时。如上所述,Hugging Face Hub 上已经有许多 GPTQ 模型可用,这就避免了在大多数情况下自己进行模型量化的需求。然而,您也可以使用适合您所从事领域的特定数据集来量化模型。

通过文本生成推理运行 GPTQ 模型

在将 GPTQ 集成到 Transformers 中的同时,还将 GPTQ 支持添加到了 Text-Generation-Inference 库(TGI),该库旨在为生产环境中的大型语言模型提供服务。GPTQ 现在可以与动态批处理、分页注意力和闪电注意力等特性一起使用,适用于各种架构。

作为一个例子,这种集成使得可以在单个 A100-80GB GPU 上服务于一个 70B 的模型!使用 fp16 检查点是不可能的,因为它超出了可用的 GPU 内存。

您可以在文档中了解有关在 TGI 中使用 GPTQ 的更多信息。

请注意,TGI 中集成的内核在更大的批处理大小上不太可伸缩。虽然这种方法节省了内存,但在更大的批处理大小下预计会出现减速现象。

使用 PEFT 对量化模型进行微调

您不能使用常规方法对量化模型进行进一步训练。然而,通过利用 PEFT 库,您可以在其上训练适配器!为此,我们冻结量化模型的所有层,并添加可训练的适配器。以下是如何使用 GPTQ 模型与 PEFT 的一些示例:colab notebook 和 finetuning script。

改进空间

我们的 AutoGPTQ 集成已经在预测质量上以较小的代价带来了令人印象深刻的好处。还有改进的空间,无论是在量化技术还是内核实现方面。

首先,虽然 AutoGPTQ(据我们所知)与 exllama 实现的最高性能 W4A16 内核(将权重作为 int4,激活作为 fp16)集成得很好,但内核仍有改进的可能性。Kim 等人和 MIT Han Lab 还有其他有前途的实现。此外,从内部基准测试中得知,目前似乎还没有使用 Triton 编写的开源高性能 W4A16 内核,这可能是一个值得探索的方向。

在量化方面,让我们再次强调,这种方法只对权重进行量化。已经提出了其他 LLM 量化方法,可以以较小的预测质量成本量化权重和激活,例如可以使用混合 int4/int8 方案的 LLM-QAT,以及对键值缓存进行量化。这种技术的一个强大优势是能够使用实际的整数计算,例如 Nvidia Tensor Cores 支持 int8 计算。然而,据我们所知,目前还没有开源的 W4A8 量化内核可用,但这可能是一个有趣的探索方向。

在内核方面,为更大的批次大小设计高性能的W4A16内核仍然是一个未解决的挑战。

支持的模型

在这个最初的实现中,只支持具有解码器或编码器架构的大型语言模型。这听起来可能有些限制,但它包括了大多数尖端的LLM模型,如Llama、OPT、GPT-Neo和GPT-NeoX。

目前不支持非常大的视觉、音频和多模态模型。

结论和最后的话

在这篇博文中,我们介绍了将AutoGPTQ库集成到Transformers中的方法,使得可以使用GPTQ方法对LLMs进行量化,使它们更易于社区中的任何人使用,并赋予他们使用LLMs构建令人激动的工具和应用的能力。

这个集成对于Nvidia GPU和RoCm驱动的AMD GPU都可用,这是向更广泛的GPU架构普及量化模型的重要一步。

与AutoGPTQ团队的合作非常富有成果,我们非常感激他们对这个库的支持和工作。

我们希望这个集成将使每个人在他们的应用中更容易使用LLMs,并期待看到您用它构建的内容!

不要错过上面共享的有关集成和如何快速开始使用GPTQ量化的有用资源。

  • 原文
  • 基本用法的Google Colab笔记本-这个笔记本展示了如何使用GPTQ方法量化您的transformers模型,如何进行推理,以及如何使用量化模型进行微调。
  • Transformers集成文档
  • Optimum集成文档
  • 带有兼容GPTQ模型的The Bloke仓库。

致谢

我们要感谢William对令人惊叹的AutoGPTQ库的支持和工作,以及他在集成中的帮助。我们还要感谢TheBloke在使用AutoGPTQ量化许多模型并在Hub上分享它们方面的工作,以及他在集成中的帮助。我们还要感谢qwopqwop200对AutoGPTQ库的持续贡献,以及他在扩展库以适用于即将发布的AutoGPTQ的CPU版本方面的工作。

最后,我们要感谢Pedro Cuenca对这篇博文的撰写帮助。

Leave a Reply

Your email address will not be published. Required fields are marked *