大语言模型之十七-QA-LoRA

news2025/2/24 1:45:00

由于基座模型通常需要海量的数据和算力内存,这一巨大的成本往往只有巨头公司会投入,所以一些优秀的大语言模型要么是大公司开源的,要么是背后有大公司身影公司开源的,如何从优秀的开源基座模型针对特定场景fine-tune模型具有广大的前景,从数据开源、到基座模型到新方法的迭代升级使得个人都有机会践行fine-tune这一过程。

为了使得基座模型能够迁移到不同的任务应用场景中,Fine-tune是最为使用的方法之一,为了减少fine-tune阶段需要的算力内存开销,当前主要有PEFT(parameter-efficient fine-tuning)和参数量化两类方向,PEFT(parameter-efficient fine-tuning)核心思想是重新训练对新任务影响较大的少部分参数,而基座模型大部分参数保持不变,量化的核心思想是通过模型参数位宽(量化)的减少降低内存消耗,将二者结合使用能够进一步减少资源消耗,如何高效的使用量化、PEFT等技术在减少算力的需求的前提下减少准确性损失是当前主流研究方向。

本篇博客讨论当前高效训练和推理LLM的PEFT和量化相关技术,PEFT技术仅介绍使用较广的LoRA。

量化的目的是提高芯片计算吞吐量和减少内存占用,当前8-bit和4-bit量化已经在商业上可以在消费级硬件上运行模型,量化(GPTQ、GGUF)+开源LLama+PEFT(LoRA, QLoRA)+开源数据集的组合极大降低了大模型的门槛,这一闭环的生态是的训练和部署都可以以较低的成本进行,这里讨论QLoRA、GPTQ以及GGUF三种量化方法,基座模型训练的时候采用的是单精度浮点32bit位宽,推理的时候如果将32-bit位宽的数据变成8-bit,甚至4bit那么内存的需求量将大大减少,但是量化也会劣化模型的表现。

QLoRA

LoRA技术在《大语言模型之十四-PEFT的LoRA》和《大语言模型之十六-基于LongLoRA的长文本上下文微调Llama-2》,因而LoRA基础思想和实现方法本篇博客不再介绍。

QLoRA的全称是Quantized and Low-Rank Adapters,这里的and表示的意义是量化和LoRA方法的组合,量化的意思是将32-bit单精度浮点数量化为8-bit/4-bit/2-bit等方法以减少内存的消耗,采用低秩分解的方法降低fine-tune的参数量,二者思想相组合即为这里的QLoRA。

QLoRA将存储数据类型和计算数据类型相分离,存储数据类型通常为4-bit NormalFloat类型,计算数据类型是16-bit BrainFloat类型。在前向计算loss和反向根据梯度更新权重参数的时候,将存储的数据类型转为计算数据类型,但仅在计算LoRA参数的权重梯度时才使用16-bit BrainFloat。

4-bit NormalFloat(NF4)数据类型

4-bit NormalFloat先经过Normalization,将模型的权重参数归一化,即变成零均值单位方差的权重参数,这是为了确保权重参数集中在0附近很小的范围以便用很少的比特位量化。
对于32-bit单精度浮点数表示的网络权重0.5678,再用4-bit float量化时,首先假设4-bit整数表示16个间隔分布的范围[-1, 1],即:

[-1.0, -0.8667, -0.7333, -0.6, -0.4667, -0.3333, -.02, -0.0667, 0.0667, 0.2, 0.3333, 0.4667, 0.6, 0.7333, 0.8667, 1.0],

1)首先将原始32-bit单精度数0.5678量化为0.6,因为0.5678距离0.6比0.4667近,
2)4bit可以表示的无符号数为0~15,有符号数为-8~7,这里以无符号表示,则15对应于1.0,则0.6对应于12,所以权重参数按4-bit整数存储为12而不是单精度的0.5678(也不是0.6)
3)在计算的时候,前向计算loss或者反向根据梯度更新权重参数的时候,首先将12转为0.6(量化逆过程)表示的浮点数参与运算,而0.6和0.5678之间差值是逆量化误差。

