LLM:混合精度量化概述

news2024/9/22 9:54:25

浮点数在计算机中的存储方式由符号位(sign)、指数位(exponent)和小数位(fraction,也称为尾数、mantissa)组成。以下是对这些部分的详细说明:

  1. 符号位(Sign Bit)

    • 占用1个位元,用于表示浮点数的正负。
    • 如果符号位为0,则表示浮点数为正数;如果符号位为1,则表示浮点数为负数。
  2. 指数位(Exponent Bits)

    • 指数位的数量取决于浮点数的精度,例如单精度浮点数(32位)有8个指数位,而双精度浮点数(64位)有11个指数位。
    • 指数位用于表示浮点数的范围。为了便于表示正负指数,通常使用“偏移指数”或“偏移值”(Bias)来编码指数。例如,对于单精度浮点数,偏移值为127;对于双精度浮点数,偏移值为1023。
    • 实际的指数值计算方式为:存储的指数值减去偏移值。
  3. 小数位(Fraction Bits)

    • 小数位数决定了浮点数的精确度,即可以表示的有效数字的数量。
    • 在IEEE 754标准中,小数部分是归一化的(Normalized),即最高位通常为1(在单精度和双精度浮点数中),这一位不存储,而是默认为1。这种存储方法被称为“隐式位”(Implicit Bit)。
    • 例如,在单精度浮点数中,小数部分实际上是24位长(包括隐式位),但只有23个位被显式存储。

在这里插入图片描述

不同精度浮点数格式

以下是几种常见数值精度的介绍,包括fp64、fp32、fp16、bf16、int8和int4:

1. FP64(Double Precision, 64-bit Floating Point)

  • 表示范围:约 ±1.8 × 10³⁰⁸
  • 精度:15-17位十进制数字
  • 结构
    • 符号位:1位
    • 指数位:11位
    • 小数位:52位
  • 特点:FP64提供了非常高的精度,适用于需要高精度计算的科学和工程应用,但计算资源消耗大,性能较低。

2. FP32(Single Precision, 32-bit Floating Point)

  • 表示范围:约 ±3.4 × 10³⁸
  • 精度:6-9位十进制数字
  • 结构
    • 符号位:1位
    • 指数位:8位
    • 小数位:23位
  • 特点:FP32是目前最常用的浮点数格式,提供了较好的精度与计算效率的平衡,广泛用于图形处理、神经网络训练等领域。
    在这里插入图片描述

3. FP16(Half Precision, 16-bit Floating Point)

  • 表示范围:约 ±6.5 × 10⁴
  • 精度:3-4位十进制数字
  • 结构
    • 符号位:1位
    • 指数位:5位
    • 小数位:10位
  • 特点:FP16具有较低的精度和表示范围,但计算速度快,内存占用小,常用于混合精度训练和推理加速。
    在这里插入图片描述

4. BF16(Brain Floating Point, 16-bit Floating Point)

  • 表示范围:约 ±3.4 × 10³⁸
  • 精度:与FP32相同的范围,但精度较低
  • 结构
    • 符号位:1位
    • 指数位:8位
    • 小数位:7位
  • 特点:BF16与FP32拥有相同的指数位数量,因此表示范围相同,但小数位减少到7位。虽然精度较低,但它更适合深度学习训练,因为它的范围更广且与FP32兼容。
    在这里插入图片描述

5. INT8(8-bit Integer)

  • 表示范围:-128到127(有符号),0到255(无符号)
  • 精度:整数
  • 结构
    • 全部用于表示整数值(无符号或有符号)
  • 特点:INT8是一种定点数格式,用于对浮点数的量化,极大地减少了模型的存储需求和计算量。常用于推理阶段的加速和模型部署。

6. INT4(4-bit Integer)

  • 表示范围:-8到7(有符号),0到15(无符号)
  • 精度:整数
  • 结构
    • 全部用于表示整数值(无符号或有符号)
  • 特点:INT4进一步压缩了数据表示范围和存储需求,适用于极低功耗和高效推理的场景。它是浮点数的极端量化形式,但由于其表示范围极小,通常需要结合专门的算法进行使用。

混合精度训练

在这里的混合精度训练,指代的是单精度 float和半精度 float16 混合。
float16和float相比恰里,总结下来就是两个原因:内存占用更少,计算更快。

Float16的问题:

1.数据溢出问题:Overflow / Underflow
在这里插入图片描述

2.舍入误差(Rounding Error)
在这里插入图片描述

解决方法

1.FP32 权重备份
这种方法主要是用于解决舍入误差的问题。其主要思路,可以概括为:weights, activations, gradients 等数据在训练中都利用FP16来存储,同时拷贝一份FP32的weights,用于更新
在这里插入图片描述
这主要是因为,在更新权重的时候,往往公式: 权重 = 旧权重 + lr * 梯度,而在深度模型中,lr * 梯度 这个值往往是非常小的,如果利用 fp16 来进行相加的话, 则很可能会出现上面所说的『舍入误差』的这个问题

