模型量化与量化在LLM中的应用 | 得物技术

一、模型推理优化

随着模型在各种场景中的落地实践,模型的推理加速早已成为AI工程化的重要内容。而近年基于Transformer架构的大模型继而成为主流,在各项任务中取得SoTA成绩,它们在训练和推理中的昂贵成本使得其在合理的成本下的部署实践显得愈加重要。

大模型推理所面临的挑战主要有以下两点:

  • 巨大的内存(显存)需求,主要来自于模型本身参数和推理的即时需求。

    • 对于一个LLaMA2-30B的模型,载入显存其模型本身需要约60GiB的显存,推理过程中,单个token的KV cache 需要1.6MiB左右的显存:6656(layer dim) * 52(layer num) *2 (K & V) * 2(fp16, 2bytes);对于一个2048个token的请求则需要3.3GiB的显存。

  • 并行性较差,因为生成过程通常在时序上是一个串行的过程,导致decoding的过程较难并行,成为计算的瓶颈。

常见的推理优化方式有知识蒸馏(Knowledge Distillation,KD),剪枝(Pruning)和量化(Quantization),以及针对LLM的内存优化而提出的各种方案(如Flash Attention、Paged Attention等)。

蒸馏指通过直接构造小模型,作为学生模型,通过软标签与原标签结合的方式监督学习原模型的知识,从而使小模型具备与原模型相当的性能,最终用小模型代替大模型从而提高推理效率。

图片

【图片出处:Knowledge Distillation: A survey,2021,p2】

剪枝则是通过靠剪除模型中不重要的权重从而给模型“瘦身”,提高模型的推理效率,为了保证模型的能力,通常剪枝过程也需要伴随着模型基于训练数据的微调。根据剪除权重的维度不同,可以分为结构化剪枝(structured pruning)和非结构化剪枝(unstructured pruning)。

  • 结构化剪枝:通常按权重张量的某一或多个维度成块剪除不重要的通道,并保持正常的矩阵乘法;但因剪除的通道影响上下层的推理,需要检查网络的逻辑准确性。

  • 非结构化剪枝:随机剪除权重张量中的不重要的元素,因而它通常会保持原本的权重结构,而造成稀疏的乘法计算,但并不能适配于通用的硬件,因而需要专用的硬件才能实现加速。

目前剪枝在LLM中的应用较少,如以下基于Activation-aware的剪枝工作[1],主要是基于权重本身的的绝对值大小和输入张量的绝对值大小做非结构化剪枝,使权重张量本身稀疏化,而模型的精度损失也并不能达到工程化的要求。

图片

【图片出处:A simple and effective pruning approach for large language models,2021,p2】

再如下图最近结构化剪枝的工作[2],通过搜索的方法寻找模型中的子结构,并通过重训练以保持模型精度,剪枝后的模型的精度相比原模型有很大的降低,只能跟同等参数量(剪枝后)的其他较小模型比较以显示其方法的意义。

图片

【图片出处:  Sheared LLaMA: accelerating language model pre-training via structured pruning,2023,p3】

图片

【图片出处: huggingface/Sheared-llama-1.3B】

而量化之所以会成为神经网络以及LLM的首选,主要有以下的优点:

  • 降低显存的直观体现。

    • 一般LLM权重用FP16存储,而权重量化为int4之后,则直观上体积减小为原本的1/4(实际可能由于embeddings不量化,内存分配等一些原因会稍多一些),对显存的资源需求大大降低。

  • W4A16、W8A16等算子的加速,从而提升计算速度。

二、量化简介

base

量化的本质通常是将模型的参数,或整个模型的推理过程从浮点转化为整型。

量化参数通常由 scale 和 zero-point两个值构成,前者为浮点,后者为整型。设x为一个张量(它可以为权重,也可以是推理的中间变量),其量化过程可以表示如下,

图片

用b表示量化位宽,q{min}与q{max}分别表示整型值域的范围,例如int-8量化可以取[-128,127],即q{min}=-2^(b-1)=-128,q{max}=2^(b-1)-1=127,clamp(a;q{min},q{max})表示输入值a基于[q{min}, q{max}]范围的截断操作,x{int}表示量化后的结果,s和z表示量化参数scale和zero-point。 

图片

图片

【图片出处:A Survey of Quantization Methods for Efficient Neural Network Inference,2021,p5;An Introduction to Quantization of Large Language Models,p12】