量化到8-bit可以减少量化误差,fine-tune过程和4bit类似,但是存储的内存增加一倍。

量化误差会影响模型的准确性,这可以通过混合精度训练在准确性和速度/内存使用上平衡。

这里总结一下QLoRA的方法,首先将32-bit单精度参数模型以4-bit的方式加载到内存中,也有使用DQ(Double quantization)对量化残差再使用4-bit量化,进一步减少精度带来模型准确性损失,然后配置LoRA参数,针对特定层(如1%的参数了,仍然使用32-bit单精度)作为权重,但是由于进行了低秩分解,因而相比原始参数量也是大大减少的,在训练的时候,前向计算时,首先将内存中freeze的NF4格式数据转为浮点数,参与loss计算,对于LoRA注入层则使用单精度计算(这是没有量化,因而无量化误差),计算loss之后,反向梯度更新的时候,只更新LoRA注入层影响的权重参数,freeze的NF4数据不受影响。

QALoRA

QALoRA论文显示,QA-LoRA和QLoRA在MMLU数据集上不同量化比特位数的准确度对比情况,由此可以看到同量化比特位数情况下QA-LoRA准确性最高。QALoRA官方 github工程
在这里插入图片描述
图1 QLoRA vs QA-LoRA score
从上面的测试情况来看,QA-LoRA方法在同比特情况下得分最高。未来QA-LoRA极有可能是成为主流,相比QLoRA,QALoRA方法提供了更高的精度。
在这里插入图片描述
图 2 LoRA vs QLoRA vs QA-LoRA

LoRA方法在《大语言模型之十五-预训练和监督微调中文LLama-2》已有涉及,QLoRA方法在《大语言模型之七- Llama-2单GPU微调SFT》使用了。
Fine-tune的时候,LoRA方法是依然使用FP16比特类型数据,而QLoRA则使用NF4类型格式数据,而QA-LoRA则使用INT4类型数据格式,
在推理的时候,QA-LoRA也是直接使用INT4类型的数据格式。
在这里插入图片描述
图3 QA-LoRA

因为当前介绍QA-LoRA方法的资料比较少,毕竟是github工程两周前才公布的,这里以《大语言模型之四-LlaMA-2从模型到应用》插图3为例说明。
在这里插入图片描述
图4 大语言模型之四-LlaMA-2从模型到应用插图3部分
这里收入token的每个维度是4096,对应于上述公式的D_in即输入token Embedding维度。这里的Wq,Wk,Wv对应于图2中pre-trained weight。图2中输入X都是4096维Embedding数。
QA-LoRA的方法是将Embedding 4096分组,假设是组L=128,则Group=Emb/L=4096/32=128,这样A就变成了32x64,B变成了644096,A和B相乘结果AB=324096,和group后的输入相乘即[132][AB]=14096,这样就得到了和LoRA和QLoRA一样的结果,即图4中圈3、圈4、圈5对应的QKV(1*4096)。
在图3的公式中还有pre-quantization函数,这一函数的作用是对浮点数量化,然后将量化值在转为浮点数,这样做的目的是在训练的过程中感知量化。

GPTQ

GPTQ对训练好的模型首先对参数进行标量量化,然后对残差进行向量量化,向量量化的思想和方法可以参考《编解码》,这种被称之为Post-training量化,这种方法压缩效率高、算力需求也会降低。GPTQ方法使得模型可以在消费级显卡GPU上运行。在推理上GGUF已经超过了GPTQ方法。

GGUF

