如何学习大型语言模型中的量化

前言

图片来自作者:Flow 展示了量化的必要性。(笑脸和生气脸图片来自Yan Krukau)


在我解释上面的图表之前,让我先介绍一下您将在本文中学习的重点内容。

  1. 首先,您将了解量化是什么以及为什么量化。
  2. 接下来,您将深入了解如何通过一些简单的数学推导来实现量化。
  3. 最后,我们将在 PyTorch 中一起编写一些代码来执行 LLM 权重参数的量化和反量化

让我们一起来一一解开吧。


1. 什么是量化?为什么需要它?

量化是一种将较大尺寸的模型(LLM 或任何深度学习模型)压缩为较小尺寸的方法。量化的主要目的是量化模型的权重参数和激活。让我们进行一个简单的模型大小计算来验证我们的陈述。

作者提供的图片:左图:以 GB 为单位的基本模型大小计算,右图:以 GB 为单位的量化模型大小计算


在上图中,基础模型 Llama 3 8B 的大小为 32 GB。经过 Int 8 量化后,大小减小到 8Gb(减少了 75%)。通过 Int4 量化,大小进一步减小到 4GB(减少了约 90%)。这是模型大小的大幅减少。这确实很神奇!不是吗?这要归功于量化论文的作者,我对数学的力量深表赞赏。

现在您已经了解了什么是量化,让我们继续讨论为什么。

让我们看一下图 1,作为一名有抱负的 AI 研究人员、开发人员或架构师,如果您想对数据集或推理执行模型微调,很可能由于内存和处理器的限制,您将无法在机器或移动设备上执行此操作。

可能和我一样,您也会像选项 1b 一样怒气冲冲。这将我们带到了选项 1a,您可以让云提供商为您提供所需的所有资源,并且可以轻松地使用任何您想要的模型完成任何任务。

但这会花费您很多钱。如果你能负担得起,那就太好了。但如果您的预算有限,好消息是您还有选项 2 可用。在这里,您可以执行量化方法来减小模型的大小并方便地在您的用例中使用它。如果您的量化做得好,您将获得与原始模型大致相同的准确度。

注意:如果您想将模型投入生产,一旦您在本地机器上对模型完成微调或其他任务,我建议您将模型托管在云中,以便为您的客户提供可靠、可扩展和安全的服务。ParagogerAI训练营 2img.ai

2. 量化是如何实现的?一个简单的数学推导。

从技术上讲,量化将模型的权重值从较高精度(例如 FP32)映射到较低精度(例如 FP16|BF16|INT8)。虽然有许多量化方法可用,但在本文中,我们将学习一种广泛使用的量化方法,即线性量化方法。线性量化有两种模式:A.非对称量化B.对称量化。我们将逐一了解这两种方法。

A.非对称线性量化:非对称量化方法 将原始张量范围(Wmin,Wmax)中的值映射到量化张量范围(Qmin,Qmax)中的值。

作者图片:非对称线性量化


  • Wmin、Wmax:原始张量的最小值和最大值(数据类型:FP32,32 位浮点数)。大多数现代 LLM 中权重张量的默认数据类型为 FP32。
  • Qmin、Qmax:量化张量的最小值和最大值(数据类型:INT8,8 位整数)。我们还可以选择其他数据类型(如 INT4、INT8、FP16 和 BF16)进行量化。我们将在示例中使用 INT 8。
  • 比例值(S):在量化过程中,比例值会缩小原始张量的值,得到量化张量。在反量化过程中,比例值会放大量化张量的值,得到反量化值。比例值的数据类型与原始张量相同,均为 FP32。
  • 零点 (Z):零点是量化张量范围内的非零值,直接映射到原始张量范围内的值0。零点的数据类型为 INT8,因为它位于量化张量范围内。
  • 量化:图表的“ A ”部分显示了量化过程,将 [Wmin, Wmax] 映射到 [Qmin, Qmax]。
  • 反量化:图的“B”部分显示了反量化过程,该过程映射 [Qmin, Qmax] -> [Wmin, Wmax]。

