三、LLM权重参数进行量化和反量化
量化作用于模型的权重、参数和激活值。
为了简化,我们将在Pytorch示例中仅对权重参数进行量化。先快速浏览一下量化后Transformer模型中权重参数值的变化。
我们对16个原始权重参数从FP32到INT8进行了量化,内存占用从512位减少到128位(减少了25%)。对于大模型来说,减少幅度会更显著。
下面,你可以看到数据类型(如FP32、带符号的INT8和无符号的UINT8)在实际内存中的分布。我已经在2的补码中进行了实际计算。欢迎你自己练习计算并验证结果。
非对称量化代码:让我们一步步编写代码。
我们首先将随机值赋给原始权重张量(大小:4x4,数据类型:FP32)
# !pip install torch; 安装torch库,如果你还没有安装的话
# 导入torch库
import torch
original_weight = torch.randn((4,4))
print(original_weight)
定义两个函数,一个用于量化,另一个用于反量化
def asymmetric_quantization(original_weight):
# 定义你想要量化的数据类型。在我们的示例中,是INT8。
quantized_data_type = torch.int8
# 从原始的FP32权重中获取Wmax和Wmin值。
Wmax = original_weight.max().item()
Wmin = original_weight.min().item()
# 从量化数据类型中获取Qmax和Qmin值。
Qmax = torch.iinfo(quantized_data_type).max
Qmin = torch.iinfo(quantized_data_type).min
# 使用缩放公式计算缩放值。数据类型 - FP32。
# 如果你想了解公式的推导过程,请参考本文的数学部分。
S = (Wmax - Wmin)/(Qmax - Qmin)
# 使用零点公式计算零点值。数据类型 - INT8。
# 如果你想了解公式的推导过程,请参考本文的数学部分。
Z = Qmin - (Wmin/S)
# 检查Z值是否超出范围。
if Z < Qmin:
Z = Qmin
elif Z > Qmax:
Z = Qmax
else:
# 零点的数据类型应与量化后的值相同,为INT8。
Z = int(round(Z))
# 我们有了original_weight、scale和zero_point,现在我们可以使用数学部分推导出的公式计算量化后的权重。
quantized_weight = (original_weight/S) + Z
# 我们还将对其进行四舍五入,并使用torch clamp函数,确保量化后的权重不会超出范围,并保持在Qmin和Qmax之间。
quantized_weight = torch.clamp(torch.round(quantized_weight), Qmin, Qmax)
# 最后,将数据类型转换为INT8。
quantized_weight = quantized_weight.to(quantized_data_type)
# 返回最终的量化权重。
return quantized_weight, S, Z
def asymmetric_dequantization(quantized_weight, scale, zero_point):
# 使用本文数学部分推导出的反量化计算公式。
# 还要确保将量化后的权重转换为浮点型,因为两个INT8值(quantized_weight和zero_point)之间的减法会产生不期望的结果。
dequantized_weight = scale * (quantized_weight.to(torch.float32) - zero_point)
return dequantized_weight
我们将通过调用 asymmetric_quantization 函数来计算量化后的权重、缩放值和零点。你可以在下面的截图中看到输出结果,注意量化后的权重数据类型为int8,缩放值为FP32,零点为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}")
现在我们已经有了量化权重、缩放值和零点的所有值。 让我们通过调用 asymmetric_dequantization 函数来获得反量化后的权重值。注意反量化后的权重值为FP32。
dequantized_weight = asymmetric_dequantization(quantized_weight, scale, zero_point)
print(dequantized_weight)
让我们通过计算它们之间的量化误差,找出最终反量化后的权重值与原始权重张量相比的准确性。
quantization_error = (dequantized_weight - original_weight).square().mean()
print(quantization_error)
对称量化和非对称的差不多,唯一需要更改的地方是在对称方法中,始终确保 zero_input 的值为 0。这是因为在对称量化中,zero_input 值始终映射到原始权重张量中的 0 值。
上述的量化代码代码示例:
https://github.com/tamangmilan/llm_quantization/blob/main/llm_quantization_part_1.ipynb
基本的量化原理如上。
最后分享
学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。
这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享!
1. 成长路线图&学习规划
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。
2. 大模型经典PDF书籍
书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)
3. 大模型视频教程
对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。
4. 大模型项目实战
学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。
5. 大模型面试题
面试不仅是技术的较量,更需要充分的准备。
在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。
全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方CSDN官方认证二维码,免费领取【保证100%免费
】
如有侵权,请联系删除