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

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。

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

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

相关文章

使用深度学习对视频进行分类

目录 加载预训练卷积网络 加载数据 将帧转换为特征向量 准备训练数据 创建 LSTM 网络 指定训练选项 训练 LSTM 网络 组合视频分类网络 使用新数据进行分类 辅助函数 此示例说明如何通过将预训练图像分类模型和 LSTM 网络相结合来创建视频分类网络。 要为视频…

Win32 SDK Gui编程系列之--创建菜单

菜单的概要在“Windows编程的基础”中提到了。在这里,对菜单的制作进行更详细的说明。 1.菜单的制作 菜单将数据设置在下面的MENUITEM结构中,用InsertMenuItem函数创建。 typedef struct tagMENUITEMINFO { fMask UINT cbSize;…

第十三、十四个知识点:用javascript获取表单的内容并加密

我们先来写一段代码&#xff1a; <body><form action"#" method"post">//写一个表单<span>用户名&#xff1a;</span><input type"text" id"username" name"username"><span>密码&a…

【代码随想录26】332.重新安排行程 51.N皇后 37.解数独

目录 332.重新安排行程题目描述参考代码 51.N皇后题目描述参考代码 37.解数独题目描述参考代码 332.重新安排行程 题目描述 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机…

(力扣)1314.矩阵区域和

给你一个 m x n 的矩阵 mat 和一个整数 k &#xff0c;请你返回一个矩阵 answer &#xff0c;其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和&#xff1a; i - k < r < i k, j - k < c < j k 且(r, c) 在矩阵内。 示例 1&#xff1a; 输入&a…

权限控制系统设计与实践的经验总结

在现代应用开发中&#xff0c;权限控制是确保系统安全和数据保护的重要组成部分。本文将介绍权限控制系统的设计原则&#xff0c;并分享一些实践经验&#xff0c;帮助开发人员更好地设计和实现适合自己项目的权限控制系统。 1. 设计原则&#xff1a; - 最小权限原则&#x…

spring boot(2.4.x 开始)和spring cloud项目中配置文件application和bootstrap加载顺序

在前面的文章基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 spring boot 2.4.x 版本之前通过 ConfigFileApplicationListener 加载配置 https://github.com/spring-projects/spring-boot/blob/v2.3.12.RELEASE/spring-boot-project/spring-boot/src/mai…

小白都能看懂的力扣算法详解——链表(一)

&#xff01;&#xff01;本篇所选题目及解题思路均来自代码随想录 (programmercarl.com) 一 203.移除链表元素 题目要求&#xff1a;给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回新的头节点。 203.…

Android 识别车牌信息

打开我们心爱的Android Studio 导入需要的资源 gradle //开源车牌识别安卓SDK库implementation("com.github.HyperInspire:hyperlpr3-android-sdk:1.0.3")button.setOnClickListener(v -> {Log.d("Test", "");try (InputStream file getAs…

第二届 N1CTF Junior Crypto-junior RSA WP

题目&#xff1a; from Crypto.Util.number import * from secret import flagm bytes_to_long(flag)def gen(bits):while True:a getPrime(bits)b getPrime(bits)c getPrime(bits)p (a << (2*bits)) (b << bits) cq (c << (2*bits)) (a << …

免费文字转语音工具,一款优秀且永久免费的文字转语音工具,同时拥有多种类型男声女声,支持多国语言转换,支持语速调节和下载!

一、软件简介 该工具只有一个功能&#xff0c;就是将输入框内的纯文本内容转换为指定语言的音频&#xff0c;并且可以自由调节语速及音色&#xff08;男声/女声&#xff09;&#xff0c;其内置了多种语音包&#xff0c;包含男声、女声、普通话、粤语以及方言&#xff0c;并且支…

ctfshow-命令执行(web73-web77)

web73 用不了上一题的通用poc了 因为禁用了strlen 但是可以改一个函数自定义一个函数只要是能实现strlen效果即可 cvar_export(scandir(/));exit(0); 根目录下有一个flagc.txt文件 cinclude(/flagc.txt);exit(0); web74 禁用了scandir函数 那就使用web72的glob协议 查看目录下…

如何在vue中使用拖动排序组件sortablejs

效果图&#xff1a; 1.首先&#xff0c;我们需要在vue项目中安装依赖&#xff1a; npm install -save sortablejs2.创建demo文件>demoTest.vue&#xff0c;直接附上实例代码&#xff1a; <template><div><div id"table-names"><div class&…

c#: 表达式树的简化

环境&#xff1a; .net 6 一、问题&#xff1f; 有下面的表达式&#xff1a; var nums new List<int> { 1, 2, 3 }; Expression<Func<int, bool>> exp i > i > nums.Max();我们知道&#xff0c;它其实就是&#xff1a;exp i > i > 3; 那么…

『运维备忘录』之 Ansible 自动化运维工具

一、简介 Ansible是基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能的自动化运维工具&#xff0c;广泛用于配置管理、应用部署以及任务协…

ArcGIS学习(六)地理数据库

ArcGIS学习(六)地理数据库 上个任务我们讲了一个非常重要的知识点一一坐标系。这个任务我们带来另外一个很重要的知识点一一地理数据库。 地理数据库的内容相比于坐标系简单很多! 首先,先让我们来学习下地理数据库的理论。 ArcGIS 中的地理数据库(Geodatabase)是一个用…

牛客网SQL264:查询每个日期新用户的次日留存率

官网链接&#xff1a; 牛客每个人最近的登录日期(五)_牛客题霸_牛客网牛客每天有很多人登录&#xff0c;请你统计一下牛客每个日期新用户的次日留存率。 有一个登录(login。题目来自【牛客题霸】https://www.nowcoder.com/practice/ea0c56cd700344b590182aad03cc61b8?tpId82 …

25、数据结构/二叉树相关练习20240207

一、二叉树相关练习 请编程实现二叉树的操作 1.二叉树的创建 2.二叉树的先序遍历 3.二叉树的中序遍历 4.二叉树的后序遍历 5.二叉树各个节点度的个数 6.二叉树的深度 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> ty…

如何修复Mac的“ kernel_task” CPU使用率过高的Bug?

当计算机开始缓慢运行时&#xff0c;这从来都不是一件有趣的事情&#xff0c;但是当您弄不清它为何如此缓慢时&#xff0c;甚至会变得更糟。如果您已经关闭了所有程序&#xff0c;并且Mac上的所有内容仍然感觉像是在糖蜜中移动&#xff0c;这可能是令人讨厌的kernel_task导致高…

mysql 中文编码问题

前言 最近在学springboot整合mybatisplus技术&#xff0c;用到mysql数据库&#xff0c;然后发现在windows下插入数据表会出现中文乱码现象 (例如 “我是谁” 在数据库中就成了 “???”) windows show variables like %char%;建表时, 设置默认charset为gbk create table u…