【大模型上下文长度扩展】LongQLoRA:单GPU(V100)环境下的语言模型优化方案

news2024/11/18 14:48:19

LongQLoRA

    • 核心问题
      • 子问题1: 预定义的上下文长度限制
      • 子问题2: 训练资源的需求高
      • 子问题3: 保持模型性能
      • 分析不足
    • LongQLoRA方法拆解
      • 子问题1: 上下文长度限制
      • 子问题2: 高GPU内存需求
      • 子问题3: 精确量化导致的性能损失
      • 分析不足
      • 效果
    • 总结

 


论文:https://arxiv.org/pdf/2311.04879.pdf

代码:https://github.com/yangjianxin1/LongQLoRA

 

核心问题

为了扩展大型语言模型(如LLaMA系列)的上下文长度,本文介绍一个有效且高效的方法——LongQLoRA。

子问题1: 预定义的上下文长度限制

  • 背景: LLaMA系列模型(例如LLaMA和LLaMA2)在训练时设置了预定义的上下文长度(如2048和4096个token),使用的位置编码(RoPE)在超出预定义长度时性能急剧下降。
  • 相关联想: 在多文档问答、书籍摘要、长对话摘要等任务中,长输入上下文常常是必需的,这些任务因为上下文长度限制而难以达到最佳性能。
  • 子解法: Position Interpolation和Shift Short Attention结合,通过位置插值技术和短注意力偏移来扩展模型处理的上下文长度,无需大规模重新训练。

子问题2: 训练资源的需求高

  • 背景: 扩展上下文长度的直接方法如进一步预训练需要大量的GPU资源和较长的收敛时间,对于大多数研究者来说是不现实的。
  • 相关联想: 比如Meta的Position Interpolation技术虽然有效但需要32个A100 GPUs,而Focused Transformer(FOT)需要128个TPUs,这对普通研究者来说是不可承受的。
  • 子解法: LongQLoRA采用了QLoRA的量化微调方法,通过将预训练的大型语言模型量化为4比特来减少模型内存占用,并添加少量的可学习低秩适配器权重,大大减少了对训练资源的需求。

子问题3: 保持模型性能

  • 背景: 在减少模型训练资源需求的同时,保持或提升模型在长上下文任务上的性能是一个挑战。
  • 相关联想: 通常,减少模型大小或简化训练过程可能会牺牲模型性能。
  • 然而,有效的上下文长度扩展不仅需要减轻资源负担,还要确保模型能够有效处理长文本输入。
  • 子解法: LongQLoRA通过结合QLoRA、Position Interpolation和Shift Short Attention,不仅减少了对资源的需求,还通过在所有层添加低秩适配器权重,优化了模型结构以提高处理长上下文输入的能力,从而在PG19和Proof-pile数据集上展现出了优异的性能。

分析不足

LongQLoRA方法的全流程分析显示,该方法在扩展LLaMA系列模型的上下文长度方面既高效又有效。

它通过精心设计的结合了几种关键技术,使得在单个V100 GPU上就能将LLaMA2的上下文长度从4096扩展到8192甚至更长,同时在性能上不仅超越了LongLoRA,还接近于经过大量资源训练的MPT-7B-8K模型。

然而,尽管LongQLoRA在资源效率和性能上取得了显著进步,但它依赖于特定的硬件配置(如32GB内存的V100 GPU),这可能限制了它在不同研究和开发环境中的应用。

此外,尽管已经在PG19和Proof-pile数据集上进行了评估,但在更广泛的NLP任务和更多样化的数据集上的表现仍然是一个开放的问题。

 


LongQLoRA方法拆解

子问题1: 上下文长度限制

  • 背景: LLaMA系列模型使用基于RoPE的位置编码,其在预定义的上下文长度之外性能急剧下降,限制了模型处理长文本的能力。
  • 子解法: 位置插值(Position Interpolation)
  • Meta提出的位置插值技术通过在预定义的位置空间内进行位置编码插值,扩展了LLaMA模型的上下文窗口大小,无需直接训练即可将上下文长度从2048扩展到32768。
  • 例子: 使用位置插值,仅需1000步的微调,就能显著提升LLaMA模型在长文本处理(如PG19数据集)上的性能。

子问题2: 高GPU内存需求

  • 背景: 标准自注意力机制的计算复杂度为O(n^2),导致高GPU内存消耗。
  • 子解法: 短程注意力偏移(Shift Short Attention)
  • LongLoRA提出的短程注意力偏移是一种稀疏的局部注意力机制,通过将输入token分组并单独计算每组内的注意力(以及邻近组之间的注意力),显著降低了GPU内存需求。
  • 例子: 假设输入token被分成g组,计算复杂度可以从 O ( n 2 ) O(n^2) O(n2)降低到O((n/g)^2),有效减少了GPU内存消耗。