而从整型到浮点的反量化过程如下,

图片

关于量化参数,有很多算法基于搜索,最优化,LKD(layer-by-layer 蒸馏)等各类算法计算其较优解,从而尽可能减少量化引起的精度损失;而最直接的计算scale 和方法即是基于张量元素min/max。

                                                  

以下是一段简单的代码表示张量x从fp32量化到int8整型,再反量化回fp32的示例:

x->x{int}->x_hat的过程的一个示例如下:

图片

量化前x:

                  

量化后x_hat:

图片

对称/非对称

相比于非对称量化,对称量化的定义是量化所映射的整型值域基于0值对称,即上述公式的zero-point为0,qmax = -qmin,从而使量化的表达形式更为简化。

非对称量化有利于充分利用量化范围。例如Conv+ReLU输出的激励张量,其值皆为正值,若使用对称量化,则浮点将全部映射到[0~127]范围,有一半的范围未使用,其量化精度不如非对称量化。

图片

【图片出处:A Survey of Quantization Methods for Efficient Neural Network Inference,2021,p5】

实际中往往选择对权重张量做对称量化,而对输入张量做非对称量化。以下是来自qualcomm 的量化白皮书中的分析,如权重和输入都选择非对称量化时,以Linear层的矩阵乘法为例,将表达式展开如下:

图片

  • 第一项是整型张量的乘法操作,是必须的即时操作;

  • 第三、四项的操作包含了scale,zero和整型权重的乘法,这些都是提前预知的,因而可以事先计算作为偏置加上;

  • 第二项的计算依赖x{int},是每次推理需要即时计算的,而这会造成额外算力。

因而当我们将权重量化改为对称量化时(zW=0),则上式简化为如下,即时计算时,只需要计算第一项的矩阵乘法,第二项是预先算好的偏置项:

图片

而当两者都是对称量化时的表达式,则简化如下:

图片

对比原模型中的浮点计算W{x},W{int}x{int}是整型与整型之间的乘法,后者在Nvidia GPU上的运算速度远快于前者,这是量化模型的推理速度大大加快的原因。

三、LLM的量化

Challenges in LLM Quantization

从模型表现的角度来讲,量化自始至终要解决的一个前提是,如何保持量化后模型的精度,即让模型的使用者觉得量化后的模型在推理效率提高的同时,还能保持原来的性能。

神经网络中需要量化的操作主要是卷积层Conv(x;W)和全连接层Wx,即主要是按上一部分描述的操作分别对W和x做的权重量化(Weight Quantization,WQ)和激励量化(Activation Quantization,AQ)。

而不同于CNN模型或者小型Transformer模型,基于Transformer的大模型的矩阵乘法产生的激励张量通常有较多的离群值(outliers),即离值分布的大多数点形成的点群较远的值, 这些绝对值较大但占比较低的元素值增加了量化难度。而如何取舍outliers通常是量化工作中的一大难点,若过分考虑之,则会因量化范围过大而降低量化的表达范围,若过分截断之,通常会因这些绝对值较大的值,在模型推理中对结果有较大影响,而导致模型效果变差,而后者在LLM的量化则尤为明显。

下图分别是Resnet18与Opt-13B的某层输入张量的元素值统计,sigma表示各自分布的标准差,Resnet18输入的极大值约为28sigma,且绝对值6sigma以外的比例在0.05%;而Opt-13B网络输入的极大值越为325sigma,且绝对值6sigma以外的比例在0.2%。从量化效果而言,Resnet18的int-8精度基本无损失,而Opt-13B的int-8模型的精度已崩塌。

图片

【图片出处:An Introduction to Quantization of Large Language Models,p20 】

在应对激励量化的挑战这方面,有一些方案尝试降低量化精度,比如SmoothQuant提出的思路。

图片

【图片出处:SmoothQuant,p4】

在矩阵乘法中,他们通过按比例缩小输入张量X的值,而将缩小的比例补偿给权重张量W,即把问题从量化X和W转化为了量化 X·diag(s^(-1))和diag(s)·W。从而在保证乘法运算的积保持不变的前提下,降低张量X的量化难度。而在实际工程中,这种量化方案引起的量化误差对大模型的推理效果仍然有比较明显的影响,即使在int-8精度量化亦有明显的误差。如以下对Llama2-7B的SmoothQuant应用结果显示其perplexity非常糟糕,难以在实际中应用。

