0.0319用分数表示,LLM加权量化实践[GPT-2]

相信大家对于LLM加权量化实践[GPT-2]以及0.0319用分数表示这类的热门话题,都想是很了解,那就让小编带各位来讲解一下吧!


大规模语言模型法学硕士以其广泛的计算要求而闻名。通常,模型的大小是通过将参数数量乘以这些值的精度来计算的。但是,为了节省内存,您可以使用较低精度的数据类型通过称为量化的过程来存储权重。


我们区分文献中两种主要的权重量化技术


训练后量化PTQ训练后量化是一种简单的技术,可以将训练模型的权重转换为较低的精度,而无需重新训练。尽管PTQ很容易实现,但它会带来潜在的性能损失。


量化感知训练通过在预训练或微调步骤中纳入权重转换过程来提高模型性能。然而,QAT的计算成本很高,并且需要有代表性的训练数据。


在本文中,我们重点关注PTQ来降低参数精度。为了获得良好的直觉,我们将使用GPT-2模型将简单和更复杂的技术应用于玩具示例。


完整的代码可在GoogleColab和GitHub上免费获得。


NSDT在线工具推荐ThreejsAI纹理开发套件-YOLO复合数据生成器-GLTF/GLB在线编辑-3D模型格式在线转换-可编程3D场景编辑器


1.浮点数表示


您选择的数据类型决定了所需的计算资源量,从而影响模型的速度和效率。在深度学习应用中,平衡准确性和计算性能成为一项重要任务。这是因为更高的精度通常意味着更大的计算要求。


在各种数据类型中,浮点数由于能够高精度地表示各种值,因此主要用于深度学习。通常,浮点数使用n位来存储数值。这n位进一步分为三个独立的组成部分


符号符号位指示数字是正数还是负数。它使用1位,其中0代表正数,1代表负数。


指数指数是代表底数幂的一位。指数也可以是正数或负数,允许数字表示非常大或非常小的值。


有效数字/尾数剩余位用于存储有效数字,也称为尾数。这表示数字的有效数字。数字的精度主要取决于有效数字的长度。


这种设计允许浮点数以不同的精度级别覆盖广泛的值。该表达式中使用的公式为


为了更好地理解这一点,我们来看看深度学习中最常用的数据类型float32FP32、float16FP16和bfloat16BF16。


FP32使用32位来表示数字。1位是符号,8位是指数,其余23位是有效数。FP32提供高精度,但具有计算量和内存占用量高的缺点。


FP16使用16位来存储数字。1位是符号,5位是指数,10位是有效数。这提高了内存效率并加快了计算速度,但减少范围和精度可能会导致数值不稳定,从而影响模型的准确性。


BF16也是一种16位格式,但使用1位用于符号,8位用于指数,7位用于有效数字。与FP16相比,BF16扩大了可表示范围,降低了下溢和上溢的风险。尽管由于有效数字的减少导致准确性降低,但BF16通常不会对模型性能产生重大影响,对于深度学习任务来说是一个有用的折衷方案。


在机器学习术语中,FP32通常被称为“全精度”,而BF16和FP16被称为“半精度”。但是我们可以做得更好并使用单个字节存储权重吗?案是INT8数据类型,它由8位表示组成,可以存储2=256个唯一值。在下一节中,我们将了解如何将FP32权重转换为INT8格式。


2.简单的8位量化


在本节中,我们实现两种量化技术使用绝对最大绝对值量化的对称技术和使用零点量化的非对称技术。在这两种情况下,目标都是将FP32张量X映射到INT8张量X_Quant。


Absmax量化通过将原始数字除以张量的绝对最大值并乘以系数127,将输入映射到范围[-127,127]。要检索原始FP16值,请将INT8数字除以量化因子,承认由于舍入而造成的一些精度损失。


例如,假设绝对最大值为32。权重01被量化为round01127/32=4。逆量化得到432/127=01008,这意味着误差为0008。对应的Python实现是


importtorchdefabsmax_quantizeX:量化X_Quantize=有比例。这两个功能适用于真实模型,而不是依赖于完整的玩具示例。


首先,加载GPT-2的模型和分词器。这是一个非常小的模型,我们不想量化,但对于本教程来说已经足够了。我们首先要观察模型的大小以便稍后进行比较,并评估8位量化带来的内存节省。


!pipinstall-qbitandbytesgt;=0390!pipinstall-qgit+


原始权重张量[[-04738,-02614,-00978,00513,-00584,00250],[00874,01473,02387,-00525,-00113,-00156],[00039,00695,03668,01143,00363,-00318],[-02592,-00164,01991,00095,-00516,00319],[01517,02170,01043,00293,-00429,-00475],[-04100,-01924,-02400,-00046,00070,00198]]Absmax量化权重张量[[-21,-12,-4,2,-3,1],[4,7,11,-2,-1,-1],[0,3,16,5,2,-1],[-12,-1,9,0,-2,1],[7,10,5,1,-2,-2],[-18,-9,-11,0,0,1]],dtype=torchint8零点量化权重张量[[-20,-11,-3,3,-2,2],[5,8,12,-1,0,0],[1,4,18,6,3,0],[-11,0,10,1,-1,2],原始值FP32和量化值INT8的[8,11,6,2,-1,-1],[-18,-8,-10,1,1,2]],dtype=torchint8区别在于非常小虽然很明显,但绝对最大重量和零点重量之间的差异更为微妙。在本例中,输入显示为偏移值-1。这表明该层的权重分布是高度对称的。


我们可以通过量化GPT-2的每一层并创建两个新模型来比较这些技术model_abs和model_zp。准确地说,我们实际上将用反量化后的权重替换原始权重。这样做有两个好处1比较权重分布,2实际运行模型。


事实上,PyTorch默认不允许INT8矩阵乘法。在现实场景中,我们将对其进行反量化以运行模型,但将其存储为INT8。下一节我们将使用bitandbytes库来解决这个题。


importnumpyasnpfromcopyimportdeepcopyquantizemodel_abs=deepcopymodel生成模型quantizemodel_zp=deepcopymodel39;pt使用原始模型和量化模型生成文本original_text=generate_textmodel,34;absmax_text=generate_textmodel_abs,34;zp_text=generate_textmodel_zp,34;printf34;print34;50printf34;打印34;50printf34;输出结果如下


我现有型号为Dre。


除非特别注明,本站所有文字均为原创文章,作者:admin

No Comment

留言

电子邮件地址不会被公开。 必填项已用*标注

感谢你的留言。。。