LLM大模型量化原理

news2024/9/28 13:17:42

大型语言模型(LLM)可以用于文本生成、翻译、问答任务等。但是,LLM 也非常大(显然,大型语言模型)并且需要大量内存。 这对于手机和平板电脑等小型设备来说可能具有挑战性。

可以将参数乘以所选的精度大小以确定模型大小(以字节为单位)。 假设我们选择的精度是 float16(16 位 = 2 字节)。 假设我们想使用 BLOOM-176B 模型。 我们需要 1760 亿个参数 * 2 字节 = 352GB 来加载模型!

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 

换句话说,要加载所有参数权重,我们需要 12 x 32GB 显存的机器! 如果我们想让LLM具有可移植性,这就太过分了。 减少LLM内存占用的技术就是为了克服这一难题而开发的。 最流行的技术包括:

  • 量化(quantization),涉及将 LLM 的权重转换为较低精度的格式,从而减少存储它们所需的内存。
  • 知识蒸馏(knowledge distillation),涉及训练较小的LLM来模仿较大的LLM的行为。 这可以通过将知识从较大的LLM转移到较小的LLM来完成。

这些技术使得LLM能够适应小内存。 这为在各种设备上使用LLM开辟了新的可能性。 今天我们来聊聊量化(敬请关注知识蒸馏)。

1、量化简介

让我们从一个简单的例子开始。 我们需要将 2023 转换为二进制:

如你所见,该过程相对简单。 为了存储数字 2023,我们需要 12位(1 位用于 + 或 - 符号)。 对于数字,我们可以使用 int16 类型。

将 int 存储为二进制和将 float 存储为二进制之间存在很大差异。 让我们尝试将 20.23 转换为二进制:

可以看到,浮点部分(尾数:mantissa)是按 1/2^n 的组合计算的,即使有 10 位专用于浮点部分,也无法非常精确地计算。 指数部分(指数:exponent)设置为 5 位,涵盖 32 以内的所有数字。总的来说,我们使用 16 位 (FP16) 来存储最接近 20.23 的值,但这是否是保持最接近 20.23 的最有效方法? 漂浮? 如果整个数字更大(例如 202.3)怎么办?

如果我们查看标准浮点类型,我们会注意到要存储 202.3,我们需要使用 FP32,从计算角度来看,这远远不合理。 相反,我们可以使用 bfloat16 将范围(指数)保存为 8 位,将精度(尾数)保存为 7 位。 这使我们能够扩大可能的小数范围,而不会损失太多精度。

需要明确的是,在进行训练时,我们需要尽可能达到的精度。 但是,将速度和大小优先于小数点后第六位对于推理来说是有意义的。

我们可以将内存使用量从 bfloat16 减少到 int8 吗?

2、零点量化和绝对最大量化

事实上,我们可以,并且有几种量化方法:

零点量化(zero-point quantization)通过将定点范围 (-1, 1) 转换为 int8 (-127, 127),然后将 int8 转换回 bfloat16 来节省一半的内存。

绝对最大量化(abs-max quantization)与零点量化类似,但我们没有设置自定义范围 (-1,1),而是将其设置为 (-abs(max), abs(max))。

让我们看一下这些量化如何在矩阵乘法的示例中使用,注意结果矩阵中数值的损失。首先看下未量化的精确矩阵乘法:

零点量化后的矩阵乘法:

绝对最大量化后的矩阵乘法:

3、异常数值分离计算

可以注意到,计算结果中较大的数值如 [-1579, -1780],量化后计算的损失比较大(零点量化后得到 [-1579, -1752],绝对最大量化后得到 [-1565,-1786])。 为了克服这些问题,我们可以单独处理离群的异常值:

正如你所看到的,结果更接近真实值。

4、量化到4个比特

但有没有一种方法可以在不损失太多质量的情况下使用更少的空间呢?

令我惊讶的是,有办法! 如果我们不是独立地将每个数字转换为较低类型,而是考虑错误并将其用于调整,会怎么样? 这种技术称为 GPTQ。

与之前的量化一样,我们尽可能找到最接近的小数匹配,使总转换误差尽可能接近于零。

下面是GPTQ近似的第一步:

我们以这种方式逐行填充矩阵:

结果与异常值分离计算相结合,提供了相当不错的结果:

5、量化方法比较

我们现在可以比较各种量化方法:

