LLM 量化终极手册

发布时间:2026/5/21 17:31:24

LLM 量化终极手册 原文towardsdatascience.com/the-ultimate-handbook-for-llm-quantization-88bb7cb0d9d7https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7eba1fdc612faa6e6d5752ed692dd481.png由Siednji Leon在Unsplash上的照片LLMs 在 CPU 上没错。从处理对话到创建自己的图像AI 自从其开始以来已经走了很长的路。但它带来了一个瓶颈。随着模型规模的扩大它们的计算需求也增加了。AI 开始严重依赖计算能力。为了满足这些需求我们转向了 GPU其余的就是历史了。许多设备没有强大的 GPU因此错过了 AI 能力。有必要缩小这些模型的大小和功耗以便在计算能力有限的设备上运行 AI 模型如手机或仅配备 CPU 的计算机。早期的努力包括修剪和蒸馏等技术。然而当涉及到 LLMs 时这些方法并不可行因为 LLMs 通常具有大规模的架构。最近基于大型语言模型LLMs的人工智能革命或多或少是基于云服务器进行训练、部署和推理的。然而主要玩家现在正在将 LLMs 的能力扩展到边缘设备。微软的 copilotPCs 是一个很好的例子也是我们期待的事情。随着我们向边缘部署迈进优化 LLMs 的大小变得至关重要同时不牺牲性能或质量。实现这种优化的一个有效方法是通过量化。在这篇文章中我们将深入探讨量化以及一些最先进的量化方法。我们还将看到如何使用它们。目录· 量化是什么 为什么 ∘ 线性/尺度量化 ∘ 仿射量化 ∘ 训练后量化PTQ ∘ 量化感知训练 ∘ 为什么量化 · 最新的 SOTA 量化方法 ∘ LLM.int8() (Aug 2022) ∘ GPTQ (Oct 2022) ∘ QLoRA (May 2023) ∘ AWQ (Jun 2023) ∘ Quip# (Jul 2023) ∘ GGUF (Aug 2023) ∘ HQQ (Nov 2023) ∘ AQLM (Feb 2024) · 结论 · 参考文献量化是什么 为什么❓神经网络的权重可以根据所需的精度要求和可用的计算资源以各种数据类型表示。量化是一种将高精度权重值范围如 FP32由数据类型的[min, max]确定映射到较低精度值如 FP16 甚至 INT88 位整数数据类型的过程。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d059d6bbaa1b5ba29ceef2858635b8e1.png作者的照片考虑你的 400M 参数大型语言模型LLM。通常权重以 FP3232 位存储。该模型的内存占用可以计算如下4×10⁸ params x 4 bytes 1.6 Gigabytes量化上述模型可以显著减小其大小。考虑从 FP32 到 INT8 的转换。量化模型的内存占用可以计算如下4×10⁸ params x 1 byte 0.4 Gigabytes那就是原始大小的1/4**** 这有助于模型占用更少的内存同时也提高了推理速度尽管可能会稍微牺牲一些精度。此外一些轻量级模型可以很容易地由 CPU 处理。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ab2b4f85890b41a2c01b725cbd734caa.png量化与反量化图片由作者提供量化过程中权重范围映射通常使用两种方法。线性/尺度量化在这里量化类似于指定范围内的缩放。Rmin映射到QminRmax映射到Qmax。**** 实际范围中的0映射到量化范围中的相应零点。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/77316350dae973eaf09369f7b6bfc077.png作者提供的图片https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d79c7536f1156e39efcf17fe9f90a54c.png线性量化此方法允许表示更不对称的范围。这里的参数是https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e31d628cde9fbb565d9088d13217277f.png对于 INT8 数据类型方程可以是https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8e9cdb07475a3649d61252c77c47c647.png应用此转换后一些数据将超出范围。为了将它们纳入范围使用了一个额外的裁剪操作。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/08cd3f62b65e5ebf873bad06e6d8f0d4.png当涉及到量化大型语言模型LLM时有两种主要的量化技术训练后量化PTQ正如其名所示LLM 在训练阶段之后进行量化。权重从高精度转换为低精度数据类型。它可以应用于权重和激活。尽管速度、内存和功耗高度优化但存在精度权衡。在量化过程中会发生舍入或截断引入量化误差。这种误差会影响模型表示权重之间细微差异的能力。量化感知训练这种技术是为了减轻 PTQ 情况下模型精度潜在损失而开发的。与 PTQ 不同量化过程与训练本身集成因此使过程成为“量化感知”。在 QAT 中模型架构最初被修改以保持元素的全精度和量化版本包括权重和激活从而创建了一个双重存储系统。在训练过程的正向传递中向模型引入了模拟或“虚假”量化使其能够体验量化的影响同时在计算梯度时仍保持精度从而增强了模型对量化的鲁棒性。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0591f7bc4954536e1678474350bdfdbc.png来源论文 为什么进行量化减少内存占用量化大大降低了 LLM 的内存需求使得它们可以方便地部署在低端机器和边缘设备上。许多边缘设备仅支持整数数据类型存储。加快推理低精度计算整数本质上比高精度浮点计算快。因此通过使用量化权重推理过程中的数学运算可以加速。此外许多现代 CPU 和 GPU 具有针对低精度计算的专用指令当量化模型时可以利用这些指令。这种硬件加速可以显著提高推理速度。降低能耗许多现代硬件加速器针对低精度计算进行了优化。当模型进行量化时这些加速器每瓦能量可以执行更多的操作。最新 SOTA 量化方法LLM.int8()2022 年 8 月这涉及将权重从 FP16 转换为 INT8有效地将 LLM 的大小减半。该方法声称可以高效地减少高达 175B 参数的 LLM 大小而不会降低性能。在深入探讨论文 [1]的细节之前重要的是要理解 LLMs 具有涌现特征——这些特征源于训练数据对于模型性能至关重要。其中一些特征可能具有很大的幅度并能对模型的整体性能产生强烈的影响。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/dca637c4a33b8863a8be1ca95aa05927.png来源论文涉及的步骤*LLM.int8()*方法从向量量化开始。这意味着每个向量矩阵中的一行都单独量化使用其自己的归一化常数。因此每个特征的相对重要性得以保留。对于每个向量计算一个归一化常数用于缩放向量以便它们可以用 8 位整数表示。通过使用归一化常数LLM 中的大多数特征都被量化。对于异常值——具有异常大幅度的特征——使用混合精度分解方案。这将这些异常值特征隔离到单独的 16 位矩阵乘法中确保它们被准确处理同时仍然允许超过 99.9%的值以 8 位进行乘法。优点LLM 可以被量化并立即用于推理而不会降低性能。缺点该方法仅关注 INT8 数据类型和参数量高达 175B 的模型尤其是 OPT-175B / BLOOM。代码实现fromtransformersimportAutoTokenizer,AutoModelForCausalLMimporttorch model_idmeta-llama/Llama-2-7b-chat-hftokenizerAutoTokenizer.from_pretrained(model_id)model_8bitAutoModelForCausalLM.from_pretrained(model_id,device_mapauto,load_in_8bitTrue)GPTQ2022 年 10 月GPTQ是一种早期的单次 PTQ 技术它使得大型语言模型的部署变得高效。这主要是通过在论文中提出的两个特性实现的[4]逐层量化在 LLM 中逐层进行量化。目标是找到一个更简单的权重版本当我们使用它进行预测时仍然可以得到良好的结果。这是通过使原始权重和简化权重之间的差异尽可能小来实现的即最低均方误差。最优脑量化这是一种旨在减少量化过程中引入的模型错误的算法。在量化权重时剩余的权重会进行调整。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/442deb0a58d217b3a063defe923123c6.png来源论文优点GPTQ 允许进行高达 2 位的量化在模型大小和性能之间提供一系列权衡。缺点使用这种方法进行量化会引入相当大的性能下降。代码实现安装所需的库。pip install auto-gptq transformers accelerate加载模型并使用autogptq库对其进行量化。fromtransformersimportAutoModelForCausalLM,AutoTokenizer,GPTQConfig model_idmeta-llama/Llama-2-7b-hftokenizerAutoTokenizer.from_pretrained(model_id)quant_configGPTQConfig(bits4,datasetc4,tokenizertokenizer)modelAutoModelForCausalLM.from_pretrained(model_id,device_mapauto,quantization_configquant_config)QLoRA2023 年 5 月在深入了解LoRA之前这里是对 LoRA 的简要介绍。**LoRA大型语言模型的低秩自适应**是一种参数高效的微调方法用于针对特定任务专门化 LLM。它通过将基于秩分解的可训练矩阵集成到每个 transformer 层中来实现这一点。此外它最小化了需要针对目标任务训练的参数数量同时保持原始预训练模型权重不变。更多关于它的信息请在此处阅读。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/302d931cc816e3aba16b45f1c01bbccf.png来源论文QLoRA是 LoRA 的增强版本。以下是该方法在论文中描述的亮点[2]4 位正常浮点量化4 位正常浮点通过计算从 0 到 1 范围内的2ᵏ1分位数其中 k 是位数来操作然后将这些值归一化以适应[-1, 1]区间。通过这种归一化我们可以将我们的神经网络权重调整到[-1, 1]范围并继续进行量化。双重反量化这涉及到对 4 位 NF 量化过程中使用的量化常数进行量化。它可以将每个参数的平均位节省到 0.5 位。这很有益因为 QLoRA 利用了块状 k 位量化。分页优化QLoRA 涉及使用 Nvidia 的统一内存功能从 GPU 到 CPU 的高效页面传输。这防止了 GPU 过载并使训练高效而不会中断。优点由于 GPU 内存使用量较低QLoRA 可以支持更长的最大序列长度和更多的批次数量。缺点在调整速度方面可能会较慢。在成本效率方面也处于较低水平但这不是需要关注的问题。代码实现安装所需的库pip install-q-U trl transformers accelerate githttps://github.com/huggingface/peft.git pip install-q datasets bitsandbytes加载模型和分词器。配置 LoRA 参数。importtorchfromtransformersimportAutoModelForCausalLM,AutoTokenizer,BitsAndBytesConfig,AutoTokenizer model_idmeta-llama/Llama-2-7b-chat-hfbnb_configBitsAndBytesConfig(load_in_4bitTrue,bnb_4bit_quant_typenf4,bnb_4bit_compute_dtypetorch.float16,)modelAutoModelForCausalLM.from_pretrained(model_id,quantization_configbnb_config,trust_remote_codeTrue)model.config.use_cacheFalsefrompeftimportLoraConfig,get_peft_model lora_alpha16lora_dropout0.1lora_r64peft_configLoraConfig(lora_alphalora_alpha,lora_dropoutlora_dropout,rlora_r,task_typeCAUSAL_LM)使用 TRL 库中的SFTTrainer设置训练器它为 transformersTrainer提供了一个包装器可以轻松使用 PEFT 适配器在基于指令的数据集上微调模型。当然你需要一个数据集来训练。fromtransformersimportTrainingArguments output_dir./modelsper_device_train_batch_size4gradient_accumulation_steps4optimpaged_adamw_32bitsave_steps100logging_steps10learning_rate2e-4max_grad_norm0.3max_steps100warmup_ratio0.03lr_scheduler_typeconstanttraining_argumentsTrainingArguments(output_diroutput_dir,per_device_train_batch_sizeper_device_train_batch_size,gradient_accumulation_stepsgradient_accumulation_steps,optimoptim,save_stepssave_steps,logging_stepslogging_steps,learning_ratelearning_rate,fp16True,max_grad_normmax_grad_norm,max_stepsmax_steps,warmup_ratiowarmup_ratio,group_by_lengthTrue,lr_scheduler_typelr_scheduler_type,)fromtrlimportSFTTrainer max_seq_length512trainerSFTTrainer(modelmodel,train_datasetdataset,peft_configpeft_config,dataset_text_fieldtext,max_seq_lengthmax_seq_length,tokenizertokenizer,argstraining_arguments,)trainer.train()AWQ (Jun 2023)***AWQ激活感知权重量化***是一种后训练量化方法。在这种方法中模型的激活被用来代替权重。让我直接引用论文 [3]中的内容我们的方法基于观察即权重并不同等重要仅保护 1%的显著权重可以大大减少量化误差。然后我们提出通过观察激活而不是权重来寻找保护显著权重的最佳通道缩放比例。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1dffb29443abb647e81e221d0c082427.png来源论文优点AWQ 方法比其他方法提供了更高的准确性因为它保留了对于 LLM 性能至关重要的权重。它还非常高效且速度快因为它不涉及反向传播或重建。它在边缘设备上表现良好。缺点虽然保持 0.1%的权重在 FP16 中可以增强量化性能而不会显著增加模型大小但这种混合精度数据类型会复杂化系统实现。代码实现安装所需的库。!pip install autoawq transformers accelerate加载模型并使用autoawq库进行量化。fromawqimportAutoAWQForCausalLMfromtransformersimportAutoTokenizer model_idmeta-llama/Llama-2-7b-hfquant_pathLlama2-7b-awq-4bitquant_config{zero_point:True,q_group_size:128,w_bit:4}# Load model and tokenizermodelAutoAWQForCausalLM.from_pretrained(model_id)tokenizerAutoTokenizer.from_pretrained(model_id,use_fastTrue)# Quantizemodel.quantize(tokenizer,quant_configquant_config)Quip# (Jul 2023)简而言之***QuIP具有失真处理的量化***基于这样一个想法如果模型的权重均匀分布失真并且重要的舍入方向不与坐标轴对齐则量化过程可以改进。它包括两个步骤LDLQ 自适应舍入过程: 以一种方式调整模型权重以最小化某种误差度量即“二次代理目标”[8]。预处理和后处理将权重和 Hessian 矩阵乘以随机正交矩阵。这确保了权重和 Hessian 矩阵是失真的这对量化过程有益。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c4114afc92f1a670b81282cc7924ce41.png来源论文QuIP#[5]通过一些处理改进在 QuIP 上进行了进步。改进的失真处理它使用了一种更快、更好的方法称为随机 Hadamard 变换。向量量化QuIP#使用向量量化来利用失真权重所具有的球状亚高斯分布。具体来说它引入了一组基于高度对称的 E8 格子的硬件高效码本。E8 格子实现了最优的 8 维单位球体排列这意味着它可以更有效地表示权重。优点与其它方法相比QuIP#在相同的或更好的量化质量下提供了显著更高的吞吐量40%。这对于 2 位量化来说并不差。缺点尽管没有提到很多限制但复杂性和硬件兼容性可以考虑。代码实现克隆官方仓库并安装所需的库。git clone https://github.com/Cornell-RelaxML/quip-sharp.git pip install-r requirements.txt cd quiptoolsamp;amp;python setup.py installamp;amp;cd../找到各种模型的脚本。运行脚本quantize_finetune_llama.py以使用 llama 模型。此外查看仓库以获取 QuIP 量化。模型量化的代码如下所示。importtorchfromtransformersimportAutoModelForCausalLM,AutoTokenizerfromquantizerimportQuipQuantizer model_namemeta-llama/Llama-2-70b-hfquant_dirllama-70b_2bit_quiptokenizerAutoTokenizer.from_pretrained(model_name)modelAutoModelForCausalLM.from_pretrained(model_name,torch_dtypetorch.float16)quantQuipQuantizer(codebookE8P12,datasetredpajama)quant.quantize_model(model,tokenizer,quant_dir)GGUF2023 年 8 月***GGUFGPT 生成的统一格式***是 Georgi Gerganov 和llama.cpp团队高度期待的一次发布。主要亮点确实是 LLMs 现在可以轻松地在消费级 CPU 上运行。之前它被称为 GGML后来升级为 GGUF。GGML 的一个显著成就是即使 LLM 在 CPU 上运行也可以将 LLM 的某些层卸载到 GPU 上。这有效地解决了由于 VRAM 不足而使开发者面临的全球挑战。优点如果您计划在 CPU 或 Apple 设备M 系列芯片上运行 LLM那么对于许多 LLM如 Llama 和 Mistral来说这是首选方法。GGUF 文件格式现在得到了 llama.cpp 和 HuggingFace 的良好支持。与其它格式相比GGUF 模型也显示出更低的困惑度分数。缺点GGUF 专注于 CPU 和 Apple M 系列设备。如果你使用不同的硬件配置这可能会成为一个限制因素。代码实现安装ctransformers库。pip install ctransformers[cuda]模型可在 HuggingFace 的 Bloke 仓库中找到。fromctransformersimportAutoModelForCausalLMfromtransformersimportAutoTokenizer,pipeline# Load LLM and Tokenizer# Use gpu_layers to specify how many layers will be offloaded to the GPU.modelAutoModelForCausalLM.from_pretrained(TheBloke/zephyr-7B-beta-GGUF,model_filezephyr-7b-beta.Q4_K_M.gguf,model_typemistral,gpu_layers50,hfTrue)tokenizerAutoTokenizer.from_pretrained(HuggingFaceH4/zephyr-7b-beta,use_fastTrue)# Create a pipelinepipepipeline(modelmodel,tokenizertokenizer,tasktext-generation)fromctransformersimportAutoModelForCausalLMfromtransformersimportAutoTokenizer,pipeline# Load LLM and Tokenizer# Use gpu_layers to specify how many layers will be offloaded to the GPU.modelAutoModelForCausalLM.from_pretrained(TheBloke/zephyr-7B-beta-GGUF,model_filezephyr-7b-beta.Q4_K_M.gguf,model_typemistral,gpu_layers50,hfTrue)tokenizerAutoTokenizer.from_pretrained(HuggingFaceH4/zephyr-7b-beta,use_fastTrue)# Create a pipelinepipepipeline(modelmodel,tokenizertokenizer,tasktext-generation)HQQ2023 年 11 月根据论文权重校准可以通过无数据校准技术BitsAndBytes和基于校准的技术GPTQ 和 AWQ来实现。虽然无校准方法更快但基于校准的方法却受到数据偏差和量化时间的困扰。***HQQ半二次量化***通过快速和稳健的优化在实时中进行量化。它消除了校准数据的需求并且足够灵活可以量化任何给定的模型从而在不出现数据偏差问题的同时实现无校准方法的速率。由于半二次分割等优化技术它将量化时间大幅减少到几乎几分钟。有关该方法数学和工作的更多细节请参阅官方网站。优点与其他方法相比量化时间出奇地低比 GPTQ 快 50 倍消除校准数据需求使其更容易实现。缺点没有在其他地方提到很多限制。它可能仍然会像其他方法一样出现质量下降。代码实现安装 transformers 库并直接使用 HQQ 实现fromtransformersimportAutoModelForCausalLM,HqqConfig# All linear layers will use the same quantization configquant_configHqqConfig(nbits4,group_size64,quant_zeroFalse,quant_scaleFalse,axis1)model_idmeta-llama/Llama-2-7b-hf# Load and quantizemodelAutoModelForCausalLM.from_pretrained(model_id,torch_dtypetorch.float16,device_mapcuda,quantization_configquant_config)AQLM2024 年 2 月***AQLM语言模型的加性量化***是一种仅对权重进行 PTQ 的方法在每参数 2 位范围内设定了新的基准。它优于 GPTQ 以及 QuIP 和 QuIP#等流行算法。它应用了一种名为多码本量化MCQ的新方法该方法将每个向量划分为子向量并使用有限集合的码字来近似它们。码字是定义在码本中的已学习向量[7]。AQLM 通过取模型中权重矩阵的行并对它们进行量化来工作。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1aba60e090a0c001aa36bdb09a40d23b.png来源论文优点AQLM 为 GPU 和 CPU 上的标记生成提供了快速实现使其能够超越优化 FP16 实现的速率同时在一个显著减少的内存占用下运行。缺点在其他地方只提到了少数限制。它可能仍然会像其他方法一样出现质量下降。代码实现如何自行量化模型以及相应的代码可以在官方仓库中找到。要运行 AQLM 模型请加载已使用 AQLM 量化的模型fromtransformersimportAutoTokenizer,AutoModelForCausalLM quantized_modelAutoModelForCausalLM.from_pretrained(ISTA-DASLab/Mixtral-8x7b-AQLM-2Bit-1x16-hf,torch_dtypeauto,device_mapauto)tokenizerAutoTokenizer.from_pretrained(ISTA-DASLab/Mixtral-8x7b-AQLM-2Bit-1x16-hf)结论量化方法开辟了一个全新的世界即使在我们的口袋里也能实现高级语言处理能力。在本文中我们讨论了关于 LLM 量化的所有内容并详细探讨了量化 LLM 的各种方法。我们还经历了每种方法的起伏并学习了如何使用它们。此外我们还获得了关于如何根据具体需求和是否使用 CPU 或 GPU 来选择最合适的方法的见解。如果您喜欢这篇文章请确保关注我的Medium。您可以在LinkedIn上与我联系。敬请期待更多关于 LLM 的内容 参考文献[1] Dettmers, T., Lewis, M., Belkada, Y., Zettlemoyer, L. (2022). LLM.Int8(): 规模化 Transformer 的 8 位矩阵乘法.ArXiv. /abs/2208.07339[2] Dettmers, T., Pagnoni, A., Holtzman, A., Zettlemoyer, L. (2023). QLoRA: 量化 LLM 的高效微调.ArXiv. /abs/2305.14314[3] Lin, J., Tang, J., Tang, H., Yang, S., Chen, W., Wang, W., Xiao, G., Dang, X., Gan, C., Han, S. (2023). AWQ: 用于 LLM 压缩和加速的激活感知权重量化.ArXiv. /abs/2306.00978[4] Frantar, E., Ashkboos, S., Hoefler, T., Alistarh, D. (2022). GPTQ: 生成预训练 Transformer 的准确后训练量化.ArXiv. /abs/2210.17323[5] Tseng, A., Chee, J., Sun, Q., Kuleshov, V., De Sa, C. (2024). QuIP#: 使用 Hadamard 非相干性和格码本实现更好的 LLM 量化.ArXiv. /abs/2402.04396[6] Hicham Badri, Appu Shaji (2023). 大型机器学习模型的半二次量化。mobiusml.github.io/hqq_blog/[7] Egiazarian, V., Panferov, A., Kuznedelev, D., Frantar, E., Babenko, A., Alistarh, D. (2024). 通过加性量化实现大型语言模型的极压缩。arxiv.org/abs/2401.06118v3.ArXiv. /abs/2401.06118[8] Nagel, M., Amjad, R. A., Van Baalen, M., Louizos, C., Blankevoort, T. (2020). [上下文选择后训练量化的自适应舍入](http://Nagel, M., Amjad, R. A., Van Baalen, M., Louizos, C., Blankevoort, T. (2020). Up or Down? Adaptive Rounding for Post-Training Quantization. ArXiv. /abs/2004.10568).ArXiv. /abs/2004.10568[9] HuggingFace 文档 (2023). 文档[10] OpenGenus IQ. 机器学习ML量化基础入门 (2024). OpenGenus IQ[11] Abonia Sojasingarayar.LLM 系列 – 量化概述 (2023). Medium图片如果没有其他说明所有图片均由作者创作。

相关新闻