图片

所以在目前工程部署中的实用方案,大多以weight-only的量化方案为主,即放弃activation的量化。

GPTQ

GPTQ是最早被工程化部署所接受的量化方案,W8A16或W4A16的量化效果在多数场景中都有与原模型较为接近的表现,而且其量化过程非常快。

量化过程

以矩阵乘法的基本单元操作为例,基于 weight-only量化前后的乘积的均方差,可以写出如下优化函数,

图片

W 是在Transformer 中的Linear层权重,X表示其对应的输入。离线量化的过程是逐模块(Transformer)逐层(Q,K,V,O,Fc1,Fc2)做量化。

参数和数据定义如下:

  • W∈R^{K×M},X∈R^{M×N},Y=W×X∈R^{K ×N}

  • calibrate set:部分数据用作推理,用于查看各层输入张量的值范围,并基于此量化。

具体量化过程如下:

  • 计算Hessian(上述优化函数对于W_hat的Hessian,而非反向传播中的Hessian),加入扰动项:

图片

  • act order sort(desc_act,值范围相近的column一起做量化),基于diag(H)对W基于M维度作列重排,同理,对应地H在两个维度上重排。

  • 求逆H^(-1)(cholesky分解)。

  • 对W沿维度M,从左到右逐块量化,block size B=128,其右侧还未量化部分基于H^(-1)更新,以补偿量化损失。

图片

  • (inner loop)针对每个block内部,逐列量化,计算误差,并对该block内部未量化的列,基于误差更新。

图片

图片

  • (outer loop)操作完该block,更新其后面的所有列:

图片

group_size

  • 若不指定group size,默认g=-1,以所有列为单位统计量化参数,并对每一行的权重做量化,对于W∈R^{K×M},量化参数的数量为K×1。

图片

  • 若指定group size,例如g=128,则会以每128列为单位统计量化参数,并对每一行的权重做量化,对于W∈R^{K×M},量化参数的数量为K×(M/g)。

图片

重排desc_act

根据Hessian Matrix H,基于diag(H)对W基于M维度作列重排。其目的是优先量化绝对值较大的activaiton对应的weight的列,这些列在推理中被视为更为影响结果的重要的列,因而希望在量化这些列时尽可能产生较小的误差,而将更多的量化误差转移到后面相对不重要的列中。

部分实验表明desc_act对量化损失的效果在多数的任务中是有效的trick。

图片

Perplexity of Pygmalion-7B with GPTQ [7]

【图片出处:https://huggingface.co/reeducator/vicuna-13b-free/discussions/22】

算子

严格来说基于weight-only的W4A16相比于原本的W16A16并没有太多效率的提升,而且推理中还加入了quant/dequant过程;而随着weight-only成为LLM量化的主流且应用越来越多,有很多开源的工作基于W4A16高效算子的编写为量化算法的推理提速赋能,比如GPTQ的python package AutoGPTQ已集成于开源工具exllama,后者基于triton和CUDA重写了量化乘法的并行计算。在exllama/exllama_ext/matrix.cuh可以看到dot_product8_h对out=W_hat·x=(W{int}-z)s·x=(W{int}-z)x·s的实现。

【图片出处:https://github.com/turboderp/exllama/blob/3b013cd53c7d413cf99ca04c7c28dd5c95117c0d/exllama_ext/matrix.cuh#L86】

AWQ

相比于GPTQ从最优化问题出发设计方案,AWQ是基于搜索提出的量化方案。

用Q(·)表示量化反量化过程,则修改前的量化过程如下:

图片

修改后,量化过程如下,加入了对W的缩放:

图片

搜索

AWQ 的全称为Activation-aware Weight Quantization, 即对Weight的量化过程考虑Activation的值的影响。其出发点也是基于在Weight的各个通道中,处理对应的Activtion的值较大的通道则相对重要,反之则相对不重要,进而通过乘以一个缩放系数Δ去体现其重要性,而Δ的值和范围则通过输入的activation的张量值设计。

图片

搜索的衡量标准依据Linear层量化前后输出结果的比较,取MSE结果最小者为最优解。

图片

效果

从模型表现效果方面,通过逐层 scale search 寻找最优的缩放系数,从而取量化误差最小的解,以下来自AWQ paper的效果比较,从Perplexity的角度,显示在两代Llama的测试上其量化结果稍优于GPTQ及GPTQ的排序版。