GGUF是ggml的后继者,GGUF已经支持cuBLAS、MPI、BLAS、BLIS、Intel MKL等库支持,在GPU、CPU上都可以高效实现推理运算,ggml是专为CPU推理而实现的c++库,由于影响力比较大,所以blas、mkl以及GPU也都支持了,升级为了GGUF,我们在推理的时候已经见到过了,这是基于c++的推理,使用了ggml向量计算库,因而模型的参数是需要转换为GGUF格式的,GGUF官网说明是为了Llama模型能够使用4-bit整型量化以便在MacBook上实现推理。除了量化也使用了硬件加速SIMD指令和GPU的一些支持。quantize详见github
在这里插入图片描述

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

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

相关文章

python 如何获取url的名称

一、使用os模块 os模块是Python内置的一个操作系统接口模块,提供了许多与操作系统相关的函数和变量。其中,os.path模块用于处理路径相关的操作,包括文件名、目录名等。 os.path.basename()函数可以用来获取路径中的文件名部分 imp…

【考研数学】概率论与数理统计 —— 第四章 | 随机变量的数字特征

文章目录 一、随机变量的数学期望1.1 概念1. 一维离散型随机变量的数学期望2. 一维连续型随机变量的数学期望3. 二维离散型随机变量的数学期望4. 二维连续型随机变量的数学期望 1.2 数学期望的性质 二、随机变量的方差2.1 概念2.2 计算公式2.3 方差的性质2.4 常见随机变量的数学…

自己动手写PBR

下面的shader参照博客修改而成:改动的地方用此颜色表示 代码参照: unity build-in管线中的PBR材质Shader分析研究_郭大钦的博客-CSDN博客_shader 支持pbr材质以及cubemap unity build-in管线中的PBR材质Shader分析研究_bulit-in pbr-CSDN博客 最终效果如下:左边是手写的,右…

多个扇形元素绕圆旋转

效果图 这种效果有很多方案,最后选择了一个比较简单的方案,就是一个position: relative;的 div 。包裹5个position: absolute;的div。 通过旋转,调整5个div的 top 与 left,而产生弧度,并使中心点都指向圆心。 黄色扇形…

实施运维03(在虚拟机上安装winServer2008系统)

新建虚拟机(一直下一步) 新建成功后选择镜像(右键设置,选择CD/DVD,选择使用IOS镜像文件,浏览选择2008镜像打开) 安装2008版本系统(一直下一步) 修改密码---设置密码 与电脑远程连…

简易LDO设计(包含原理图、PCB和实验)

一、前置知识 ①该电路是通过三极管(BJT)来实现的,所以需要知晓三极管的工作原理和特性。 ②三极管有三种状态:放大、饱和、截止。本文是利用三极管的放大状态来模拟LDO芯片的功能。 二、原理图 ①稳压二极管要想稳定到某个电压范…

【html】利用生成器函数和video元素,取出指定时间的视频画面

简言 有的时候想截取视频某一秒的视频画面。 手动截取操作麻烦,还得时刻关注视频播放时间。 于是,我搞出来了一个根据视频自动截取特定时间描述的页面。 效果 实现步骤 获取视频对象根据视频时长生成时间选择表单根据表单选择的时间和视频地址&#x…

钢筋智能测径仪 光圆与带肋钢筋均可检测!

在一个大规模、高效、连续的工业生产中,制造业正朝着自动化方向快速优化发展,这种自动化的生产需要快速、准确地分析控制生产工艺中的参数,超差及时提示,为操作工对工厂的运行和自我调节做出快速反应,人工操作越来越不…

智能井盖传感器扣好“城市纽扣”,让市民脚下更有安全感

随着城市化进程的快速推进,城市基础设施的维护和管理面临着日益严峻的挑战。作为城市生命线的重要组成部分,城市井盖在保障城市安全和稳定运行方面具有举足轻重的地位。然而,日益繁重的城市交通压力使得井盖的维护和管理问题逐渐显现。 城市井…

【网络编程】Linux网络编程基础与实战第一弹——网络基础