那么,我们如何从原始张量值导出量化张量值呢?这很简单。如果你还记得高中数学,你可以轻松地理解下面的推导。让我们一步一步来(我建议你在推导方程时参考上面的图表,以便更清楚地理解)。

我知道你们中的许多人可能不想经历下面的数学推导。但相信我,它肯定会帮助你理清概念,并在后期为量化编码时节省大量时间。我在研究这个问题时也有同样的感受。




  • 潜在问题 1:如果 Z 的值超出范围该怎么办?解决方案:使用简单的 if-else 逻辑,如果 Z 的值小于 Qmin,则将其更改为 Qmin;如果 Z 的值大于 Qmax,则将其更改为 Qmax。下图 4 中的图 A 对此进行了很好的描述。
  • 潜在问题 2:如果 Q 值超出范围该怎么办?解决方案:在 PyTorch 中,有一个名为clamp 的函数,它会调整值以保持在特定范围内(在我们的示例中为 -128, 127)。因此,如果 Q 值低于 Qmin,则 clamp 函数会将 Q 值调整为 Qmin;如果 Q 值高于 Qmax,则将 Q 值调整为 Qmax。问题解决了,让我们继续。

作者的图片:零点和量化张量超出范围


附注:对于 INT8(有符号整数数据类型),量化张量值的范围为 (-128, 127)。如果量化张量值的数据类型为 UINT8(无符号整数),则范围为 (0, 255)。

B. 对称线性量化:在对称方法中,原始张量范围中的 0 点映射到量化张量范围中的 0 点。因此,这被称为对称。由于 0 在范围的两侧都映射到 0,因此对称量化中没有 Z(零点)。整体映射发生在原始张量范围的 (-Wmax, Wmax) 和量化张量范围的 (-Qmax, Qmax) 之间。下图显示了量化和去量化情况下的对称映射。

作者图片:对称线性量化

由于我们已经定义了非对称段中的所有参数,因此这里也同样适用。让我们进入对称量化的数学推导。

非对称量化和对称量化之间的区别:


现在您已经了解了线性量化是什么、为什么和如何,这将引导我们进入文章的最后一部分,即编码部分。ParagogerAI训练营 2img.ai

3. 在PyTorch中编写代码来执行LLM权重参数的量化和反量化。

正如我之前提到的,量化也可以在模型的权重、参数和激活上进行。但是,为了简单起见,我们将在编码示例中仅量化权重参数。在开始编码之前,让我们快速看一下 Transformer 模型中量化后权重参数值的变化情况。我相信这会让我们的理解更加清晰。

作者提供的图片:Transformer 架构中权重参数的量化


当我们仅对 16 个原始权重参数从 FP32 量化到 INT8 后,内存占用就从 512 位减少到了 128 位(减少了 25%)。这证明对于大模型的情况,减少会更加显著。

下面,您可以看到 FP32、Signed INT8 和 Unsigned UINT8 等数据类型在实际内存中的分布。我已经以 2 的补码进行了实际计算。您可以自行练习计算并验证结果。

作者提供的图片:FP32、INT8、UINT8 数据类型分布及计算示例


现在,我们已经介绍了开始编码所需的一切。我建议您继续学习以熟悉推导。

A.非对称量化代码:我们一步一步来编码。

步骤 1:我们首先为原始权重张量分配随机值(大小:4x4,数据类型:FP32)# !pip install torch; 如果尚未安装 torch 库,请先安装
# import torch library
import torch

original_weight = torch.randn(( 4 , 4 ))
print (original_weight)


FP32 中的 original_weight 张量


第 2 步:我们将定义两个函数,一个用于量化,另一个用于反量化。def asymmetric_quantization(original_weight):
# define the data type that you want to quantize. In our example, it's INT8.
quantized_data_type = torch.int8

# Get the Wmax and Wmin value from the orginal weight which is in FP32.
Wmax = original_weight.max().item()
Wmin = original_weight.min().item()

