LongLoRA:高效扩展大语言模型上下文长度的微调方法

news2025/1/29 8:34:46

论文地址:https://arxiv.org/abs/2309.12307
github地址:https://github.com/dvlab-research/LongLoRA

1. 背景与挑战

大语言模型(LLMs)通常在预定义的上下文长度下进行训练,例如 LLaMA 的 2048 个 token 和 Llama2 的 4096 个 token。然而,这种预定义的上下文长度限制了模型在处理长文档或回答长问题时性能。

主要挑战:

  • 计算成本高昂: 扩展上下文长度会导致自注意力机制的计算成本呈二次增长,显著增加训练时间和 GPU 内存需求。例如,将上下文长度从 2048 扩展到 8192 会使自注意力层的计算成本增加 16 倍。
  • 现有微调方法的局限性:
    • 全量微调: 虽然效果最佳,但计算成本过高,普通研究者难以承受。例如,Position Interpolation 需要 32 个 A100 GPU 来将 LLaMA 模型从 2k 扩展到 8k 上下文长度,更长的上下文则需要 128 个 A100 GPU。
    • 低秩适应(LoRA): 虽然比全量微调更高效,但在长上下文扩展方面效果不佳,困惑度较高。

2. LongLoRA:高效扩展上下文长度的解决方案

LongLoRA 旨在以更低的计算成本高效地扩展预训练 LLMs 的上下文长度,同时保持与全量微调相近的性能。

2.1 主要创新点
  1. Shifted Sparse Attention (ΔS²-Attn): 一种高效的注意力机制替代方案,用于在训练过程中近似标准自注意力。

    • 工作原理:
      • 将上下文长度分割成若干组,在每组内独立进行注意力计算。
      • 在一半的注意力头中,将 token 序列偏移半个组大小,以确保相邻组之间的信息流动。
      • 例如,使用组大小为 2048 的 ΔS²-Attn 来近似总长度为 8192 的上下文训练。
    • 优势:
      • 高效性: 显著降低计算成本,与标准注意力相比,训练速度提升高达 1.8 倍。
      • 灵活性: 在推理时仍使用标准自注意力,因此可以复用现有的优化和基础设施,例如 Flash-Attention2。
      • 易于实现: 仅需两行代码即可实现。


    图 1:LongLoRA 的工作流程图,展示了在微调过程中引入的 Shifted Sparse Attention (ΔS²-Attn)。训练后的模型在推理时保留原始的标准自注意力。

  2. 改进的 LoRA: 通过使嵌入层和归一化层可训练,弥合了 LoRA 与全量微调之间的性能差距。

    • 原因: 嵌入层和归一化层虽然在整个 LLM 中占比较小,但在长上下文扩展中起着关键作用。例如,在 Llama2 7B 中,归一化层的参数占比仅为 0.004%。
    • 效果: 显著提升了长上下文扩展的性能,缩小了与全量微调的差距。


    图 2:不同微调方法在长上下文扩展中的困惑度对比。可以看出,改进后的 LoRA (LoRA+) 显著缩小了与全量微调的差距。

2.2 实验结果
  • 长序列语言建模: LongLoRA 在 PG19 和 proof-pile 数据集上的表现优于基线模型,表明其高效微调方法的有效性。

    • 例如,将上下文窗口大小从 8192 增加到 32768,Llama2 7B 模型的困惑度从 2.72 降低到 2.50。
  • 检索任务评估: 在 LongChat 引入的主题检索任务中,LongLoRA 模型与最先进的 LongChat-13B 性能相当,甚至在 16k 评估中略有优势。

  • 长上下文基准评估: 在 LongBench 和 LEval 基准测试中,LongLoRA 7B 模型表现出与基于 Llama2 的长上下文模型(如 Vicuna 和 LongChat)相当或更好的性能。

  • 效率分析:

    • 训练成本: LongLoRA 相比全量微调,训练时间和 GPU 内存需求显著降低。
      • 例如,在 65536 上下文长度下,LongLoRA 的训练时间仅为 LoRA 的 56.6%。
    • FLOPs 消耗: ΔS²-Attn 显著降低了 FLOPs 消耗,尤其是在长上下文长度下。


    图 3:不同上下文长度下 Llama2 7B 模型的 FLOPs 消耗分解。可以看出,随着上下文长度的增加,注意力计算的比例急剧增加,而 ΔS²-Attn 有效降低了注意力计算的 FLOPs。