子问题3: 精确量化导致的性能损失

  • 背景: 在限制GPU资源的情况下,如何在保证模型性能的同时减少模型的内存占用成为一个挑战。
  • 子解法: QLoRA
  • QLoRA通过将预训练模型的权重量化为4位,并添加可学习的低秩(LoRA)适配器权重,既减少了GPU内存占用又保留了全精度微调任务的性能。
  • 例子: QLoRA使得在单个48GB GPU上微调LLaMA 65B模型成为可能,同时保留了与全精度微调相当的性能水平。

分析不足

LongQLoRA通过结合位置插值短程注意力偏移QLoRA的优势,有效解决了大型语言模型在处理长上下文时的挑战。

首先,使用位置插值扩展LLaMA2的上下文长度;然后,通过QLoRA的权重量化和低秩适配器减少GPU内存需求;最后,利用短程注意力偏移进一步节省内存,并在所有层添加LoRA适配器以恢复由于量化而损失的性能。

然而,这种方法的一个潜在不足是它依赖于特定技术的组合,这可能限制了它在不同模型和任务上的通用性和灵活性。

例如,虽然短程注意力偏移在节省GPU内存方面非常有效,但它可能需要针对特定的任务和数据集进行调整。

此外,尽管QLoRA在减少内存占用方面表现出色,但量化策略的选择和适配器权重的调整可能需要根据具体情况进行细微调整,以最大化性能。

效果

基于LongQLoRA实验部分的讨论,可以得出以下结论:

  1. 上下文长度扩展有效性:通过位置插值技术,LongQLoRA成功将LLaMA2和Vicuna模型的上下文长度从4096扩展到8192,实验证明了该方法在扩展大型语言模型处理长文本的能力方面的有效性。

  2. 内存效率与性能保持:通过QLoRA的权重量化和LoRA适配器的添加,LongQLoRA在仅使用单个V100 GPU的条件下实现了模型的微调,既节约了GPU内存,又保持了模型性能,证明了在资源受限情况下进行模型优化的可行性。

  3. 微调策略的优化:实验表明,在微调阶段使用短程注意力偏移和在推理阶段使用标准全局注意力的策略有效提高了模型的性能和兼容性。这种策略在提高计算效率的同时,确保了模型在长文本处理任务上的优异表现。

  4. 模型性能对比:与其他方法(如LongLoRA和MPT-7B-8K)相比,LongQLoRA在PG19和Proof-pile数据集上的困惑度评估中表现出更优或接近的性能。特别是在8192上下文长度的评估中,LongQLoRA的性能与最先进的方法相当,甚至略有优势。

  5. 资源效率的显著提高:LongQLoRA的实现仅需单个V100 GPU,与需要多个A100 GPUs或TPUs的方法相比,大大降低了对训练资源的需求,展示了在有限资源下扩展和优化大型语言模型的高效途径。

  6. 微调步骤与LoRA秩的影响:通过不同LoRA秩的对比实验和微调步骤的分析,发现适当增加LoRA秩和微调步骤能够进一步降低模型的困惑度,表明微调策略的细微调整对模型性能有显著影响。

在这里插入图片描述
这张图展示了在不同上下文长度下,不同模型在PG19验证集和Proof-pile测试集上的困惑度(Perplexity)表现。

困惑度是衡量语言模型性能的一个标准指标,困惑度越低,模型的性能通常认为越好。

  • 左侧图表(Perplexity on PG19):

    • 展示了在PG19数据集上,从1024到8192的不同评估上下文长度下,MPT-7B-8K、LongLoRA-LoRA、LongLoRA-Full、LongQLoRA和LLaMA2-7B模型的困惑度。
    • 在8192长度下,LongQLoRA的困惑度与LongLoRA-Full非常接近,且比MPT-7B-8K表现得更好。
  • 右侧图表(Perplexity on Proof-pile):

    • 展示了在Proof-pile数据集上,相同上下文长度变化下的困惑度表现。
    • 在这个图表中,LongQLoRA在所有上下文长度下都略微优于LongLoRA-LoRA,并在8192长度下与LongLoRA-Full几乎持平。

两个图表都显示,所有模型在推理时均以4-bit进行量化。

LongQLoRA模型是基于Redpajama数据集在单V100 GPU上微调1000步得到的。

这两个图表还强调了LLaMA2-7B模型在超出其预定义上下文长度8192时性能下降的情况。

相比之下,LongQLoRA能够在更长的上下文长度上维持低困惑度,表明其扩展上下文长度的有效性。