# Get the Qmax and Qmin value from the quantized data type.
Qmax = torch.iinfo(quantized_data_type).max
Qmin = torch.iinfo(quantized_data_type).min

# Calculate the scale value using the scale formula. Datatype - FP32.
# Please refer to math section of this post if you want to find out how the formula has been derived.
S = (Wmax - Wmin)/(Qmax - Qmin)

# Calculate the zero point value using the zero point formula. Datatype - INT8.
# Please refer to math section of this post if you want to find out how the formula has been derived.
Z = Qmin - (Wmin/S)
# Check if the Z value is out of range.
if Z < Qmin:
Z = Qmin
elif Z > Qmax:
Z = Qmax
else:
# Zero point datatype should be INT8 same as the Quantized value.
Z = int(round(Z))

# We have original_weight, scale and zero_point, now we can calculate the quantized weight using the formula we've derived in math section.
quantized_weight = (original_weight/S) + Z

# We'll also round it and also use the torch clamp function to ensure the quantized weight doesn't goes out of range and should remain within Qmin and Qmax.
quantized_weight = torch.clamp(torch.round(quantized_weight), Qmin, Qmax)

# finally cast the datatype to INT8.
quantized_weight = quantized_weight.to(quantized_data_type)

# return the final quantized weight.
return quantized_weight, S, Z

def asymmetric_dequantization(quantized_weight, scale, zero_point):
# Use the dequantization calculation formula derived in the math section of this post.
# Also make sure to convert quantized_weight to float as substraction between two INT8 values (quantized_weight and zero_point) will give unwanted result.
dequantized_weight = scale * (quantized_weight.to(torch.float32) - zero_point)

return dequantized_weight


步骤 3:我们将通过调用asymmetric_quantization函数来计算量化权重、比例和零点。您可以在下面的屏幕截图中看到输出结果,请注意,quantized_weight 的数据类型为 int8,scale 为 FP32,zero_point 为 INT8。quantized_weight, scale, zero_point = asymmetric_quantization(original_weight)
print(f"quantized weight: {quantized_weight}")
print("\n")
print(f"scale: {scale}")
print("\n")
print(f"zero point: {zero_point}")


量化的重量、尺度和零点值


步骤 4:现在我们已经有了量化权重、比例和零点的所有值。让我们通过调用 asymmetric_dequantization 函数来获取反量化权重值。请注意,反量化权重值为 FP32。dequantized_weight = asymmetric_dequantization(quantized_weight, scale, zero_point)
打印(dequantized_weight)

去量化权重值


步骤5:让我们通过计算它们之间的量化误差来找出最终的去量化权重值与原始权重张量相比的准确度。quantization_error = (dequantized_weight - original_weight).square().mean()
print(quantization_error)

输出结果:quantization_error 少了很多。因此,我们可以说非对称量化方法做得很好。


B. 对称量化代码:我们将使用与非对称方法相同的代码。对称方法唯一需要做的改变是始终确保 zero_input 的值为 0。这是因为在对称量化中,zero_input 值始终映射到原始权重张量中的 0 值。我们无需编写额外代码即可继续操作。



就这样!

我们到了这篇文章的结尾。我希望这篇文章能帮助你对量化建立坚实的直觉,并清楚地理解数学推导部分。

我最后的想法是……

  • 在这篇文章中,我们涵盖了参与任何 LLM 或深度学习量化相关任务所需的所有必要主题。
  • 虽然,我们已经成功地对权重张量进行了量化,并且也取得了良好的精度。在大多数情况下,这已经足够了。但是,如果你想对更大的模型应用更高精度的量化,你需要执行通道量化(量化权重矩阵的每一行或列)或组量化(在行或列中分成更小的组并分别量化它们)。这些技术更复杂。我将在即将发布ParagogerAI训练营 2img.ai中介绍它们。

欢迎你分享你的作品到我们的平台上. http://www.shxcj.com 或者 www.2img.ai 让更多的人看到你的才华。

创作不易,觉得不错的话,点个赞吧!!!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/770378.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