图片

【图片出处:AWQ, p6】

从实际任务的准确率来看,AWQ的准确率与GPTQ的act_order版本(GPTQ-R)相当,而速度优于后者。

图片

【图片出处:AWQ, p5】

从模型的计算性能方面,GPTQ因为有reorder操作,矩阵乘法是MV(matrix×vector),为不连续的内存访问,而AWQ不存在reorder操作,矩阵乘法为(matrix×matrix),速度更快。

四、总结

关于LLM的量化工作目前的SOTA performance,基本上都是基于weight-only 的量化模式,模型在GPU运行所需的显存降低是其主要的贡献。

从模型的表现来看,因为存在不可避免的量化损失,且LLM模型通常比传统的CNN模型对量化要敏感得多,虽然在很多任务上量化后的LLM表现与量化前差距不大,但是在一部分任务上可能依然无法胜任。

从模型的加速来看,weight-only的量化促使底层加速的工作基本上都在W4A16、W3A16、W8A16等乘法算子上的加速,从paper上提供的理论数据上来看通常相较于FP16模型只有 1.x ~3.x 倍速度的提升,而实际部署效果可能低于此数值,其加速效果远不如传统量化方法的W4A4、W8A8等全整型的乘法算子。

总体来说,LLM领域的量化工作还很初步,若在实际任务中对模型的表现精度要求十分高,更推荐单纯基于KV cache等方向提高单位显存吞吐量的算法和工具,如Flash Attention-2、Paged Attention等。

五、Reference

1. A Simple and Effective Pruning Approach for Large Language Models, 2023.

2. Sheared LLaMA: Accelerating Language Model Pre-training via Structured Pruning, 2023.

3. A White Paper on Neural Network Quantization, 2021.

4. SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models, 2023.

5. GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers, 2023.

6. AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration, 2023.

7. Some evaluation on GPTQ performance. 

 *文/xujiong

本文属得物技术原创,更多精彩文章请看:得物技术官网

未经得物技术许可严禁转载,否则依法追究法律责任!

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

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

相关文章

Git 如何修改已经推送的错误提交信息(有图有真相)

解决方案一:修改最新的提交信息 首先,我们来考虑最简单的情况:如果你在最近一次提交时输入了错误的提交信息,并且还没有进行下一次提交,那么你可以使用如下命令来修改最新的提交信息: $ git commit --ame…

VSCode SSH连接远程主机失败,显示Server status check failed - waiting and retrying

vscode ssh连接远程主机突然连接不上了,终端中显示:Server status check failed - waiting and retrying 但是我用Xshell都可以连接成功,所以不是远程主机的问题,问题出在本地vscode; 现象一: 不停地输入…

CPU架构

一、CPU组成 CPU内部由ALU(算术逻辑单元)、CU(控制器)、寄存器(PC、IR、PSW、DR、通用寄存器等)、中断系统组成,外部通过总线与控制总线、数据总线、地址总线进行相连,对数据和程序…

【保姆级讲解如何安装与配置Xcode】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

第十二章 案例二:配置Trunk,实现相同VLAN的跨交换机通信

1、实验环境 公司的员工人数已达到 100 人,其网络设备如图12.13所示,现在的网络环境导致广播较多网速慢,并且也不安全,公司希望按照部门划分网络,并且能够保证一定的网络安全性 图12.13 实验案例二拓扑图 其网络规划…

环境安装:python环境迁移(无网和有网)

前言 环境部署或迁移是一项简单而又考验应对能力的一项工作,需要考虑到网络环境的情况,无网环境下需要采取离线方式进行操作,有网环境则可以直接通过在线安装完成。 在进行Python环境迁移时,需要注意保持环境的一致性,…

Notion是什么,Notion软件下载,Notion官方网站在哪里?国内用户Notion怎么订阅升级会员?

Notion是什么 Notion,一款强大的多功能工具,可用于组织笔记、任务、项目、数据库和文档等。 Notion软件下载 这个到Notion官方网站下载就可以了。 怎么订阅Notion会员 注册好了Notion的账号,来到首页,点击设置,左边…

LED显示屏黑屏的常见原因及解决办法