LongQLoRA在1024到8192的上下文长度范围内超越了LongLoRA-LoRA,并在8192的长度上极接近LongLoRA-Full,甚至在PG19数据集上的表现优于MPT-7B-8K。

总结

LongQLoRA方法的实施逻辑可以被视为一个多阶段的逻辑链条,其中每个子问题的解决策略相互衔接,共同构成了一个高效且有效的系统来扩展大型语言模型(如LLaMA系列)的上下文长度,同时保持或提升模型性能,且在资源受限的条件下实施。

  1. 子问题1: 上下文长度限制
  • 起点:大型语言模型(如LLaMA系列)在处理长上下文时受到预定义上下文长度的限制,这影响了模型在长文本任务上的表现。
  • 解决策略:**位置插值(Position Interpolation)**用于扩展模型的上下文长度,无需重新训练模型即可处理更长的文本。
  1. 子问题2: 训练资源的需求高
  • 中间环节:扩展上下文长度的直接方法(如进一步预训练)需要大量的训练资源,这对于大多数研究者来说是不现实的。
  • 解决策略QLoRA通过量化模型权重并添加可学习的低秩适配器权重,减少了对训练资源的需求,使得在资源有限的环境中也能进行有效的模型扩展和优化。
  1. 子问题3: 保持模型性能
  • 终点:在减少模型训练资源需求的同时,保持或提升模型在长上下文任务上的性能是挑战。
  • 解决策略:**短程注意力偏移(Shift Short Attention)**通过实现局部注意力机制减少计算资源需求,而在所有层添加的LoRA适配器则帮助恢复由于量化而可能损失的性能。

逻辑链条:

  1. 链条起点:面对上下文长度限制的问题,首先采用位置插值技术来扩展上下文长度,这是解决方案的基础。
  2. 中间环节:随后,为了应对高昂的训练资源需求,通过QLoRA的引入,实现了模型的量化和适配器权重的添加,这一步不仅减少了对资源的需求,还为后续步骤提供了优化模型性能的潜力。
  3. 链条终点:最后,为了确保模型性能在长上下文任务上的提升,引入短程注意力偏移来进一步优化计算效率,并通过在模型的所有层添加LoRA适配器来优化模型结构,以提升长文本处理能力。

举个例子

  • 起点:假设有一个长文本摘要任务,需要处理的文本长度超出了模型的原始设计上限。首先,通过位置插值技术,模型的上下文长度能够从原本的2048 token扩展到更长,如8192 token。
  • 中间环节:接下来,为了在单个V100 GPU上微调模型,QLoRA被用来减少模型内存的占用并保留性能,这允许在有限的资源下进行有效的模型优化。
  • 终点:最后,通过短程注意力偏移和LoRA适配器的结合使用,模型在长上下文任务上的性能得到了保持和提升,使得模型在长文本摘要任务上展现出优异的性能。

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

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

相关文章

波奇学Linux: 文件描述符

文件和操作系统的关系 操作系统控制进程,文件的打开是在进程中进行。意味着用来控制进程的PCB必然有文件的信息,操作系统通过控制PCB的信息来控制文件的读写。 Q1:如何证明文件打开是在进程中进行? 编写c文件调用fopen来操作文件…

拟合案例1:matlab积分函数拟合详细步骤及源码

本文介绍一下基于matlab实现积分函数拟合的过程。采用的工具是lsqcurvefit和nlinfit两个函数工具。关于包含积分运算的函数,这里可以分为两大类啊。我们用具体的案例来展示:一种是积分运算中不包含这个自变量,如下图的第一个公式,也就是说它这个积分运算只有R和Q这两个待定…

单片机学习笔记---蜂鸣器工作原理

目录 蜂鸣器介绍 蜂鸣器的驱动方式 ULN2003D芯片工作原理 实战预备知识:基础乐理 音名的分组 全音和半音的关系 音高的表示 五线谱中的符号定义 简谱上的符号定义 C调音符与频率对照表 相关计算 蜂鸣器介绍 蜂鸣器是一种将电信号转换为声音信号的器件&a…

fast.ai 深度学习笔记(五)

深度学习 2:第 2 部分第 10 课 原文:medium.com/hiromi_suenaga/deep-learning-2-part-2-lesson-10-422d87c3340c 译者:飞龙 协议:CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它,…

SpringBoot 接入讯飞星火大模型实现对话

申请地址 https://xinghuo.xfyun.cn/sparkapi?scrprice 免费申请200万Token 开发文档 https://www.xfyun.cn/doc/spark/Web.html#_1-接口说明 页面最下面有相关demo可以参考 介绍 接口是以套接字的形式分段返回,而且非http请求,比较繁琐,官…

