Quantify LLM

news2024/11/27 14:50:32

大模型如果用bfloat16需要特别大的显存,所以都在用INT4、INT8做量化,效果不错

量化学习

为什么量化

对Llama13B模型来说,不同算子加载需要的显存不同

中间是TensorCore,左右两边是显存,加载过程中模型要频繁地将weight和激活值从显存加载到TensorCore,计算完后,又将结果放回到显存中

在大模型推理中,制约推理速度的关键因素是显存带宽,量化数据可以减小数据交换所用的时间

对称量化

INT8是-128~127,为了方便,丢掉-128

为了最大程度的保留精度,要尽可能把-127~127占满

首先找到绝对值最大的数:2.11,将它映射到最大的整数127,从而得到了一个缩放比例:2.11/127,从而其他数都按照这个比例缩放,然后取整

反量化时也按照缩放比例进行缩放

但是,这种量化方法并没有占满左边的整数,因此引入非对称量化

非对称量化

不映射到-128~127了,改成0~255

缩放比例为:

我们还需要计算一个,它的作用是对缩放取整后的变量进行平移,从而保证每个变量都在0~255之间

再经过一个clamp操作,确保缩放平移后的变量都在0~255之间

反量化过程则为量化值减去zero_point乘上scale

量化后的数据计算

对Xf和Wf进行对称量化

对Xf和Wf进行非对称量化

量化异常值

这种情况下,即使使用非对称量化,仍然有很大一部分整数被浪费,同时,很多值被量化为同一整数

有很多工作可以解决这些问题,例如:用直方图描述数据分布、逐步舍弃一些异常值、计算量化前和量化后数据的均方误差或KL散度,找到合适的取值范围、单独对异常值进行量化、对channel量化、对group量化等

神经网络量化

训练后动态量化(pytorch)

在pytorch中,使用quantize_dynamic方法,输入模型、需要量化的层、量化类型就可以量化了

可以看到torch.qint8中,量化使用的参数是和量化后数值存放在一起的,方便随时进行反量化

为什么qint8中的值不是整数?因为输出的是qint8反量化后的值,要打印整数值需要用torch.int)repr函数

存在的问题:(1)每一次推理每一层都要对输入统计量化参数,耗时(2)每一层计算完都转化为fp32,存入显存,占用显存带宽

训练后静态量化(pytorch)

(1)动态量化之所以只量化参数,不量化输入,是因为输入总是会变的。针对这个问题的解决方法是:用有代表性的输入数据跑一遍整个网络,认为这些输入就代表了真实推理时的输入,通过统计得到每层大概的量化参数

(2)动态量化每次计算完都要转成fp32,解决方法是:这一层的输出是下一层的输入。下一层还是要量化,不如在这一层直接量化好再传给下一层

左边在量化输入,右边在量化权重(放在train之后)

(1)定义一个QuantStub量化占位符和一个DeQuantStub反量化占位符,并在forward部分调用

(2)为模型设置一个适合在x86架构下运行的量化配置,prepare生成带量化的模型

(3)用有代表性的数据对模型各层激活值的量化参数进行校准,这里直接前向传播就行

(4)convert转换成int8的量化模型

量化感知训练

对训练好的模型,无论怎么量化,总是会有误差。减少误差不正是神经网络擅长的吗?是否有一种通过模型训练的办法来减少误差?

在网络训练过程中,模拟量化,让模型在训练过程中就能调整参数,让它更适合量化,提高量化后模型的精度

prepare函数变成了prepare_qat,QAT就是Quantization-aware-training

大模型量化

黄色的是传统量化方法,蓝色的8bit是hf transformers中默认的LLM.int8()方法,绿色的是float

16

为什么参数量到一定量级后,传统方法失效?这是由Emergent Features引起的。Emergent Features是指在一些层的模型输出的特征里,有些特征突然变大,是其他特征的几十倍

对大模型而言,它有很多Emergent Features,这些大的特征代表大模型在学习过程中学到的重要特征。可以看到,因为这些特别大的异常值,导致其他某些特征量化+反量化后的值变为同一个了