LED显示屏在使用过程中偶尔会出现黑屏现象,可能由多种原因引起。以下是LED显示屏出现黑屏的主要情况及相应的解决办法: 1. 上电的瞬间就是黑的 原因:可能是因为上电过程中出现了一些异常情况,导致屏幕无法正常显示。 解决办法&…

如何保证Redis双写一致性?

目录 数据不一致问题 数据库和缓存不一致解决方案 1. 先更新缓存,再更新数据 该方案数据不一致的原因 2. 先更新数据库,再更新缓存 3. 先删除缓存,再更新数据库 延时双删 4. 先更新数据库,再删除缓存 该方案数据不一致的…

新手如何用Postman做接口自动化测试?

1、什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试,模拟人去操作软件界面,把人从简单重复的劳动中解放出来,本质是用代码去测试另一段代码,属于一种软件开发工作,已…

洗地机哪个牌子质量最好?四款年度口碑品牌盘点

在当今家庭生活中,洗地机技术的飞速发展给我们的日常带来了极大的便利。洗地机作为智能家居领域的佼佼者,其实用性和智能化程度受到越来越多消费者的欢迎。许多人在选洗地机时会纠结一个问题:洗地机哪个牌子质量最好? 洗地机怎么…

# 谷歌 Chrome 浏览器无法安装插件的解决方法

谷歌 Chrome 浏览器无法安装插件的解决方法 运用开发模式安装 安装步骤: 1、 将 XX.crx 插件的扩展名改成 .zip 或者 .rar 并解压到文件夹 XX 目录。 1)如:下载的 前端框架 vue.js 插件 nhdogjmejiglipccpnnnanhbledajbpd-6.6.1-Crx4Chro…

【AGX】Ubuntu20.04 + ROS_ noetic+ 大疆Mid360激光 雷达评测

大家好,我是虎哥,最近组装机器人,使用到了大疆孵化的圳市览沃科技有限公司(简称Livox览沃科技)推出的觅道系列全新混合固态激光雷达Mid-360,顺便试试效果,也记录一下使用入门过程。 "觅道M…

自然语言处理 (NLP) 和文本分析

自然语言处理 (NLP) 和文本分析:NLP 在很多领域都有着广泛的应用,如智能助手、语言翻译、舆情分析等。热门问题包括情感分析、命名实体识别、文本生成等。 让我们一起来详细举例子的分析讲解一下自然语言处理(NLP)和文本分析的应用…

基于java+springboot+vue实现的新闻资讯系统(文末源码+Lw)216

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,文章信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广…

String2⃣️-string类对象的修改操作

目录 string类对象的修改操作 1.push back ;append;operator 2.assign;insert 3.erase;replace 4.rfind 5.substr 6.c_str 补充 1.reverse(逆置 反转) 2.Sort string类对象的修改操作 1.push back …

【算法刷题 | 贪心算法07】4.29(用最少数量的箭引爆气球、无重叠区间)

文章目录 12.用最少数量的箭引爆气球12.1题目12.2解法:贪心12.2.1贪心思路12.2.2代码实现 13.无重叠区间13.1题目13.2解法:贪心13.2.1贪心思路13.2.2代码实现 12.用最少数量的箭引爆气球 12.1题目 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面…

Kafka 3.x.x 入门到精通(08)——对标尚硅谷Kafka教程

Kafka 3.x.x 入门到精通(08)——对标尚硅谷Kafka教程 5. Kafka优化5.1 资源配置5.1.1 操作系统5.1.2 磁盘选择5.1.3 网络带宽5.1.4 内存配置5.1.5 CPU选择 5.2 集群容错5.2.1 副本分配策略5.2.2 故障转移方案5.2.3 数据备份与恢复 5.3 参数配置优化5.4 数…

如何在WordPress中设置网站的SEO标题和描述

在WordPress中,想要让你的网站在搜索引擎结果中脱颖而出,设置优秀的SEO标题和描述至关重要。这不仅可以帮助搜索引擎更好地理解你的网站内容,还可以吸引更多的点击率和流量。而选择一款合适的SEO插件是实现这一目标的关键之一。让我们来看看两…

电路邱关源学习笔记——3.6结点电压法

1.结点电压法 以结点电压为未知量列写电路方程分析电路的方法。适用于结点较少的电路。 基本思想 选取结点电压为未知量,则KVL自动满足,无需列写KVL方程。各支路电流、电压可视为结点电压的线性组合。求出结点电压之后,便可方便地得到各支路…
最新文章