在大模型(LLM)的时代,我们需要了解量化技术,以便在本地电脑上运行这些模型,因为它们的规模非常庞大。然而,实现量化的方法有很多,这让像我这样的初学者很容易感到困惑。本文介绍了我们必须掌握的主要量化技术,并附带了如何在 Google Colab 环境中实现它们的源码。
一、量化概述
量化是一种将浮点数映射为低位整数的技术。它在减少 LLM 的模型大小和推理成本方面非常有效。例如,当我们将一个大约 4 × 7B = 28GB(float32)的 7B 模型量化为 float16 时,大小可以减少到 2 × 7B = 14GB。如果进一步将 float32 量化为 int8,模型大小甚至可以降至 1 × 7B = 7GB!
下图展示了 LLM 中常见的数据类型数据类型的位表示。
那么,我们究竟如何减少位宽呢?答案是通过 “舍入”(rounding)将数值从一种数据类型转换为另一种。为了更直观地理解量化的概念,我们将学习两种基本的舍入方法:零点量化(Zero-point quantization)和绝对最大值量化(Absolute maximum quantization)。
零点量化(Zero-point quantization)
零点量化通过线性映射,将原始数据的最小值和最大值对应到目标数据类型的最小值和最大值。例如,当我们将 FP16 数值转换为 Int8 时,就会用到这种量化方法。下图展示了这一过程。
我们希望将数据缩放到 Int8 范围(在本例中为 0 ~ 255)。因此,我们需要计算数据在原始尺度中的相对值,并通过乘以 Int8 量化范围(255)来进行重新缩放。其计算公式如下所示:
其中,n 是用于量化的位数(在本例中为 8)。需要注意的是,如果我们希望将数值缩放到 -127 ~ 127,则需要从上述结果中减去 127,然后对结果进行舍入。
这种方法比其他量化方法能够更精确地表示原始数据。但另一方面,它需要更复杂的计算,因此在实际应用中,我们需要在精度和计算复杂度之间进行权衡。
绝对最大值量化(Absolute Maximum Quantization)
绝对最大值量化(Absolute Maximum Quantization)将原始数据中的最大绝对值映射到目标数据类型的有符号范围。仍然以 FP16 到 Int8 的转换为例。为了简化问题,我们使用受限的量化范围,即 -127 ~ 127(供参考,完整的量化范围是 -128 ~ 127)。下图展示了这种量化方法。
我们首先计算数据中的最大绝对值,然后利用该值对原始数据进行重新缩放。其计算公式如下所示:
这种方法在计算上比零点量化更简单。然而,它容易受到数据中离群值(outliers)的影响,因此在使用时需要仔细检查数据是否适合这种方法。
这些方法都属于 “舍入至最近值”(Round-to-Nearest, RTN) 量化技术。
然而,朴素量化(naive quantization) 存在精度下降的问题,因为减少位数的同时,也会丢失部分信息。因此,现代量化技术的目标是在减少位宽的同时尽可能降低精度损失。目前,主要有两种主流的现代量化技术:
1、 量化感知训练(Quantization Aware Training, QAT)
QAT 允许在量化模型的同时进行微调(fine-tuning),以恢复因量化导致的精度下降。相比于后训练量化(PTQ,见下文),QAT 可以更好地保持模型的准确性,但它通常需要额外的训练,并且计算成本较高,例如需要 A100 或 H100 等高性能计算资源。
2、 后训练量化(Post-Training Quantization, PTQ)
PTQ 允许对预训练模型进行量化,而无需额外训练。因此,它可以减少量化过程中对 GPU 显存(VRAM)的需求,是更具实用性的解决方案。近年来,研究人员在这一方向上投入了大量研究,开发了许多高效的 PTQ 方法。
在本博客中,我们将学习以下流行的量化技术:
-
GPTQ(Group-wise Precision Tuning Quantization)
-
AWQ(Activation-aware Weight Quantization)
-
Bitsandbytes(QLoRA)
其中,GPTQ 和 AWQ 属于 PTQ 方法,而 QLoRA 属于 QAT 方法。这些算法已经集成到 transformers 库中,因此用户可以高效地使用它们。在接下来的部分,我们将简要介绍这些算法的理论基础。
二、 GPTQ
GPTQ(Group-wise Precision Tuning Quantization,分组精确调整量化)是2022 年提出的早期成功的量化算法之一。当时,该技术首次成功地将 BLOOM 或 OPT-175B 等 175B 规模的大模型量化为 4-bit。
GPTQ 采用逐行量化(per-row quantization),即独立地量化权重矩阵的每一行,以找到最优的量化权重,从而最小化量化误差。
为了实现高精度量化,GPTQ 利用 Hessian 矩阵计算剩余权重的最优更新,从而减少量化带来的信息损失。需要注意的是,GPTQ 保留嵌入层(embedding layer)和输出层(output layer)为 FP16 以维持模型精度。
下面的伪代码描述了 GPTQ 算法的工作原理:
根据论文,使用单个 A100 GPU(80GB VRAM)大约需要四个小时就可以量化 175B 参数模型。OPT-175B 的量化结果如下表所示。
困惑度(perplexity)衡量模型预测句子中下一个单词的能力。因此,困惑度值降低,这意味着模型对其预测更有信心。在上表中,与 16 位精度相比,通过 GPTQ 量化的模型将困惑度值的增加保持在尽可能小的水平。
三、AWQ
AWQ(Activation-aware Weight Quantization,激活感知权重量化)最近是最流行的量化算法之一。该算法侧重于对 LLM 性能非常重要的显著权重。作者的研究表明,LLM 的权重比例很小(0.1~1%),对量化误差有显著影响。他们利用激活幅度来找到这一小部分权重,并应用每通道缩放来减轻显著权重的量化误差。此过程的说明如下图 © 所示。
下表展示了 Llama-2 和 LLaMA 模型的 AWQ 结果。从中可以看出,AWQ 可以获得比舍入到最近 (RTN) 量化和 GPTQ 更好的困惑度。
请注意,根据论文,对于某些模型(例如 Mistral 模型和指令调整模型),AWQ 有时不如 GPTQ。当我们量化 LLM 时,我们应该比较这些算法的结果并选择最佳算法。
四、BitsandBytes
BitsandBytes 是一个将模型量化为 8 位或 4 位的量化库。由于其方便性和有效性,它是最常见的量化库。
BitsandBytes 的 8 位量化基于 LLM.int8() 论文。为了减轻量化误差,它将模型权重的敏感异常值保留在 FP16 中,将其他异常值保留在 INT8 中,然后分别进行矩阵乘法。最后,将它们相加以返回 FP16 格式。下图显示了此过程。
该技术可应用于高达 170B 规模的模型,但运行 170B 模型仍需要 8 x 24GB VRAM,运行 66B 模型则需要 4 x 24GB VRAM。在消费级 GPU 上运行大型模型仍然不够。
因此,开发了 4 位量化来解决这个问题。Bitsandbytes 的 4 位量化通常与 QLoRA 一起使用,以微调量化后的 LLM。直观地说,QLoRA 以 4 位量化目标模型,使其冻结,然后使用 LoRA 对冻结的 4 位模型进行微调。以下是完全微调、LoRA 和 QLoRA 之间的比较。
从技术上讲,QLoRA 主要利用了以下特性。
-
4 位 NormalFloat 量化
该技术利用了预训练的神经网络权重具有正态分布的事实,并引入了称为 4 位 NormalFloat 类型的新数据类型,这确保了每个量化箱中的预期值数量相等。
-
分页优化器
QLoRA 应用分页优化器来避免 GPU 内存突然激增。分页优化器使用 NVIDIA 统一内存功能自动在 CPU 和 GPU 之间切换页面到页面的传输(在这种情况下,你可以想象 GPU 页面类似于内存中的 CPU 页面)。
-
双重量化
当你将量化应用于模型权重时,你需要与模型权重具有相同数据类型的量化常数。由于 LLM 中有许多参数,量化常数也会给内存空间带来负担。为了最大限度地减少每个参数的内存占用,作者对量化常数进行了量化。
下表显示了参数大小与 GPU VRAM 消耗的关系。
请注意,内存列显示模型的内存需求,因此它不包含微调部分。虽然这取决于数据集或超参数设置,但我们可以使用消费级 24GB VRAM 机器微调多达 13B 参数模型。
当零样本 LLM 精度不足以完成我们的目标任务时,我们应该使用 QLoRA。对于现实世界的 AI 项目,我们经常使用这种技术,因为基础模型通常不适用于特定的现场数据。
五、Unsloth
虽然 Unsloth 不是量化方法,但我想介绍这个用于 LLM 的开源超高效微调库。Unsloth 是一个完全集成参数高效微调方法(如 LoRA 和 QLoRA)的库。它针对开源著名 LLM 优化了每个内核,并减少了高达约 80% 的内存使用率!例如,它支持DeepSeek-R1、Llama、Mistral、Phi、Qwen 和 Gemma 这些开源 LLM。
Unsloth 与 HuggingFace 和 vllm 兼容,我们可以在它们之间互换格式。当模型受支持时,我们应该使用 Unsloth 来节省内存并提高性能。
就在最近(2024 年 12 月 4 日),Unsloth 发布了一种新的量化方法,称为 Unsloth — 动态 4 位量化(Dynamic 4-bit quantization)。该技术建立在 BitsandBytes 4 位量化之上,并确定是否动态量化某些参数。
到目前为止,我们已经看到了流行的量化技术和库。总之,我们可以在以下情况下使用这些量化技术。
-
想在零样本设置中使用 LLM → GPTQ 或 AWQ
-
想使用带有自己数据的微调 LLM → QLoRA(BitsandBytes 或 Unsloth)
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。