LLM.int8()将这些Emergent Features单独处理,再汇总结果

对于矩阵乘法,可以把行和列拆出来分别运算,再加起来

在LLM.int8()中,取大于6的为异常值,发现异常列的占比不到0.1%

对输入按行进行量化,对权重按列进行量化,对Emergent Features用fp16计算

Transformers

使用bitsanbytes库

在transformers源码中的modeling_utils文件中有一个replace_with_bnb_linear方法用于替换算子

以Llama为例,MLP有三个线性层,Attn有四个线性层

大部分的算子都是线性层

替换掉的是线性层和1D卷积

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【移动端】事件基础

一、移动端事件分类 移动端事件主要分为以下几类: 1. 触摸事件(Touch Events) 触摸事件是移动设备特有的事件,用来处理用户通过触摸屏幕进行的操作。主要的触摸事件有: touchstart:手指触摸屏幕时触发。…

k8s 之动态创建pv失败(踩坑)

作者:程序那点事儿 日期:2024/02/05 18:53 初学容易范的错! 问题简述: StorageClass创建成功,StatefulSet 启动不成功,与pvc关联的po和pvc一直是pending状态。 也就是说,StorageClass没有动态…

MQTT--Java整合EMQX

目录 1、简介2、准备3、使用步骤3.1 引入依赖3.2 创建生产者和消费者3.3 测试 总结PS: 1、简介 本文章实现了一个简单的MQTT客户端,使用Eclipse Paho库让Java和EMQX整合,测试客户端初始化时配置Broker地址、客户端ID、用户名和密码。连接成功后&#xf…

python sqlite3 工具函数

起因, 目的: sqlite3 最常用的函数。 比如,某人给了一个 database.db 文件。 但是你登录的时候,不知道账号密码。 此文件就是,查看这个数据库的详细内容。 有哪些表某个表的全部内容。添加数据 代码, 见注释 impor…

字节跳动收购Oladance耳机:强化音频技术,加速VR/AR生态布局

字节跳动收购Oladance耳机:加码VR/AR领域布局 近日,字节跳动宣布已完成对开放式耳机品牌Oladance的收购,实现了对该品牌的100%控股。这一收购标志着字节跳动在AI硬件领域的进一步扩展和深化,特别是对其VR/AR领域布局的重要加码。 …

python之运算符

1、算术运算符 算术运算符常用的有&#xff1a;&#xff0c;-&#xff0c;*&#xff0c; &#xff0c;/&#xff0c;//&#xff0c;%&#xff0c;>>,<< 1.1、加 常见的是算术相加&#xff0c;还有一种是字符串拼接。 a 10 b 20 print(a b) c "My &quo…

css 简单网页布局——浮动(一)

