大家好,我是 同学小张,+v: jasper_8017 一起交流,持续学习AI大模型应用实战案例,持续分享,欢迎大家点赞+关注,订阅我的大模型专栏,共同学习和进步。
现在订阅专栏,+微信私信我 返3元,即将涨价!
“为什么ChatGPT能在手机上流畅运行?为什么Stable Diffusion生成图片只需1秒?这一切的秘密,都藏在「模型量化」的黑科技里!”
随着大模型参数量突破万亿级,如何让这些"庞然大物"在手机、IoT设备上跑起来?本文将用最通俗的语言,带你揭开模型量化的神秘面纱!
1. 模型量化是什么?
核心思想:从"精密天平"到"厨房秤"
想象你要称一颗钻石和一颗土豆:
- 钻石 → 用精确到0.001克的天平(FP32浮点计算)
- 土豆 → 用精确到1克的厨房秤(INT8量化计算)
所以:
模型量化本质:将神经网络权重和计算值从高精度浮点数(如32位)转换为低精度整数(如8位),牺牲微小精度换取速度和内存的飞跃!
2. 量化的优势
量化技术为大语言模型带来了诸多优势:
-
降低内存占用:将模型参数从高精度格式(如32位浮点数)转换为低精度格式(如8位或4位整数),大幅减少了模型的内存占用。
-
加快推理速度:低精度运算在硬件加速器(如CPU、GPU和TPU)上的执行速度更快,从而提高了模型的推理速度。
-
减少能源消耗:低精度运算的能耗更低,有助于降低模型在运行时的能源消耗。
-
提升部署灵活性:量化后的模型能够在资源受限的设备(如移动设备和边缘设备)上更灵活地部署。
3. 大语言模型的参数精度
现代大语言模型(如Claude、Gemini、GPT和Llama系列)包含数十亿参数,对内存和计算资源提出了极高要求。量化技术通过将模型参数转换为低精度格式,有效应对了这些挑战。现在比较大的模型,其参数一般是FP32或FP16。
- 32位浮点数(FP32)
FP32使用32位表示每个数字,分为符号位(1位)、指数位(8位)和尾数位(23位),提供高精度的数值表示,但内存占用较大。
- 16位浮点数(FP16)
FP16使用16位表示每个数字,分为符号位(1位)、指数位(5位)和尾数位(10位),在精度和内存占用之间取得平衡,适合硬件容量有限的设备或对精度要求较低的应用场景。
4. 量化的基础
4.1 IEEE-754浮点标准
-
单精度(FP32):符号位1位,指数位8位,尾数位23位,总范围±3.4×10³⁸。
-
半精度(FP16):符号位1位,指数位5位,尾数位10位,总范围±65,504。
-
Bfloat16(BF16):符号位1位,指数位8位,尾数位7位,总范围±3.4×10³⁸,兼具FP32的大范围表示能力和FP16的低内存占用优点。
4.2 整数格式
- INT8(8位整数):有符号范围-128到+127,无符号范围0到255。
- INT4(4位整数):有符号范围-8到+7,无符号范围0到15。
4.3 量化过程
-
确定数值的动态范围:分析数据中数值的变化范围。
-
选择缩放因子(Δ):关键步骤,影响量化效果。
-
将浮点值映射为整数:按照规则将浮点数转换为整数。
-
存储缩放因子用于反量化:便于将量化后的整数恢复为浮点值。
4.4 量化类型
- 对称量化:量化后的值以零为中心对称分布,适用于数据以零为中心的情况。
- 举例 :假设我们有一个模型权重参数范围是 [- 6, 6]。在对称量化中,我们会把 - 6 映射到一个量化的最小值(比如 - 128,如果是用 8 位整数表示),把 6 映射到量化的最大值(比如 127)。在这个过程中,正数和负数的量化步长是相同的,并且零点是对称的中心位置。就像在一条数轴上,零点左右两边的量化间隔是相等的。
- 优点 :实现起来相对简单。因为量化过程是对称的,所以在反量化(把量化后的值恢复到浮点数近似值)的时候也比较方便,只需要用一个简单的比例系数乘以量化后的值就可以大致恢复原来的数值范围。而且对于一些具有对称分布特性的数据,对称量化可以比较准确地表示数据的分布情况。
- 非对称量化:不以零为中心对称,适用于数据分布不对称的情况。
- 举例 :还是以模型权重参数为例,假设参数范围是 [- 2, 8]。在非对称量化中,我们会根据参数的实际分布,确定一个偏移量。比如,我们可以把 - 2 映射到量化后的最小值(如 0),把 8 映射到量化后的最大值(如 255,如果是用 8 位无符号整数表示)。这样,正数和负数部分的量化步长是不同的,而且零点不是量化范围的中心位置。
- 优点 :它可以更有效地利用量化后的数值范围来表示模型参数。特别是当模型参数的分布不是对称的时候,非对称量化可以更准确地表示参数的值。例如,如果模型参数大部分集中在正数区域,非对称量化可以更精细地量化正数部分,从而提高模型在量化后的精度。
4.5 特定任务的量化建议
-
自然语言处理任务(NLP):训练时使用BF16,推理时使用INT8。
-
图像处理任务:训练时使用FP16,推理时使用INT8或INT4。
-
Transformer模型:注意力层可以混合使用INT8和INT4。
4.6 裁剪与校准
裁剪通过定义自定义动态范围排除异常值,减少其对量化的影响。
- 假设我们有一个权重参数范围是 [-10, 10],但我们希望将其量化到 [-5, 5] 的范围内。在这种情况下,所有小于 -5 的值都会被映射到 -5,所有大于 5 的值都会被映射到 5。这样做的好处是,可以显著减少非离群值的量化误差,但会增加离群值的量化误差
校准旨在找到包含尽可能多值且最小化量化误差的范围,对权重和激活值的量化至关重要。
- 校准方法:
- 手动选择输入范围的百分位数:通过统计分析,选择一个百分位数来确定量化范围。例如,可以选择 99% 的数据点所在的范围作为量化范围。
- 优化原始权重和量化权重之间的均方误差(MSE):通过最小化原始权重和量化权重之间的均方误差来确定量化范围。
- 最小化原始值和量化值之间的熵(KL 散度):通过最小化原始值和量化值之间的 KL 散度来确定量化范围。
5. 量化技术
5.1 训练后量化(PTQ)
PTQ在模型训练完成后进行量化,无需额外训练或微调。
-
权重的量化:可采用对称量化或非对称量化,根据数据分布选择合适的方法。
-
激活值的量化:分为动态量化和静态量化。
-
动态量化:在动态量化过程中,当数据流经每个隐藏层时,会收集并分析激活值。具体过程如下:
-
激活值收集:记录数据通过隐藏层后的激活值分布。
-
计算量化参数:根据分布计算零点和缩放因子,每次数据流经一层时重复此过程。
-
优势:更准确,适应实际数据分布。
-
缺点:增加推理时的计算量。
-
-
静态量化
-
校准数据集:使用代表性数据集收集激活值分布。
-
计算量化参数:根据分布计算并存储零点和缩放因子。
-
优势:推理时无需重新计算,计算效率高。
-
缺点:可能不如动态量化准确。
-
-
举个例子
假设我们有一个已经训练好的图像分类模型,它使用32位浮点数表示权重和激活值。我们希望将这个模型部署到移动设备上,但移动设备的计算资源有限。
(1)收集激活值统计信息:
我们使用一些代表性的图像数据来运行模型的前向传播,收集各层激活值的最小值和最大值。
(2)计算量化参数:
根据收集到的激活值统计信息,我们计算出量化所需的缩放因子和零点。
(3)量化权重和激活值:
使用这些量化参数,我们将模型的权重和激活值从32位浮点数转换为8位整数。
(4)推理优化:
量化后的模型在移动设备上运行时,使用8位整数进行计算,显著减少了计算量和存储空间,提高了推理速度。
5.2 4位量化
4位量化通过进一步降低模型精度,提高效率,但需谨慎处理以避免显著降低模型精度。
5.2.1 GPTQ
主要针对GPU进行优化,并使用加权量化误差校正。
GPTQ采用非对称量化方法,一次对一层进行量化,通过逆海森矩阵对权重进行变换,捕捉量化误差并进行调整。
5.2.2 GGUF
旨在支持混合精度和CPU卸载。
GGUF通过将大型语言模型的层卸载到CPU上,实现高效利用CPU和GPU资源,采用层次化块结构和缩放因子进行量化。
5.2.3 AWQ(激活感知权重量化)
AWQ专注于4位仅权重量化,通过识别并保护每一层中最重要的权重,最小化量化误差,适用于资源受限的硬件。
5.3 量化感知训练(QAT)
量化感知训练就是在训练模型的时候,提前模拟量化操作,让模型在训练过程中逐渐适应量化带来的误差,从而在量化后仍能保持较高的精度。具体来说,就是在训练过程中插入模拟量化操作(称为“假量化”),这些操作会模拟量化后的数值,但实际计算仍然使用浮点数。这样,模型在训练时就能学会如何补偿量化带来的误差,最终在量化部署时表现更好。
5.3.1 量化感知训练的流程
(1)准备浮点模型:首先,使用标准方法训练一个浮点模型(通常为FP32)作为QAT的初始模型。
(2)插入模拟量化操作:在模型的权重和激活值计算过程中插入模拟量化操作(FakeQuant),这些操作会模拟量化和反量化的数值,但实际计算仍然使用浮点数。
(3)训练模型:使用正常的训练流程对模型进行训练。在训练过程中,模型会逐渐适应量化带来的误差,通过反向传播计算梯度并更新模型参数。
(4)生成量化模型:训练完成后,将模型中的模拟量化操作替换为实际的量化操作,生成完全量化的模型。
5.3.2 量化感知训练的优势
-
减少精度损失:通过在训练过程中模拟量化,QAT能够显著减少量化后的精度损失。
-
提高模型效率:量化后的模型大小更小,推理速度更快,适用于嵌入式设备和移动设备。
-
提升兼容性:QAT生成的量化模型与原始浮点模型在接口上保持一致,便于部署和集成。
5.3.3 量化感知训练的缺点
-
训练开销大:需要重新训练模型,时间和计算成本较高。
-
复杂性增加:需要调整训练流程,开发成本较高
5.4 BitNet:1比特量化
BitNet引入极端量化,仅使用1比特值(-1和1)表示权重,通过BitLinear层实现高效计算,显著降低内存需求和计算开销。
6. 总结
量化技术在大语言模型的部署中发挥着关键作用,通过降低内存占用、加快推理速度和减少能源消耗,使模型能够在资源受限的环境中高效运行。本文详细介绍了多种量化方法及其应用场景,为实际应用提供了有价值的参考。
参考:https://mp.weixin.qq.com/s/M9JZBu9WPs5zDAMX_Hi73w
如果觉得本文对你有帮助,麻烦点个赞和关注呗 ~~~
- 大家好,我是 同学小张,持续学习C++进阶、OpenGL、WebGL知识和AI大模型应用实战案例
- 欢迎 点赞 + 关注 👏,持续学习,持续干货输出。
- +v: jasper_8017 一起交流💬,一起进步💪。
- 微信公众号搜【同学小张】 🙏
私信免费领取AI、C++等相关资料,持续收集更新中! 包括但不限于:
清华大学104页《DeepSeek:从入门到精通》.pdf
DeepSeek指导手册(24页).pdf
《如何向 ChatGPT 提问以获得高质量答案:提示技巧工程完全指南》
《OpenAI:GPT 最佳实践(大白话编译解读版)》
人工智能精选电子书