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

由于基座模型通常需要海量的数据和算力内存,这一巨大的成本往往只有巨头公司会投入,所以一些优秀的大语言模型要么是大公司开源的,要么是背后有大公司身影公司开源的,如何从优秀的开源基座模型针对特定场景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.rhkb.cn/news/156911.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

香港专用服务器拥有良好的国际网络连接

香港服务器在多个领域有着广泛的应用。无论是电子商务、金融交易、游戏娱乐还是社交媒体等,香港服务器都能够提供高效稳定的服务。对于跨境电商来说,搭建香港服务器可以更好地满足亚洲用户的购物需求;对于金融机构来说,香港服务器…

当涉及到API接口数据分析时,主要可以从以下几个方面展开

当涉及到API接口数据分析时,主要可以从以下几个方面展开: 请求分析:可以统计每个API接口的请求次数、请求成功率、失败率等基础指标。这些指标可以帮助你了解API接口的使用情况,比如哪个API接口被调用的次数最多,哪个…

c++-list

文章目录 前言一、list介绍及使用1、list介绍2、list使用2.1 list构造函数的使用2.2 list iterator的使用2.3 list capacity的使用2.4 list modifiers的使用2.5 list使用算法库中的find模板生成find方法2.6 list中的sort方法 二、list模拟实现1、查看list源码的大致实现思路2、…

身份证实名核验接口,身份证实名认证,身份证二要素实名认证,身份证实名校验,身份证一致性实名认证

一、接口介绍 验证身份证与姓名是否匹配,查询身份证信息。如校验通过,接口返回生日、性别、地址等信息。广泛应用于信贷、安防、银行、保险等行业及各种身份核查场景。 注意:当请求参数符合“【固定同一个参数,其余参数不同】,”…

基于VScode 使用plantUML 插件设计状态机

本文主要记录本人初次在VScode上使用PlantUML设计 本文只讲述操作的实际方法,假设java已安装成功 。 1. 在VScode下安装如下插件 2. 验证环境是否正常 新建一个文件夹并在目录下面新建文件test.plantuml 其内容如下所示: startuml hello world skinparam Style …

基于小波变换的分形信号r指数求解算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ................................................................... %通过功率谱密度曲线…

WebSocket连接异常 Error parsing HTTP request header Connection reset by peer

问题描述 在使用spring的方式集成websocket时,在配置WebSocketConfigurer后 Configuration EnableWebSocket public class WebSocketConfiguration implements WebSocketConfigurer {ResourceServletWebSocketServerHandler servletWebSocketServerHandler;Overri…

linux总结

cat -n filename 查看文件,-n用来给每一行标行号,可以省略 cat /var/log/mysqld.log | grep password 我们可以通过上述指令,查询日志文件内容中包含password的行信息。 more 作用: 以分页的形式显示文件内容 语法: more fileName 操作说明: 回车键 …

Spring Boot 中的 Redis 数据操作配置和使用

Spring Boot 中的 Redis 数据操作配置和使用 Redis(Remote Dictionary Server)是一种高性能的开源内存数据库,用于缓存、消息队列、会话管理和数据存储。在Spring Boot应用程序中,Redis被广泛用于各种用例,包括缓存、…

【教学类-35-04】学号+姓名+班级(中3班)学号字帖(A4竖版2份 竖版长条)

图片展示: 背景需求: 2022年9-2023年1月我去过小3班带班,但是没有在这个班级投放过学具,本周五是我在本学期第一次带中3班,所以提供了一套学号描字帖。先让我把孩子的名字和脸混个眼熟。 之前试过一页两套名字的纸张切割方法有:…

distcc分布式编译

distcc https://gitee.com/bison-fork/distcc.git 下载工具链 mingw,https://www.mingw-w64.org/downloads/#w64devkitperl,https://strawberryperl.com/releases.html免安装zip版本,autoconf等脚本依赖perlautoconf、automake&#xff0c…

只有正规才有机会,CTF/AWD竞赛标准参考书来了

目录 前言 一、内容简介 二、读者对象 三、目录 前言 随着网络安全问题日益凸显,国家对网络安全人才的需求持续增长,其中,网络安全竞赛在国家以及企业的人才培养和选拔中扮演着至关重要的角色。 在数字化时代,企业为了应对日益…

Flutter:open_file打开本地文件报错问题

相关插件及版本: open_file: ^3.2.1 问题: 项目中一直用的这个插件,突然发现在安卓高版本不能正常使用,报权限问题permissionDenied,断点调试提示相关权限是MANAGE_EXTERNAL_STORAGE,申请权限之后还是不行&…

springboot集成kafka

1、引入依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.8.6</version></dependency> 2、配置 server:port: 9099 spring:kafka:bootstrap-servers: 192.1…

JWT - 令牌认证授权(认证流程、认证原理、Jwt 工具类)

目录 一、JWT 认证 1.1、对 JWT 的认识 1.1.1、JWT 解释 1.1.2、为什么使用的 JWT 认证&#xff0c;而不是 Session 认证&#xff1f; a&#xff09;基于传统的 Session 认证 1.1.3、JWT 认证流程 1.1.4、优势 1.1.5、JWT 的结构 JWT 第一部分&#xff1a;标头 Header …

LeetCode - 318 最大单词长度乘积(Java JS Py C)

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 318. 最大单词长度乘积 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个字符串数组 words &#xff0c;找出并返回 length(words[i]) * length(words[j]) 的最大值&#xff0c;并且这两个单词…

RocketMQ核心编程模型以及生产环境最佳实践

文章目录 一、深入理解RocketMQ的消息模型二、消息确认机制消息生产端采用消息确认加多次重试的机制保证消息正常发送到RocketMQ消息消费者端采用状态确认机制保证消费者一定能正常处理对应的消息消费者也可以自行指定起始消费位点 三、广播消息四、顺序消息机制五、延迟消息六…

【Mybatis】动态 SQL

动态 SQL \<if>标签\<trim>标签\<where>标签\<set>标签\<foreach>标签 动态 sql 是 Mybatis 的强⼤特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接。 <if>标签 前端用户输入时有些选项是非必填的, 那么此时传到后端的参数是不确…

ipad手写笔哪个好用?苹果平替笔性价比高的

如果你想要入手一款和iPad匹配的电容笔&#xff0c;想必你的第一想法就是苹果的原装电容笔。然而这款电容笔虽然很好用&#xff0c;但价格会相对的昂贵一些。而平替电容笔&#xff0c;却是一种不错的选择&#xff0c;而且价格也很合理。一支普通的平板电容笔&#xff0c;其售价…

设计模式学习(十二)用设计模式干掉 if-else,太优雅了!

目录 一、场景举例二、什么时候需要改造 if-else&#xff1f;三、策略模式 Map字典3.1 策略接口3.2 策略实现类3.3 策略工厂类&#xff08;策略接口的持有者&#xff09;3.4 客户端&#xff08;测试类&#xff09;3.5 执行结果3.6 总结 四、责任链模式4.1 责任链处理接口4.2 责…