万亿赛道上的新星:向量数据库如何成为AI大模型的超级引擎

万亿赛道上的新星:向量数据库如何成为AI大模型的超级引擎? 在这个人工智能飞速发展的时代,向量数据库正以其独特的能力,成为AI大模型技术底座的超级引擎。从开源社区的繁荣到云计算的广泛应用,向量数据库的每一步发展都显得尤为重要。 一、初创引领,巨头跟进:向量数…

VBA 操作注册表

1. SaveSetting 1-1. 语法 SaveSetting(AppName As String, Section As String, Key As String, Setting As String) 1-2. 函数说明 在Windows注册表中创建或保存一个应用程序项。将值写入注册表中的HKEY_CURRENT_USER\Software\VBand VBA Program Settings键的子键 1-3. 参…

无人机云台类型及作用

无人机云台主要分为三种类型&#xff1a; 单轴云台&#xff1a;仅支持单向旋转&#xff0c;适合拍摄平滑的延时摄影和全景照片。 双轴云台&#xff1a;支持水平和垂直旋转&#xff0c;可用于拍摄流畅的视频和运动物体。 三轴云台&#xff1a;全面支持所有旋转轴&#xff0c;…

Centos系统迁移

目前&#xff0c;CentOS 全系列版本已经于l六月底正式停止维护&#xff0c;这意味着 CentOS 时代彻底终结&#xff0c;也意味着部署在 CentOS 7 上的业务系统将面临前所未有的安全挑战。 本文推荐由红帽衍生出来的且可以做到真正无缝替代的linux版本Open Euler 注&#xff1a…

鸿蒙应用实践:利用扣子API开发起床文案生成器

前言 扣子是一个新一代 AI 应用开发平台&#xff0c;无需编程基础即可快速搭建基于大模型的 Bot&#xff0c;并发布到各个渠道。平台优势包括无限拓展的能力集&#xff08;内置和自定义插件&#xff09;、丰富的数据源&#xff08;支持多种数据格式和上传方式&#xff09;、持…

JAVA小知识31:多线程篇2

一、等待唤醒机制 生产者和消费者&#xff0c;也叫等待唤醒机制。他是一个十分经典的多线程协作的模式。我们来讲一个小故事&#xff1a; 在一个繁忙的工厂里&#xff0c;有一个生产线&#xff0c;我们称之为“共享资源”。这个生产线一次只能生产一个产品&#xff0c;而且需要…

等保2.0 实施方案

一、引言 随着信息技术的广泛应用&#xff0c;网络安全问题日益突出&#xff0c;为确保信息系统安全、稳定、可靠运行&#xff0c;保障国家安全、公共利益和个人信息安全&#xff0c;根据《网络安全法》及《信息安全技术 网络安全等级保护基本要求》&#xff08;等保2.0&#x…

SQL Server和Oracle数据库的实时同步

数据同步在大数据应用中扮演着关键角色&#xff0c;它确保了数据的实时性和一致性&#xff0c;为数据分析和决策提供了重要支持。常见的数据同步方式包括ETL实时同步和实时ETL工具&#xff0c;后者可以基于日志追踪或触发器进行分类。不同的数据库系统针对实时同步也有各自的实…

打破数据生产力的桎梏,打造数据分析驱动的新型组织

在当前的经济环境下&#xff0c;各行业面临着前所未有的挑战&#xff0c;降本增效成为企业普遍追求的目标。数字化转型被视为实现这一目标的关键路径。通过数字化手段&#xff0c;企业能够探索新的增长机会&#xff0c;提升运营效率&#xff0c;并有效控制成本支出。在这一转型…

电影解说 剪辑实战带货全新蓝海市场,电影解说实战课程(16节)

课程目录 1-影视解说自媒体带货新玩法_1.mp4 2-影视解说选品及解说规范标准_1.mp4 3-电影解说的脚本模版及流程_1.mp4 4-电影解说编写文案及爆火规律_1.mp4 5-手把手教你影视素材哪里找_1.mp4 6-影视解说剪辑、配音及创收方式_1.mp4 7-电影解说剪辑的实操课程A_1.mp4 8…