LLM.int8() 方法表现得非常好! GPTQ 方法会损失质量,但允许使用两倍于 int8 方法的 GPU 内存。

6、BitsAndBytes量化参数

在代码中,你可能会发现类似于以下内容:

from transformers import BitsAndBytesConfig

# Configure BitsAndBytesConfig for 4-bit quantization
bnb_config = BitsAndBytesConfig(
 load_in_4bit=True,
 bnb_4bit_use_double_quant=True,
 bnb_4bit_quant_type="nf4",
 bnb_4bit_compute_dtype=torch.bfloat16,
)
# Loading model in pre-set configuration
pretrained_model = AutoModelForCausalLM.from_pretrained(
 model_id,
 quantization_config=bnb_config,
)

参数说明如下:

  • load_in_4bit 标志指定模型应以 4 位精度加载。  
  • bnb_4bit_use_double_quant 标志指定应使用双量化。
  • bnb_4bit_quant_type 标志指定量化类型。
  • bnb_4bit_compute_dtype 标志指定计算数据类型。

7、结束语

总而言之,我们了解了小数如何存储在内存中、如何通过一些精度损失来减少内存占用,以及如何通过 4 位量化运行选定的模型。


原文链接:LLM的量化 - BimAnt

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

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

相关文章

手撕单链表(C语言)

目录 1.单链表的物理结构 2.头文件的实现 3.SList.c文件的实现 3.1尾插、创建节点 3.2打印 3.3头插 3.4尾删 3.5头删 3.6查找 3.7指定位置之前插入数据 3.8指定位置之后插入数据 3.9删除指定位置节点 3.10删除pos之后的节点 3.11销毁链表 4 所有的代码 1.单链表的物理结构 众所…

6.8完全二叉树的节点个数(LC222-E)

算法: 如果不考虑完全二叉树的特性,直接把完全二叉树当作普通二叉树求节点数,其实也很简单。 递归法: 用什么顺序遍历都可以。 比如后序遍历(LRV):不断遍历左右子树的节点数,最后…

小程序授权获取昵称

wxml: <form bindsubmit"formsubmit"><view style"width: 90%;display: flex;margin-left: 5%;"><view class"text1">昵称&#xff1a;</view><input style"width: 150px;margin-left: 30px;margin-top: 30px;…

【论文阅读笔记】Supervised Contrastive Learning

【论文阅读笔记】Supervised Contrastive Learning 摘要 自监督批次对比方法扩展到完全监督的环境中&#xff0c;以有效利用标签信息提出两种监督对比损失的可能版本 介绍 交叉熵损失函数的不足之处&#xff0c;对噪声标签的不鲁棒性和可能导致交叉的边际&#xff0c;降低了…

face_recognition:高准确率、简单易用的人脸识别库 | 开源日报 No.79

ageitgey/face_recognition Stars: 49.8k License: MIT 这个项目是一个使用 Python 编写的人脸识别库&#xff0c;可以从图片中识别和操作人脸。它基于 dlib 开发&#xff0c;并采用深度学习技术构建了最先进的人脸识别模型&#xff0c;在 Labeled Faces in the Wild 数据集上…

Redis(消息队列Stream)

Stream是一个轻量级的消息队列。 Redis中Stream的作用是提供一种高效的消息传递机制&#xff0c;允许多个消费者并行地消费消息&#xff0c;并且不会重复消费已经处理过的消息。它可以用于实现分布式任务队列、日志收集、实时数据处理等场景。Redis中的Stream支持多个消费者组…

【LeetCode刷题-滑动窗口】--992.K个不同整数的子数组

992.K个不同整数的子数组 思路&#xff1a; class Solution {public int subarraysWithKDistinct(int[] nums, int k) {return atMostKDistinct(nums,k) - atMostKDistinct(nums,k-1);}//最多包含K个不同整数的子区间个数private int atMostKDistinct(int[] a,int k){int len …

PS学习笔记——新建文档/修改文档

文章目录 新建文档文档属性像素/分辨率颜色模式背景内容高级选项存储预设 修改文档 新建文档 方法一&#xff1a;ctrlN快捷键可直接打开新建文档界面 方法二&#xff1a;点击菜单栏中 文件->新建&#xff0c;即可打开新建文档界面 文档参数可按需调节(标题可以提前设定或者…

反激变压器计算方法_笔记