2.Loss Scale
训练到了后期,梯度(特别是激活函数平滑段的梯度)会特别小,fp16 表示容易产生 underflow 现象。为了解决梯度过小的问题,论文中对计算出来的loss值进行scale,由于链式法则的存在,loss上的scale会作用也会作用在梯度上

3.提高算数精度
利用fp16进行乘法和存储,利用fp32来进行加法计算。 这么做的原因主要是为了减少加法过程中的舍入误差,保证精度不损失。

流程

在这里插入图片描述
在这里插入图片描述

模型量化

模型量化是指以较低的推理精度损失将连续取值(通常为float32或者大量可能的离散值)的浮点型权重近似为有限多个离散值(通常为int8)的过程。

通过以更少的位数表示浮点数据,模型量化可以减少模型尺寸,进而减少在推理时的内存消耗,并且在一些低精度运算较快的处理器上可以增加推理速度。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

GPTQ(Gradient-based Post-Training Quantization)

GPTQ 是一种后训练量化(PTQ)技术,旨在对模型权重进行4-bit的量化,主要用于提高GPU推理性能。GPTQ通过最小化每个权重的均方误差来实现压缩。在推理时,模型动态地将权重从int4反量化为float16,这样可以在保持低内存使用的同时提高性能。GPTQ的一个显著优势是,它能够在不显著影响模型精度的情况下,大幅度减少模型的大小和内存占用【37†source】【38†source】【40†source】。

GPTQ的主要步骤包括:

  1. 初始化:从预训练模型中加载数据,并设置量化配置(如位数、量化组大小等)。
  2. 权重量化:使用某种策略逐层处理权重矩阵,最小化量化引入的误差。
  3. 保存和反量化:在推理时,将量化后的权重动态反量化以执行计算。

AWQ(Activation-aware Weight Quantization)

AWQ 是一种激活感知的权重量化方法,旨在识别并保留那些对模型性能至关重要的权重。AWQ通过分析激活值的重要性,跳过一小部分对模型性能影响较小的权重,从而减少量化损失。这种方法尤其在4-bit量化下表现出色,能够在保持高性能的同时实现显著的加速【37†source】【39†source】。

AWQ的关键特点包括:

  1. 激活感知:识别出对模型输出影响较大的激活值,并优先进行量化。
  2. 选择性量化:仅对一部分权重进行量化,从而减少因量化带来的性能损失。

应用场景

这两种量化方法主要应用于大规模语言模型的部署和推理,尤其是在资源受限的环境下。GPTQ适用于需要极致压缩和推理加速的场景,而AWQ在需要保留重要模型特征的情况下效果更佳。

参考:
https://zhuanlan.zhihu.com/p/103685761
https://lulaoshi.info/deep-learning/train-speedup/mixed-precision.html#%E6%B7%B7%E5%90%88%E7%B2%BE%E5%BA%A6%E8%AE%AD%E7%BB%83
https://blog.csdn.net/wjjc1017/article/details/136274364
https://blog.csdn.net/qq_43814415/article/details/138316945
https://zhuanlan.zhihu.com/p/627436535
https://zhuanlan.zhihu.com/p/657886517
https://blog.csdn.net/penriver/article/details/136411485

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

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

相关文章

【Vue3】组件通信之props

【Vue3】组件通信之props 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日…

发送邮箱调用接口时需要注意哪些安全事项?

发送邮箱调用接口的使用方法?如何集成三方API接口? 无论是系统通知、用户注册验证还是营销邮件,这些功能都依赖于邮件发送接口的稳定和安全。然而,确保这些接口的安全性是至关重要的,AokSend将详细讨论在发送邮箱调用…

超13万律师使用的工具,启信宝推出“司法大数据”功能

合合信息旗下的启信宝,作为行业领先的商业查询APP,依托其3亿企业及机构的实时动态数据,涵盖工商、股权、司法、知识产权等多维度信息,推出了“司法大数据”功能。 随着大数据、人工智能技术的发展,律师行业已转型为开…

怎么写文献综述

怎么写文献综述 写文献综述是对已有文献资料进行系统性和批判性的评述和总结,以了解当前研究领域的研究成果和发展动态。 以下是撰写文献综述的一般步骤: 选择主题和目标: 确定你要综述的主题领域,并明确综述的目标和范围。这有…

蓝牙网关和蓝牙MESH总结

可参考: https://zhuanlan.zhihu.com/p/695144946 蓝牙网关 参考: https://www.bilibili.com/read/cv28872282/ 蓝牙网关是一种特殊的网络设备,它能够实现蓝牙设备与互联网或其他类型网络之间的数据传输和通信。通过蓝牙网关,用户…

Leetcode238. 除自身以外数组的乘积(java实现)

今天分享的题目是letcode238. 除自身以外数组的乘积 先来看题目描述: 本道题我最先想到的是先乘积所有的元素,然后除以所有元素,但是本题无法使用除法。 本题的解题思路是使用前缀积。 拿nums[]{1,2,3,4}; 先遍历前缀积,num[0]的…

