模型量化技术
·
LLM应用系列文章目录
第一章 GeminiCLI与Repomix
第二章 MinerU与BabelDOC与KTransformers与OpenAI API库
第三章 应用工具之 MRKL 与零次学习
第四章 模型量化技术
前言
本文主要整理模型量化技术相关内容,包括模型量化的概念、浮点数与整数精度、模型大小计算、训练时量化与训练后量化、GPTQ、AutoGPTQ、bitsandbytes 以及 AWQ 等技术。
模型量化技术
一、模型量化
1.模型量化
- 模型量化(Quantization)是用来减少模型大小和提高模型运行速度的技术。
- 默认情况下,模型使用32位浮点数进行所有预测计算,这使得模型非常大。但是可以通过进行一些舍入操作,基本上达到接近正确的答案,这样可以在不损失太多精度的情况下,使模型变得更小。
- 词语;【quantization 量化n】【quantify 量化v/大量n】 【quant数量n】【quality 质量n】
2.实例:
- 假设模型参数都是从0到1的之间的数
- 如果1个比特来储存,只能储存两个数:0,1
- 如果2个比特,就有4种方法来表示从0到1之间的范围:0,0.33,0.66,1
- 如果3个比特,就有8种方法来表示从0到1之间的范围:0,0.125,0.25,0.375,0.5,0.625,0.875,1
- 就是说,仅用少量的精度损失的代价节省了大量的存储空间,是非常划算的。
- 当然对于不同的数字,损失的精度是不同的。总的来看,模型量化的精度损失取决于多种因素,包括所使用的量化策略、模型的特性,以及实际应用中的需求等
3.浮点数/整数与模型
- 浮点数和整数
- FP32:使用一个32bit(4byte,1byte=8bit)的浮点数,来表示每个数值
- FP16:使用一个16bit的浮点数,来表示每个数值
- INT8:使用一个8bit的整数(再加上刻度如scale=0.001),来表示每个数值
- INT4:使用一个4bit的整数(再加上刻度如scale=0.01),来表示每个数值
- 模型大小
- 比如7B模型:表示数据量有7000000000个数据。
- 正常来说(FP32)模型大小:7000000000 * 32bit(4byte/字节) = 32000000000字节 = 32G。如果直接运算就需要32G内存/显存。
- 如果半进度(FP16)运算模型:7000000000 * 2字节 = 14G 内存/显存
- 如果INT8量化运算:7000000000 * 1字节 = 7G 内存/显存
- 如果INT4量化运算:7000000000 * 0.5字节 = 3.5G 内存/显存
4.常见的加载/量化方法(对于pytorch模型):
- FP32全精度加载模型:大多数PyTorch/Transformers模型默认权重精度是 float32(FP32),不指明时,默认全精度加载模型。
- 16-bit量化:(半精度浮点数量化,16-bit(FP16)量化)精度损失非常小,几乎可忽略不计。FP16成为优选量化策略。(16-bit量化,其实是使用FP16半精度加载模型,没有做量化)
- 8-bit量化:8-bit(INT8)量化可能会导致一些精度损失,但通常能够控制在可接受的范围内。在许多任务中,INT8量化后的模型精度与原始模型相比,精度下降往往在1%以内。
- 4-bit量化:对模型进行4-bit(INT4)量化,精度损失可能会相对更大。一些先进的量化策略已经能够将精度损失控制在个位数百分点范围内。
- 其他量化:也会出现如6-bit量化,5-bit量化等,理论上可以任意位数量化,如13-bit量化。
5.量化过程分类
- 量化的过程可以在训练时量化和训练后量化。
- 训练时量化QAT(Quantization Aware Training),在量化过程中进行梯度反传更新权重,如QLoRA。
- 训练后量化也称为后训练量化PTQ(Post Training Quantization)如GPTQ。
- 在模型训练阶段,通常会寻求优质的硬件条件和更高的计算精度,以便训练出性能更优秀的模型,从而获得更高的评估分数。
- 在模型部署阶段,需要考虑到用户硬件的实际限制。为了让更多的用户能够使用模型,通常会在训练后推理前对模型进行量化处理。这样,可以在保持模型性能的同时,降低模型的硬件需求和运行成本。因此,训练后量化是实际商业应用中的常见做法。
- 所以,一般需要训练后量化,将训练好的权重拿出来量化,这些量化压缩后的模型仅用于推理。
- 训练后量化:已经训练好的模型,使用某种技术(如GPTQ)对模型参数进行压缩和精度降低(如FP16→INT8),生成一个体积更少的模型。作用是加快推理速度、降低显存/内存需求。
二、GPTQ
1.GPTQ(Generalized Post-Training Quantization)是一种一次性权重量化方法,专为生成预训练Transformer(GPT)模型设计。
2.GPTQ属于训练后量化,这对于大模型而言格外有意义,因为对其进行全参数训练以及甚至仅仅是微调都十分昂贵。
3.GPTQ采用int4/fp16(W4A16)的混合量化方案,其中模型权重被量化为int4数值类型,而激活值则保留在float16。在推理阶段,模型权重被动态地反量化回float16并在该数值类型下进行实际的运算。
4.GPTQ的优点
- int4量化能够节省接近4倍的内存,这是因为反量化操作发生在算子的计算单元附近,而不是在GPU的全局内存中。
- 由于用于权重的位宽较低,因此可节省数据通信的时间,从而提升了推理速度。
5.GPTQ内部的关键函数
- 羊驼(LLaMA)模型的GPTQ源代码
- 代码是执行量化操作的内部方法,根据给定的缩放因子、零点和最大量化值对输入进行量化。
代码
def _quantize(self, x, scale, zero, maxq):
if maxq < 0:
return (x > scale / 2).float() * scale + (x < zero / 2).float() * zero
q = torch.clamp(torch.round(x / scale) + zero, 0, maxq)
return scale * (q - zero)
6.GPTQ内部的量化操作步骤
- 缩放:将输入张量x除以缩放因子scale。这一步是为了将x的值范围调整到预期的量化范围。
- 四舍五入:将缩放后的结果四舍五入到最近的整数。这一步是为了将x的值离散化,即将其转换为整数。
- 限制范围:使用torch.clamp函数将四舍五入后的结果限制在0和maxq之间。这一步是为了确保量化后的值不会超出预期的量化范围。
- 反缩放:将量化后的张量减去零点zero,然后乘以缩放因子scale。这一步是为了将量化后的值恢复到原始的值范围。
三、AutoGPTQ
1.AutoGPTQ
- Hugging Face的Transformers框架支持多种量化方案,包括bitsandbytes与GPTQ(如AutoGPTQ、GPTQModel等实现)。其中GPTQ是一种后训练量化(PTQ)方法,最常用于4bit权重量化。对于许多聊天类任务,4bit GPTQ 往往能在较小精度损失下显著降低显存占用,并保持良好的推理速度。
- AutoGPTQ曾是Hugging Face生态中广受欢迎的GPTQ量化工具之一,因为它支持了大量Transformers模型架构。但HF社区也发展出其他高性能推理路线,如 ExLlama、llama.cpp、GGUF等,它们如今已支持多种主流模型架构。
- 由于Hugging Face的Transformers为量化模型提供了统一API,用户能更方便地加载和运行量化大语言模型。目前常见优化方案包括bitsandbytes、GPTQ、AWQ、accelerate,以及多种GPU/CUDA加速后端,具体可用能力取决于模型版本、硬件环境与安装组件。
- AutoGPTQ作用:量化模型和运行已量化好的模型。
- AutoGPTQ提供了量化功能,可以对已经训练好的HuggingFace格式模型进行 GPTQ量化,生成一个压缩后的INT4(或INT3、INT8)模型文件。
- AutoGPTQ支持加载已经量化好的GPTQ模型(如.safetensors格式),并直接在低显存环境中运行推理
2.AutoGPTQ优点:
- 量化模型可被序列化并在Hugging Face Hub上分享。
- GPTQ方法大大降低运行模型所需的内存,同时保持与FP16相当的推理速度。
- AutoGPTQ在更广泛的transformers架构上支持Exllama算子。
- 该集成带有基于RoCm的AMD GPU的本地化支持。
- 能够使用PEFT微调量化后的模型。
3.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"
)
4.使用Optimum代码库量化模型
- 为了将AutoGPTQ无缝集成到Transformers中,Hugging Face使用了AutoGPTQ API的一个极简版本,其可在Optimum中获得(Hugging Face针对训练和推理优化而开发的一个工具包)。通过这种方式,实现了与Transformers的集成,同时,如果想要量化自己的模型,也可以单独使用Optimum的API。
- 只需数行代码,即可使用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
)
5.通过Text-Generation-Inference使用GPTQ
- 在将GPTQ集成到Transformers中的同时,Text-Generation-Inference代码库 (TGI) 已经添加了GPTQ的支持,为生产中的大语言模型提供服务。
- 现在,GPTQ已经可以与动态批处理、paged attention、flash attention等特性一起被应用于广泛的transformers模型架构 。
6.使用PEFT微调量化后的模型
- 在常规的方法下,无法进一步微调量化后的模型。然而,通过使用PEFT代码库,可以在量化后的模型之上训练适应性网络!为实现这一目标,Hugging Face冻结了量化过的基座模型的所有网络层,并额外添加可训练的适应性网络。
四、bitsandbytes
1.bitsandbytes
- bitsandbytes是一个专门给AI大模型使用的低显存量化加速库,主要用于让模型在显卡资源有限的情况下也能运行。现在主流Hugging Face模型大多都支持
2.作用
- 模型量化,模型权重从:32位 → 8位 / 4位
- 支持训练(QLoRA):很多微调项目都会用它做低显存训练。
3.transformers使用
代码
import torch
from langchain_huggingface import ChatHuggingFace, HuggingFacePipeline
from transformers import (
AutoTokenizer,
AutoModelForCausalLM,
pipeline,
BitsAndBytesConfig,
)
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
# quant_config = BitsAndBytesConfig(
# load_in_4bit=True, # 4bit量化
# bnb_4bit_quant_type="nf4",
# bnb_4bit_compute_dtype=torch.float16,
# bnb_4bit_use_double_quant=True,
# )
quant_config = BitsAndBytesConfig(
load_in_8bit=True, # 8bit量化
)
model = AutoModelForCausalLM.from_pretrained(
model_path,
trust_remote_code=True,
# dtype=torch.float16, # 如果不量化可以只用半进度运行模型
device_map="auto",
quantization_config=quant_config,
low_cpu_mem_usage=True,
)
pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
max_new_tokens=2046,
return_full_text=False,
# do_sample=True,
# temperature=0.7,
)
llm = HuggingFacePipeline(pipeline=pipe)
chat_model = ChatHuggingFace(llm=llm, tokenizer=tokenizer)
五、AWQ量化技术(简单了解)
1.AWQ(Activation-Wise Quantization)是一种激活量化技术,专注于对神经网络中的激活值(Activation)进行量化,而不是像传统方法(如GPTQ)那样直接量化权重。
2.工作原理:在AWQ中,量化不只是应用于神经网络的权重(weights),还应用于激活值,即网络在每一层的输出。激活值的量化通常会有较大的影响,因为它们直接影响到网络每一层的计算。
总结
本文整理了模型量化技术的基本概念和常见方案。量化的核心目标是在尽量保持模型效果的前提下,降低模型权重精度,从而减少模型体积、降低显存/内存占用,并提升推理效率。实际使用中,FP16、INT8、INT4、GPTQ、AutoGPTQ、bitsandbytes、AWQ 等方案各有适用场景,需要结合模型类型、硬件环境、推理速度、精度要求和部署方式综合选择。
更多推荐



所有评论(0)