基于JAVA的教学资源共享平台 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

Go语言每日一练——链表篇(八)

传送门 牛客面试笔试必刷101题 ----------------两个链表的第一个公共结点 题目以及解析 题目 解题代码及解析 解析 这一道题使用的还是双指针算法,我们先求出两个链表的长度差n,然后定义快慢指针,让快指针先走n步,最后快慢指…

苹果iOS设备备份管理神器imazing3中文版免费下载

如果您是一位资深果粉,那您对imazing这款iOS设备管理神器一定很熟悉。不过也有很多小伙伴只是听过这款软件的名字,不知道它具体是做什么的。今天就让小编跟大家说下imazing是什么软件,再给大家分享它最好用的两个功能。 imazing是什么&#x…

C语言之:编译和链接

目录 1. 翻译环境和运行环境翻译环境 2. 翻译环境:预编译编译汇编链接预处理(预编译)编译词法分析语法分析语义分析汇编链接运行环境 1. 翻译环境和运行环境 在ANSI C的任何一种实现中,存在两个不同的环境。 第一种是翻译环境&a…

Taro+ vue3 + template nut-ui 4.0 + pinia 的前端框架模板搭建

1.展示 目前我们有一个需要做H5 微信小程序的需求。当然我们可选的框架有很多,比如说:uni-app Taro京东框架 去做这些前端需求 2.介绍 Taro ①.项目的具体结构 Taro框架中 的目录结构 大体上都是一样的 page页面 store ② 项目的store 状态管理 状态管理使用的是pinia v…

Jumserver 安装

一、Jumserver 官网地址 Jumserver官网地址 二、Jumserver的基本概率 1、4a概率 首先,堡参机提供了运维安全审计的4A规范 Authentication: 身份鉴别,防止身份冒用和复用(开发10人,测试5人,运维2人) Authorizatton:授…

探索C语言的内存魔法:动态内存管理解析

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 1. 静态开辟内存 通过前面的学习,我们已经掌握了两种开辟内存的方…

“深度解析Java虚拟机:运行时数据区域、垃圾收集、内存分配与回收策略、类加载机制“

"深度解析Java虚拟机:运行时数据区域、垃圾收集、内存分配与回收策略、类加载机制" Java 虚拟机一、运行时数据区域程序计数器Java 虚拟机栈本地方法栈堆方法区运行时常量池直接内存 二、垃圾收集判断一个对象是否可被回收1. 引用计数算法2. 可达性分析算…

Python图形用户界面

目录 Python中的图形用户界面开发库 安装wxPython 第一个wxPython程序 自定义窗口类 在窗口中添加控件 事件处理 布局管理 盒子布局管理器 重构事件处理示例 盒子布局管理器嵌套示例 控件 文本输入控件 复选框和单选按钮 列表 静态图片控件 我们之前的程序运行结…

python 基础知识点(蓝桥杯python科目个人复习计划36)

今日复习计划:DFS搜索基础 1.简介 搜索方法:穷举问题解空间部分(所有情况),从而求出问题的解。 深度优先搜索:本质上是暴力枚举 深度优先:尽可能一条路走到底,走不了再回退。 2…

面向对象编程:理解其核心概念与应用

引言 在编程的世界中,面向对象编程(Object-Oriented Programming, OOP)已成为一种主流的编程范式。它提供了一种组织和管理代码的有效方式,使得代码更加模块化、可重用和易于维护。本文将带您深入探讨面向对象编程的核心概念及其…

春节每日一题~(自除数)

728. 自除数 - 力扣&#xff08;LeetCode&#xff09; #include <stdlib.h> int* selfDividingNumbers(int left, int right, int* returnSize) { int* result (int*)malloc((right - left 1) * sizeof(int)); if (result NULL) { // 内存分配失败 *returnSize …

展示wandb的数据

import wandb import matplotlib.pyplot as plt# 初始化 wandb API api wandb.Api()# 假设您想要访问的项目名为 my_project&#xff0c;并且您的 wandb 用户名为 my_username project_name "aicolab/RWKV-5-Test"# 获取项目中的runs runs api.runs(project_name)…

ClickHouse--02--安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 安装官网 &#xff1b;[https://clickhouse.com/docs/zh/getting-started/install](https://clickhouse.com/docs/zh/getting-started/install)![在这里插入图片描述…

Spring基础 - SpringMVC请求流程和案例

Spring基础 - SpringMVC请求流程和案例 什么是MVC 用一种业务逻辑、数据、界面显示分离的方法&#xff0c;将业务逻辑聚集到一个部件里面&#xff0c;在改进和个性化定制界面及用户交互的同时&#xff0c;不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理…