这里写目录标题 网络基础什么是协议典型协议 分层模型OSI七层模型TCP/IP四层模型 网络应用程序设计模式优缺点具体体现: 网络基础 什么是协议 从应用的角度出发,协议可理解为“一组规则”,是数据传输和数据的解释的规则。 假设,…

(echarts)折线图封装相关总结及使用

(echarts)折线图封装相关总结及使用 一、封装组件lineCharts.vue <template><div :id"id" :class"className" :style"{ height: height, width: width }" /> </template><script> import echarts from "echarts&q…

python自动化办公之文件整理脚本详解

今天讲解文件整理脚本的实现过程。这是一个很有用的技能&#xff0c;可以帮助你管理你的电脑上的各种文件。需求如下&#xff1a; 需求内容&#xff1a;给定一个打算整理的文件夹目录&#xff0c;这个脚本可以将该目录下的所有文件都揪出来&#xff0c;并且根据后缀名归类到不同…

苍穹外卖(三) 员工分页及技术实现细节

2. 员工分页查询 2.1 需求分析和设计 2.1.1 产品原型 2.1.2 接口设计 2.2 代码开发 2.2.1 设计DTO类 根据请求参数进行封装 2.2.2 封装PageResult 后面所有的分页查询&#xff0c;统一都封装为PageResult对象。 员工信息分页查询后端返回的对象类型为: Result 2.…

【Redis】渐进式遍历

scan命令渐进式遍历 Redis使⽤scan命令进⾏渐进式遍历键&#xff0c;进⽽解决直接使⽤keys获取键时可能出现的阻塞问题。每次scan命令的时间复杂度是O(1)&#xff0c;但是要完整地完成所有键的遍历&#xff0c;需要执⾏多次scan。 SCAN 以渐进式的⽅式进⾏键的遍历。 SCAN…

C# Onnx Yolov8 Detect 涉黄检测

效果 项目 检测类别 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; usi…

Python批量测试IP端口GUI程序(Tkinter)

一、实现样式 批量IP与端口中间用“,”分割&#xff0c;点击Telnet进行测试&#xff0c;前提是你电脑安装了telnet客户端&#xff0c;Clear按钮用来清空文本框。 二、核心点 1、使用Tkinter来制作桌面GUI页面 2、使用telnetlib模块测试telnet端口 三、困难点 1、测试结果…

SpringBootCMS漏洞复现分析

SpringBootCMS&#xff0c;极速开发&#xff0c;动态添加字段&#xff0c;自定义标签&#xff0c;动态创建数据库表并crud数据&#xff0c;数据库备份、还原&#xff0c;动态添加站点(多站点功能)&#xff0c;一键生成模板代码&#xff0c;让您轻松打造自己的独立网站&#xff…

2023年淘宝天猫双11活动时间什么时候开始到几月几号结束?

2023年淘宝天猫双11超级红包领取时间 第一阶段&#xff1a;2023年10月24日20:00 至11月03日23:59 第二阶段&#xff1a;2023年11月04日00:00 至 11月11日23:59 2023年淘宝天猫双11超级红包使用时间 第一阶段&#xff1a;2023年10月31日20:00 至11月03日23:59 第二阶段&…

Semantic Segmentation

目录 1.可视化数据集 2.标签中像素类别的对应 3.预处理数据 4.定义数据集类 5.创建模型 5.1 固定模型参数 5.2 修改成FCN&#xff08;全卷积层&#xff09; 5.3 初始化转置卷积层 6.训练模型 6.1 optim.lr_scheduler.StepLR 6.2 torch.set_grad_enabled(bool:) 6.3…

【Vue基础-数字大屏】加载动漫效果

一、需求描述 当网页正在加载而处于空白页面状态时&#xff0c;可以在该页面上显示加载动画提示。 二、步骤代码 1、全局下载npm install -g json-server npm install -g json-server 2、在src目录下新建文件夹mock&#xff0c;新建文件data.json存放模拟数据 {"one&…