Spring AOP总结

1、AOP(Aspect-Oriented Programming):面向切面编程让开发更高效。 工作中经常需要处理日志记录、事物管理、安全控制等跨越多个业务模块的公共逻辑。 它是一种编程的范式。它通过将跨多个业务模块的公共逻辑抽取并封装成独立的模块&#xf…

人工智能大模型综述学习笔记

目录 一、深度学习的局限性和大模型发展背景 二、大模型架构 1、多头自注意力机制 2、Transformer架构 三、常见大模型发展概况 1、语言大模型发展概况 掩码语言模型解释 因果语言模型解释 何时使用什么? 2、视觉-语言大模型 四、大模型的特点 1、大模型…

uni-app项目打包成H5部署到服务器

1. uni-app项目打包成H5部署到服务器 前端使用 uniapp开发项目完成后,需要将页面打包,生成H5的静态文件,部署在服务器上。这样通过服务器链接地址,直接可以在手机上点开来访问。   将项目打包成H5部署到服务器,然后链…

Java中类的构造

1.私有化成员变量。 2.空参构造方法。 3.带全部参数的构造方法。 4.get / set方法。 package demo;public class student{//1.私有化成员变量。//2.空参构造方法。//3.带全部参数的构造方法。//4.get / set方法。private String name;private int age;public student() {}pu…

基于SpringBoot+Vue的多媒体信息共享平台(带1w+文档)

基于SpringBootVue的多媒体信息共享平台(带1w文档) 基于SpringBootVue的多媒体信息共享平台(带1w文档) 随着武理多媒体信息共享平台的不断出现,用户需求不断增多,武理多媒体信息共享平台也不断的得到壮大。该系统主要是满足多方面的需求的实际需要&#…

MySQL案例:MHA实现主备切换(主从架构)万字详解

目录 MHA 概念 MHA的组成 特点 案例介绍 (1)案例需求 (2)案例实现思路 (3)案例拓扑图 (4)案例环境 案例步骤 基本环境配置 关闭防火墙和内核安全机制 安装数据库 授权…

数据结构——链式结构二叉树

目录 一、二叉树的链式结构 二、手动创建一棵链式二叉树 三、 二叉树的遍历 (1)前序遍历(先序遍历) (2)中序遍历 (3)后序遍历 四、二叉树的有关函数 (1)头文件 (…

【机器学习】逻辑回归的梯度下降以及在一变量数据集、两变量数据集下探索优化的梯度下降算法

引言 在机器学习中,逻辑回归是一种用于二分类问题的方法。它使用逻辑函数(也称为sigmoid函数)来预测属于某个类别的概率。逻辑回归的损失函数通常是交叉熵损失,用于衡量预测值与真实值之间的差异 文章目录 引言一、逻辑回归的梯度…

电机的伺服调试和pid调节有什么异同?

电机的伺服调试和PID调节在调节控制系统的精度和性能方面都是重要的,但它们有不同的侧重点和方法: 伺服调试 定义:伺服调试是指对伺服系统进行优化和调整,以确保其在控制对象(如电机)上的表现达到预期。伺…

《LeetCode热题100》---<5.②普通数组篇五道>

本篇博客讲解LeetCode热题100道普通数组篇中的六道题 第三道:轮转数组(中等) 第四道:除自身以外数组的乘积(中等) 第三道:轮转数组(中等) 方法一:使用额外的数…

KubeSphere 部署的 Kubernetes 集群使用 GlusterFS 存储实战入门

转载:KubeSphere 部署的 Kubernetes 集群使用 GlusterFS 存储实战入门 知识点 定级:入门级 GlusterFS 和 Heketi 简介 GlusterFS 安装部署 Heketi 安装部署 Kubernetes 命令行对接 GlusterFS 实战服务器配置(架构1:1复刻小规模生产环境,…

AI助力,轻松组建你的汽车梦之队!

咱汽车销售想增加目标客户,可不简单!市场竞争那叫一个激烈,吸引客户注意力太难了!不过别怕,咱有办法。我在 ai123.cn 这个平台上,找到了好多适合咱的 AI 工具和资源,这就跟大家分享分享。 比如说…

upload-labs漏洞靶场~文件上传漏洞

寻找测试网站的文件上传的模块,常见:头像上传,修改上传,文件编辑器中文件上传,图片上传、媒体上传等,通过抓包上传恶意的文件进行测试,上传后缀名 asp php aspx 等的动态语言脚本,查…

基于C语言从0开始手撸MQTT协议代码连接标准的MQTT服务器,完成数据上传和命令下发响应(华为云IOT服务器)

文章目录 一、前言二、搭建开发环境三、网络编程基础概念科普3.1 什么是网络编程3.2 TCP 和 UDP协议介绍3.3 TCP通信的实现过程 四、Windows下的网络编程相关API介绍4.1 常用的函数介绍4.2 函数参数介绍4.3 编写代码体验网络编程 五、访问华为云IOT服务器创建一个产品和设备5.2…