当前位置: 首页 > news >正文

大语言模型之十七-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
在这里插入图片描述

相关文章:

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

由于基座模型通常需要海量的数据和算力内存,这一巨大的成本往往只有巨头公司会投入,所以一些优秀的大语言模型要么是大公司开源的,要么是背后有大公司身影公司开源的,如何从优秀的开源基座模型针对特定场景fine-tune模型具有广大的…...

UML组件图综合指南:设计清晰、可维护的软件系统

介绍: UML(Unified Modeling Language)组件图是软件系统设计中的重要工具,用于描绘系统的物理结构和组件之间的关系。在软件工程中,通过创建清晰的组件图,团队能够更好地理解系统的模块化结构和组织关系&a…...

深入浅出ThreadPoolExecutor(一)

文章目录 线程池简诉ThreadPoolExecutor详解ThreadPoolExecutor参数详解创建线程池的工具类Executors 线程池简诉 针对各种池子,比如 连接池:用于管理和重复使用数据库连接,避免频繁创建和销毁数据库连接带来的性能开销。对象池:用于管理和重复使用对象…...

网站的常见攻击与防护方法

在互联网时代,几乎每个网站都存在着潜在的安全威胁。这些威胁可能来自人为失误,也可能源自网络犯罪团伙所发起的复杂攻击。无论攻击的本质如何,网络攻击者的主要动机通常是谋求经济利益。这意味着无论您经营的是电子商务项目还是小型商业网站…...

网络工程师知识点3

41、各个路由协议,在华为设备中的优先级? 直连路由 0 OSPF 10 静态 60 42、OSPF:开放式最短路径优先路由协议,使用SPF算法发现和计算路由 OSPF的优点: 1、收敛速度快,无路由自环,适用于大型网络…...

mongoDB 性能优化

文章目录 前言mongoDB 性能优化1. explain方法来查看查询的执行计划2. 查看mongoDB 集合的索引3. mongoDB 怎么添加索引4. 升序索引与降序索引是什么意思 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易…...

10月13日,每日信息差

今天是2023年10月13日,以下是为您准备的13条信息差 第一、欧盟投资4.5亿欧元在法国建设电池超级工厂。欧洲投资银行是欧盟的贷款机构,也是世界上最大的跨国银行之一 ​第二、北京银行推出数字人民币智能合约平台 数字人民币预付资金管理产品在商超场景…...

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

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

rust宏

宏看起来和函数很像,只不过名称末尾有一个感叹号 ! 。 宏并不产生函数调用,而是展开成源码,并和程序的其余部分一起被编译。 Rust宏和C不同,Rust的宏会展开为抽象语法树(AST,abstract syntax tree&#xff…...

性能测试之性能测试指标详解

前言 刚开始,以为做性能测试,就是做些脚本、参数化、关联,压起来之后,再扔出一个结果。 但实际上不止这些内容,还要加上性能分析,关注调优之后响应时间有多大的提升,TPS 有多大的提高&#xf…...

CustomNavBar 自定义导航栏视图

1. 创建偏好设置键 CustomNavBarTitlePreferenceKey.swift import Foundation import SwiftUI//State private var showBackButton: Bool true //State private var title: String "Title" //"" //State private var subtitle: String? "SubTitl…...

canal rocketmq

上篇文章canal 消费进度说到直接使用ClusterCanalConnector并发消费是有问题的,可以先用单点将canal事件发送到mq中,再由mq并发处理,另外mq还可以做到削峰的作用,让canal数据不至于阻塞。 使用队列,可以自己起一个单实…...

【数据库系统概论】第九章关系查询处理何查询优化

9.1查询处理 一:查询处理步骤 关系数据库管理系统查询处理可以分为4个阶段: 查询分析查询检查查询优化查询执行 (1)查询分析 任务:对查询语句进行扫描,分析词法、语法是否符合SQL语法规则 如果没有语…...

bp盐丘模型波场数值模拟matlab

波场数值模拟是地震勘探和地震学研究中常用的工具,而BP(Backpropagation)盐丘模型是一种用于地下介质成像的方法。如果您想在MATLAB中进行波场数值模拟,并结合BP盐丘模型进行地下成像,可以按照以下步骤进行&#xff1a…...

结构体对齐规则

1.第一个成员在结构体变量偏移量为0的地址处。 2.其他成员变量对齐到某个数字(对齐数)的整数倍的地址处。(对齐数编译器默认的一个对齐数与该成员大小的较小值)注意:目前有且只有VS编译器有默认为8. 3.结构体总大小为最大对齐数的整数倍。 4.如果嵌套…...

css 如何让元素内部文本和外部文本 一块显示省略号

实际上还是有这样的需求的 <div class"container"><span>啊啊啊啊啊啊啊啊</span>你好啊撒撒啊撒撒撒撒啊撒撒撒撒撒说</div>还是有这样的需求的哦。 div.container {width: 200px;white-space: nowrap;text-overflow: ellipsis;overflow:…...

SQL语句-中级

一、Mysql软件使用 1.启动/停止Mysql服务器 任务管理器 cmd命令&#xff1a;以管理员的身份打开cmd命令行 net start mysql80//开启net stop mysql80//停止 2.连接与断开Mysql服务器 注意要在bin目录下执行:-u用户名root&#xff0c;-p密码 mysql -u root -p 可能出现的…...

巧用h2-database.jar连接数据库

文章目录 一 、概述二、实践三、解决办法 一 、概述 H2 Database是一个开源的嵌入式数据库引擎&#xff0c;采用java语言编写&#xff0c;不受平台的限制&#xff0c;同时H2 Database提供了一个十分方便的web控制台用于操作和管理数据库内容。H2 Database还提供兼容模式&#…...

136.只出现一次的数字

136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且…...

mysql中遇到查询字段的别名与函数冲突问题

比如以下哎&#xff0c;我查询城市行业数量排名 select City, DENSE_RANK() over(ORDER BY COUNT(Id) DESC) rank, COUNT(Id) num,IndustrySubGroupName from base_companyinfo WHERE IndustrySubGroupName工业机器人 GROUP BY City 上面使用 DENSE_RANK() 函数来计算排名&am…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...