反激变压器计算方法_笔记 匝数比原边电感选定磁芯线圈匝数线径 原视频链接 匝数比 5V 是想要得到的输出电压 0.7V为二极管导通的压降 185Vx根号2是有效值 最大占空比取0.4。得出最小匝数为30。 更改某些值可能得出来的匝数比就不一定是30了&#xff0c; 这其实也是反激变压器…

mac苹果电脑需要安装杀毒软件吗?

随着数字时代的发展&#xff0c;计算机安全问题变得越来越重要。而在计算机安全领域中&#xff0c;杀毒软件是一个被广泛讨论的话题。苹果电脑需要安装杀毒软件吗&#xff1f;对于苹果电脑用户来说&#xff0c;他们常常会疑惑自己是否需要安装杀毒软件来保护自己的电脑。本文将…

力扣每日一题-数位和相等数对的最大和-2023.11.18

力扣每日一题&#xff1a;数位和相等数对的最大和 开篇 这道每日一题还是挺需要思考的&#xff0c;我绕晕了好久&#xff0c;根据题解的提示才写出来。 题目链接:2342.数位和相等数对的最大和 题目描述 代码思路 1.创建一个数组存储每个数位的数的最大值&#xff0c;创建一…

kubernetes学习笔记-概念

参考&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/overview/ 概述 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态&#xff0c;其服务、…

【Linux】C文件系统详解(二)——什么是fd文件描述符以及理解“一切皆文件“

文章目录 fd-文件描述符如何深度理解"一切皆文件"**我们使用OS的本质:**FILEFILE是什么?谁提供的?和我们刚刚讲的内核的struct有关系吗FILE是一个结构体.该结构体内部一定要有以下字段:FILE是C语言标准库提供的.FILE和我们刚刚讲的内核的struct没有关系,最多就是上…

医院绩效考核系统源码 医院绩效考核系统方案

医院绩效考核系统源码 医院绩效考核系统是现代医院管理的重要方法和科学的管理工具。良好的绩效管理&#xff0c;有助于带动全院职工的工作积极性&#xff0c;有助于提高工作效率、提高医疗质量、改善服务水平、降低运营成本&#xff0c;全面提升医院的精细化管理水平。 医院绩…

不允许你还没有了解哈希表、哈希桶、哈希冲突的解决,如何避免冲突

✏️✏️✏️今天给各位带来的是哈希桶、哈希冲突方面的知识。 清风的CSDN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; 动动你们发财的小手&#xff0c;点…

springMVC学习笔记-请求映射,参数绑定,响应,restful,响应状态码,springMVC拦截器

目录 概述 springMVC做了什么 springMVC与struts2区别 springMVC整个流程是一个单向闭环 springMVC具体的处理流程 springMVC的组成部分 请求映射 RequestMapping 用法 属性 1.value 2.method GET方式和POST方式 概述 HTTP给GET和POST做了哪些规定 GET方式&…

IDEO也不行了吗?设计正在变革#实时设计

2023 年 8 月&#xff0c;在与宜家品牌合作近 10 年之后&#xff0c;SPACE10 关门了。 最近&#xff0c;IDEO&#xff0c;设计思维的早期倡导者和践行者&#xff0c;宣布裁员1/3。 介绍下这两家设计公司&#xff1a; SPACE10 由宜家全额资助&#xff0c;于 2015 年落户哥本哈根…

生成式AI模型量化简明教程

在不断发展的人工智能领域&#xff0c;生成式AI无疑已成为创新的基石。 这些先进的模型&#xff0c;无论是用于创作艺术、生成文本还是增强医学成像&#xff0c;都以产生非常逼真和创造性的输出而闻名。 然而&#xff0c;生成式AI的力量是有代价的—模型大小和计算要求。 随着生…

DevSeo Studio设置中文界面

安装好DevSeo Studio后默认打开是欢迎页。 左下角Configure点击展开&#xff0c;选择plugins 弹出页面选择“installed”,然后输入chinese,默认是关闭的&#xff0c;点击enable将它启用&#xff0c;然后点击OK。 弹出页面点击“restart”重启即可。

Draco Win10编译

1. 工具 CMake 3.2.8&#xff0c;Visual Studio 2019 2. 步骤 2.1 拷贝代码 git clone https://github.com/google/draco.gitgit clone https://github.com/google/draco.git 下载第三方依赖 git submodule sync git submodule update --init --recursive 2.2 CMake编译…