3. 结论

LongLoRA 提供了一种高效扩展 LLMs 上下文长度的方法,具有以下优势:

  • 计算效率高: 相比标准全量微调,GPU 内存需求和训练时间更少,同时精度损失最小。
  • 架构兼容性: ΔS²-Attn 易于实现,训练后的模型在推理时保留原始的标准注意力架构,便于复用现有基础设施。
  • 性能优越: 在长上下文扩展方面,LongLoRA 实现了与全量微调相近的性能。

4. 未来展望

LongLoRA 是一种通用方法,未来可以与更多类型的 LLMs 和位置编码技术相结合,进一步提升其适用性和性能。

5. 补充说明

  • 实验设置: 所有实验均在单个 8x A100 机器上进行,使用 PyTorch、DeepSpeed 和 Flash-Attention2 进行训练。
  • 数据集: 使用 Redpajama 数据集进行训练,在 PG19 和 proof-pile 数据集上进行评估。
  • SFT(监督微调): 为了提高模型的问答能力,LongLoRA 进一步使用自收集的长指令跟随数据集 LongAlpaca 进行 SFT。

通过这些创新和实验结果,LongLoRA 为高效扩展 LLMs 的上下文长度提供了新的思路和方法。

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

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

相关文章

NoSQL使用详解

文章目录 NoSQL使用详解一、引言二、NoSQL数据库的基本概念三、NoSQL数据库的分类及使用场景1. 键值存储数据库示例代码(Redis): 2. 文档存储数据库示例代码(MongoDB): 3. 列存储数据库4. 图数据库 四、使用…

《FreqMamba: 从频率角度审视图像去雨问题》学习笔记

paper:FreqMamba: Viewing Mamba from a Frequency Perspective for Image Deraining GitHub:GitHub - aSleepyTree/FreqMamba 目录 摘要 1、介绍 2、相关工作 2.1 图像去雨 2.2 频率分析 2.3 状态空间模型 3、方法 3.1 动机 3.2 预备知识 3…

试用ChatGPT开发一个大语言模型聊天App

参考官方文档,安装android studio https://developer.android.com/studio/install?hlzh-cn 参考这个添加permission权限: https://blog.csdn.net/qingye_love/article/details/14452863 参考下面链接完成Android Studio 给项目添加 gradle 依赖 ht…

第30周:文献阅读

目录 摘要 Abstract 文献阅读 问题引入 方法论 堆叠集成模型 深度学习模型 创新点 堆叠模型 敏感性和不确定性分析 优化模型 实验研究 数据集 水质指数WQI的计算 模型的构建与训练 模型性能评估 敏感性和不确定性分析 结论 摘要 本文聚焦于利用深度学习算…

The just sharing principle: advice for advice givers

原文 A while ago I wrote about how Only you know what’s best for your application. That’s because only you fully understand the context within which you are making technical decisions. Any advice need to filtered through that context in order to determi…

【PVE】PVE部署磁盘阵列

什么是磁盘阵列? 磁盘阵列是一种存储技术,通过将多个物理磁盘组合成一个逻辑存储单元,提供数据冗余和/或性能提升。它的核心目的是提高数据的可靠性、可用性和访问速度。磁盘阵列可以由专用硬件或软件实现。 PVE部署磁盘阵列并加入虚拟机 …

FlinkSql使用中rank/dense_rank函数报错空指针

问题描述 在flink1.16(甚至以前的版本)中,使用rank()或者dense_rank()进行排序时,某些场景会导致报错空指针NPE(NullPointerError) 报错内容如下 该报错没有行号/错误位置,无法排查 现状 目前已经确认为bug,根据github上的PR日…

Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat

目录 ?编辑 一、Ubuntu22.04介绍 二、Ubuntu与Centos的区别 三、基于VMware安装Ubuntu Server 22.04 下载 VMware安装 1.创建新的虚拟机 2.选择类型配置 3.虚拟机硬件兼容性 4.安装客户机操作系统 5.选择客户机操作系统 6.命名虚拟机 7.处理器配置 8.虚拟机内存…

一个基于Python+Appium的手机自动化项目~~

本项目通过PythonAppium实现了抖音手机店铺的自动化询价,可以直接输出excel,并带有详细的LOG输出。 1.excel输出效果: 2. LOG效果: 具体文件内容见GitCode: 项目首页 - douyingoods:一个基于Pythonappium的手机自动化项目,实现了…