Zabbix 配置SNMP监控

Zabbix SNMP监控介绍 Zabbix提供了强大的SNMP监控功能&#xff0c;可以用于监控网络设备、服务器和其他支持SNMP协议的设备。SNMP&#xff08;Simple Network Management Protocol&#xff0c;简单网络管理协议&#xff09;是一种广泛用于网络管理的协议。它用于监控网络设备&…

SRC通杀小技巧-巧用域名“横向移动“

文章目录 前言还是DevOps做个字典&#xff1f; 前言 周末闲暇时间无聊顺便挖挖洞,低危小子的我叒找到个低危&#xff0c;本想着一个低危实在是食之无味&#xff0c;弃之又可惜&#xff0c;打算将域名先存起来&#xff0c;等过段时间有活动一块交&#xff0c;就在复制域名的时候…

【人工智能】GPT-5的即将到来:从高中生进化到,,,博士生?

GPT-5的即将到来&#xff1a;从高中生进化到,博士生&#xff1f; 随着近月GPT-4o的出世&#xff0c;OpenAI也在进行一系列的采访和介绍接下来的展望和目标。 在6月22日的采访中&#xff0c;美国达特茅斯工程学院公布了OpenAI首席技术官米拉穆拉蒂的访谈内容。穆拉蒂确认&#…

嵌入式上gst rtsp server opencv mat

0 安装gstreamer sudo apt install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-…

PhysioLLM 个性化健康洞察:手表可穿戴设备实时数据 + 大模型

个性化健康洞察&#xff1a;可穿戴设备实时数据 大模型 提出背景PhysioLLM 图PhysioLLM 实现数据准备用户模型和洞察生成个性化数据总结和洞察是如何生成的&#xff1f; 解析分析 提出背景 论文&#xff1a;https://arxiv.org/pdf/2406.19283 虽然当前的可穿戴设备伴随应用&…

uniapp应用如何实现传感器数据采集和分析

UniApp是一种跨平台的应用开发框架&#xff0c;它支持在同一份代码中同时开发iOS、Android、H5等多个平台的应用。在UniApp中实现传感器数据采集和分析的过程可以分为以下几个步骤&#xff1a; 引入相关插件或库 UniApp通过插件或库的形式扩展功能。对于传感器数据采集和分析&…

【APK】SDKManager运行后闪退

本地JDK已安装&#xff0c;且配置了环境变量&#xff0c;未安装 android studiio 问题描述&#xff1a;右键以管理员身份运行 SDKManager&#xff0c;终端窗口闪退 问题原因&#xff1a;未找到正确的Java路径 解决办法&#xff1a; 1.修改tools目录下的 android.bat 文件&am…

数字人直播源码开发全攻略揭秘:如何搭建自己的数字人直播平台?

当前&#xff0c;数字人直播逐渐成为众多中小型企业线上带货和品牌宣传的不二之选&#xff0c;而艾媒研究数据也显示&#xff0c;超五成以上的被调查群体的企业使用过虚拟人技术&#xff0c;超三成被调查群体的企业计划使用虚拟人技术。在此背景下&#xff0c;越来越多的创业者…

10计算机视觉—物体检测算法

目录 1.R-CNN(区域卷积神经网络)2014兴趣区域(RoI)池化层Fast RCNN 2015Faster R-CNN 2015Mask R-CNN 2017总结2. SSD(单发多框检测)2016SSD模型总结3.YOLO(你只看一次)快!很重要4.目标检测算法性能对比5.SSD代码实现 使用很少,比不上yolo多尺度锚框实现SSD代码实现训练…

DOM 中包含哪些重要方法

1. alert 带有指定消息的警告框 alert("hello world"); 2. confirm 带有确定和取消的对话框&#xff0c;点击确定返回 true&#xff0c;点击取消返回 false confirm("你好吗"); 3. prompt 显示一个提示框&#xff0c;允许用户输入文本&#xff0c;点击…