1. 三种布局方式 1.1 标准流 1.2 浮动的使用 1.3 简述浮动 1.3.1 浮动三大特性 <style>.out {border: 1px red solid;width: 1000px;height: 500px;}.one {background-color: aquamarine;width: 200px;height: 100px;}.two {background-color: blueviolet;width: 200px;h…

如何在算家云搭建CosyVoice(文生音频)

一、CosyVoice简介 CosyVoice 是一个开源的超强 TTS&#xff08;‌文本转语音&#xff09;‌模型&#xff0c;‌它支持多种生成模式&#xff0c;‌具有极强的语音自然可控性。‌ 具有以下特点&#xff1a; 语音合成 &#xff1a;能够将文本转换为自然流畅的语音输出。多语种…

让你的Github Profile高大时尚!

目录 前言 正文 GitHub Profile 特点&#xff1a; GitHub Actions 核心概念&#xff1a; 应用场景&#xff1a; RSS RSS的主要特点&#xff1a; 使用场景&#xff1a; RSS的工作原理&#xff1a; 关于Github Readme Card 关于Github贡献的3D图 关于个人最新博文的获取 关于代码…

今日指数-day08实战完整代码

今日指数-day08 1. 个股最新分时行情数据 1.1 个股最新分时行情功能说明 1&#xff09;个股最新分时行情功能原型 2&#xff09;个股最新分时行情数据接口分析 功能描述&#xff1a;获取个股最新分时行情数据&#xff0c;主要包含&#xff1a;开盘价、前收盘价、最新价、最…

(作业)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第4关---InternLM + LlamaIndex RAG 实践

基础任务 (完成此任务即完成闯关) 任务要求&#xff1a;基于 LlamaIndex 构建自己的 RAG 知识库&#xff0c;寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答&#xff0c;借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答 A 的能力&#xff0c;截…

【MaskGAN】MaskGAN: Towards Diverse and Interactive Facial Image Manipulation

文章目录 MaskGAN: Towards Diverse and Interactive Facial Image Manipulationkey points贡献方法密集映射网络DMN编辑行为模拟训练多目标学习CelebAMask-HQ数据集实验消融实验总结MaskGAN: Towards Diverse and Interactive Facial Image Manipulation 会议/期刊:CVPR 202…

磁盘存储链式结构——B树与B+树

红黑树处理数据都是在内存中&#xff0c;考虑的都是内存中的运算时间复杂度。如果我们要操作的数据集非常大&#xff0c;大到内存已经没办法处理了该怎么办呢&#xff1f; 试想一下&#xff0c;为了要在一个拥有几十万个文件的磁盘中查找一个文本文件&#xff0c;设计的…

测试-BUG篇

文章目录 软件测试的生命周期BUGbug的概念描述bug的要素bug级别bug的生命周期 与开发产生争执怎么办&#xff08;高频考题&#xff09; 软件测试的生命周期 软件测试贯穿于软件的整个生命周期 BUG bug的概念 是指计算机程序中存在的一个错误(error)、缺陷(flaw)、疏忽(mista…

容器领航者:Kubernetes集群部署秘籍

目录 前言 一、ubernetes简介 1.1 应用部署方式演变 1.2 容器编排应用 1.3 kubenetes简介 二、Kubernetes核心概念 2.1 K8S各个组件用途 2.2 K8S 各组件之间的调用关系 2.3 K8S 的常用名词感念 2.4 k8S的分层架构​编辑 三、部署前的准备 3.1 k8s中容器的管理方式 3…

自然种子启发,4D 打印软机器人,环境探索新工具

想象一下&#xff0c;一颗小小的种子&#xff0c;竟能成为软机器人的灵感源泉&#xff01;在科技的奇妙世界里&#xff0c;受牻牛儿苗科种子启发&#xff0c;研究人员利用 4D 打印技术&#xff0c;打造出了具有独特性能的软机器人——《4D Printing of Humidity‐Driven Seed I…

免费!推荐10个可商用模特图片素材网站!

平时我也会用到一些可商用的模特图片素材&#xff0c;包括正版商用和免费商用的都有&#xff0c;接下来罗列国内外10个主流图片下载站点&#xff0c;保证你可以快速得到你想要的正版模特素材&#xff01; 1.包图网 传送门&#xff1a;https://ibaotu.com/sy 国内的一个高清分…

Acwing 区间DP 计数类DP

1.区间DP Acwing 282.石子合并 思路分析&#xff1a; f(i,j)表示将第i堆石子到第j堆石子合并为一堆时的最小代价&#xff1b;状态划分&#xff1a;选一个分割点k&#xff0c;将[i-k]和[k1,j]这两个区间的石子合并&#xff0c;然后加上两个区间的合并总代价&#xff08;采用…

在线Xpath匹配定位测试工具

具体请前往&#xff1a;在线Xpath-匹配-定位-调试/测试工具

速速收藏!这些2024年上映的AI电影与短剧,申请加入你的国庆假期宅家计划!

2024年上映的AI电影 01 科幻惊悚电影《致命AI Afraid》 导演&#xff1a;克里斯韦兹上映日期:2024-08-30(美国)片长:84分钟剧情简介&#xff1a;Curtis一家被选中去测试一种革新性的居家设备&#xff1a;数字家庭助手AIA&#xff0c;包括各种感应设备和摄像头等&#xff0c;…