ubuntu 更新24LTS中断导致“系统出错且无法恢复,请联系系统管理员”

22LTS to 24LTS 更新过程中手jian把更新程序controlC导致的。 解决 目前企图完成更新来恢复,重启后有软件包冲突,sudo apt upgrade报冲突。无法进行。 将原来source.list重新 sudo dpkg --configure -a sudo apt install -f 这些都不管用。还是显示gno…

(2025,DeepSeek-R1-Zero,DeepSeek-R1,两阶段强化学习,两阶段监督微调,蒸馏,冷启动数据)通过强化学习激励 LLM 的推理能力

DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning 目录 0. 摘要 1. 简介 1.1 贡献 1.2 评测结果总结 2. 方法 2.1 概述 2.2 DeepSeek-R1-Zero:基础模型上的强化学习 2.2.1. 强化学习算法 2.2.2. 奖励建模 2.2.3. 训练…

k8s支持自定义field-selector spec.hostNetwork过滤

好久没写博客啦,年前写一个博客就算混过去啦😂 写一个小功能,对于 Pod,在没有 label 的情况下,支持 --field-selector spec.hostNetwork 查询 Pod 是否为 hostNetwork 类型,只为了熟悉 APIServer 是如何构…

图漾相机搭配VisionPro使用简易教程

1.下载并安装VisionPro软件 请自行下载VisonPro软件。 VisionPro 9.0/9.5/9.6版本经测试,可正常打开图漾相机,建议使用图漾测试过的版本。 2.下载PercipioCameraForVisionPro软件包 使用浏览器下载:https://gitee.com/percipioxyz/camport3…

【MFC】C++所有控件随窗口大小全自动等比例缩放源码(控件内字体、列宽等未调整) 20250124

MFC界面全自动等比例缩放 1.在初始化里 枚举每个控件记录所有控件rect 2.在OnSize里,根据当前窗口和之前保存的窗口的宽高求比例x、y 3.枚举每个控件,根据比例x、y调整控件上下左右,并移动到新rect struct ControlInfo {CWnd* pControl;CRect original…

【2024年华为OD机试】 (C卷,200分)- 机器人走迷宫(JavaScriptJava PythonC/C++)

一、问题描述 题目描述 房间由X * Y的方格组成,每个方格用坐标(x, y)描述。机器人从(0, 0)出发,只能向东或向北前进,出口在(X-1, Y-1)。房间中有一些墙壁,机器人不能经过。有些方格是陷阱(B),…

DAY01 面向对象回顾、继承、抽象类

学习目标 能够写出类的继承格式public class 子类 extends 父类{}public class Cat extends Animal{} 能够说出继承的特点子类继承父类,就会自动拥有父类非私有的成员 能够说出子类调用父类的成员特点1.子类有使用子类自己的2.子类没有使用,继承自父类的3.子类父类都没有编译报…

leetcode刷题记录(八十一)——236. 二叉树的最近公共祖先

(一)问题描述 236. 二叉树的最近公共祖先 - 力扣(LeetCode)236. 二叉树的最近公共祖先 - 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科 [https://baike.baidu.com/item/%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B…

PyTorch入门 - 为什么选择PyTorch?

PyTorch入门 - 为什么选择PyTorch? Entry to PyTorch - Why PyTorch? by JacksonML $ pip install pytorch安装完毕后,可以使用以下命令,导入第三方库。 $ import pytorch

STM32新建不同工程的方式

新建工程的方式 1. 安装开发工具 MDK5 / keil52. CMSIS 标准3. 新建工程3.1 寄存器版工程3.2 标准库版工程3.3 HAL/LL库版工程3.4 HAL库、LL库、标准库和寄存器对比3.5 库开发和寄存器的关系 4. STM32CubeMX工具的作用 1. 安装开发工具 MDK5 / keil5 MDK5 由两个部分组成&#…

Linux相关概念和易错知识点(26)(命名管道、共享内存)

目录 1.命名管道 (1)匿名管道 -> 命名管道 ①匿名管道 ②命名管道 (2)命名管道的使用 ①创建和删除命名管道文件 ②命名管道文件的特性 ③命名管道和匿名管道的区别 (3)用命名管道实现进程间通信…