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

【论文笔记】LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models

🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。


基本信息

标题: LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models
作者: Yukang Chen, Shengju Qian, Haotian Tang, Xin Lai, Zhijian Liu, Song Han, Jiaya Jia
发表: ICLR 2024
arXiv: https://arxiv.org/abs/2309.12307

基本信息

摘要

我们提出了LongLoRA,一种高效的微调方法,它通过有限的计算成本扩展了预训练大型语言模型(LLM)的上下文大小。

通常,使用长上下文大小训练LLM在计算上非常昂贵,需要大量的训练时间和GPU资源。例如,在 8192 8192 8192 个上下文长度的训练中,自注意力层的计算成本是 2048 2048 2048 个上下文长度的 16 16 16 倍。

在本文中,我们从两个方面加速了LLM上下文扩展。

一方面,尽管在推理过程中需要密集的全局注意力,但通过稀疏局部注意力可以有效地进行模型微调。提出的移位稀疏注意力(S2-Attn)有效地实现了上下文扩展,与使用标准注意力微调具有相似的性能,同时实现了显著的计算节省。特别是,它可以在训练中仅用两行代码实现,而在推理中是可选的。

另一方面,我们重新审视了参数高效的上下文扩展微调机制。值得注意的是,我们发现LoRA在可训练嵌入和归一化的前提下,对于上下文扩展效果良好。LongLoRA将这种改进的LoRA与 S 2 S^2 S2-Attn相结合。

LongLoRA在Llama2模型(从7B/13B到70B)的各种任务上展示了强大的实证结果。LongLoRA将Llama2 7B的上下文从4k扩展到100k,或将Llama2 70B扩展到32k,在单个8×A100机器上完成。

LongLoRA在保持原始架构的同时扩展了模型的上下文,并且与大多数现有技术兼容,如Flash-Attention2。

此外,我们还使用LongLoRA和我们的长指令遵循LongAlpaca数据集进行了监督微调。

我们所有的代码、模型、数据集和演示代码都可在github.com/dvlab-research/LongLoRA上找到。

简介

LongLoRA closes the accuracy gap that between conventional LoRA and full fine-tuning, while still maintaining up to 1.8× lower memory cost than full fine-tuning. Furthermore, LongLoRA improves the training speed of LoRA by up to 1.8× with S2-Attn. Llama2-7B are fine-tuned to various context lengths with Flash-Attention2 (Dao, 2023) and DeepSpeed (Rasley et al., 2020) stage 2 and evaluated on the proof-pile (Azerbayev et al., 2022) test set in perplexity.

LongLoRA缩小了传统LoRA和全量微调之间的精度差距,同时保持了比全量微调低1.8倍的内存成本。此外,LongLoRA通过 S 2 S^2 S2-Attn 将LoRA的训练速度提高了高达1.8倍。Llama2-7B使用Flash-Attention2和DeepSpeed的第二阶段进行微调,并在 proof-pile 测试集上评估了困惑度。

Illustration of S2-Attn. It involves three steps. First, it splits features along the head dimension into two chunks. Second, tokens in one of the chunks are shifted by half of the group size. Third, we split tokens into groups and reshape them into batch dimensions. Attention only computes in each group in ours while the information flows between groups via shifting. Potential information leakage might be introduced by shifting, while this is easy to prevent via a small modification on the attention mask. We ablate this in the variant 2 in Section B.3 in the appendix.

S 2 S^2 S2-Attn的示意图涉及三个步骤。首先,它将特征沿头部维度分为两个部分。其次,其中一个部分中的token向右移动了组大小的一半。第三,我们将token分成组,并将它们重塑为批量维度。在我们的模型中,注意力仅在每组中计算,而信息通过移动在组之间流动。移动可能会引入潜在的信息泄露,但通过在注意力掩码上进行微小修改可以轻松防止。

LongLoRA

背景

Transformer

大型语言模型(LLMs)通常是基于 Transformer 构建的。例如,以 Llama2 为例,一个 LLM 模型由一个嵌入输入层和若干解码器层组成。每个解码器层包含一个自注意力模块。它通过带有权重矩阵 { W q , W k , W v } \{W_q, W_k, W_v\} {Wq,Wk,Wv} 的线性投影层将输入特征映射为一组查询、键和值 { q , k , v } \{q, k, v\} {q,k,v}。给定 { q , k , v } \{q, k, v\} {q,k,v},它计算输出 o o o

o = softmax ( q k T ) v o = \text{softmax}(qk^T)v o=softmax(qkT)v

输出随后通过一个权重矩阵 W o W_o Wo 的线性层进行投影,接着是多层感知机(MLP)层。在自注意力模块之前和之后,会应用层归一化。所有解码器层完成后,还会进行一次最终归一化。

对于较长的序列,自注意力在计算成本方面表现出困难,其计算复杂度与序列长度成平方关系。这大幅减慢了训练过程,并增加了 GPU 内存的使用成本。

Low-rank Adaptation

LoRA假设预训练模型中的权重更新在适配期间具有较低的内在秩(intrinsic rank)。对于一个预训练权重矩阵 W ∈ R d × k W \in \mathbb{R}^{d \times k} WRd×k,它通过低秩分解 W + Δ W = W + B A W + \Delta W = W + BA W+ΔW=W+BA 来更新,其中 B ∈ R d × r B \in \mathbb{R}^{d \times r} BRd×r A ∈ R r × k A \in \mathbb{R}^{r \times k} ARr×k。秩 r ≪ min ⁡ ( d , k ) r \ll \min(d, k) rmin(d,k)。在训练期间, W W W 被冻结(没有梯度更新),而 A A A B B B 是可训练的。这就是 LoRA 训练比完全微调更高效的原因。

在 Transformer 结构中,LoRA 仅适配注意力权重 { W q , W k , W v , W o } \{W_q, W_k, W_v, W_o\} {Wq,Wk,Wv,Wo},并冻结所有其他层,包括 MLP 和归一化层。这种方式简单且参数高效。然而,我们通过实验证明,仅在注意力权重中的低秩适配并不能很好地适用于长上下文扩展任务。

Shifted Sparse Attention

标准的自注意力计算成本为 O ( n 2 ) \mathcal{O}(n^2) O(n2),这使得长序列上的LLM具有高内存成本和低速。为了在训练期间避免这一问题,我们提出了移位稀疏注意力( S 2 S^2 S2-Attn),如图2所示。接下来,我们将进行一项初步研究,并逐步解释我们的设计。

Overview of LongLoRA. We introduce Shifted Sparse Attention (S2-Attn) during finetuning. The trained model retains original standard self-attention at inference time. In addition to training LoRA weights in linear layers, LongLoRA further makes embedding and normalization layers trainable. This extension is pivotal for context extension, and only introduces a minimal number of additional trainable parameters.

Pilot Study

在表1中,我们建立了一个标准基线,该基线经过完整注意力和微调训练和测试,在各种上下文长度下表现出一致的良好质量。第一次试验是使用短注意力进行训练,仅模式1如图2所示。正如我们所知,在长上下文中,高昂的成本主要来自自注意力模块。因此,在这次试验中,由于输入很长,我们在自注意力中将其分为几个组。例如,模型在训练和测试阶段都以8192个token作为输入,但在每个组中进行自注意力操作,组大小为2048,组数为4。这种模式效率很高,但在非常长的上下文中仍然不起作用,如表1所示。随着上下文长度的增加,困惑度变大。其背后的原因是没有不同组之间的信息交换。

Effectiveness of S2-Attn under different context lengths

为了引入组之间的通信,我们包括了一个移位模式,如图2所示。我们在半注意力头中将组分区移位半个组大小。以总体8192个上下文长度为例,在模式1中,第一组从第1个到第2048个token进行自注意力。在模式2中,组分区移位1024。第一个注意力组从第1025个开始到第3072个token结束,而前1024个和最后1024个token属于同一组。我们在每个半自注意力头中分别使用模式1和模式2。这种方式不会增加额外的计算成本,但能够实现不同组之间的信息流。我们在表1中展示了它接近标准注意力基线的结果。

Consistency to Full Attention

现有的高效注意力设计也可以提高长上下文LLM的效率。然而,大多数这些设计并不适合长上下文微调。因为这些从头开始训练的Transformer与预训练中使用的标准全注意力存在差距。在表6中,我们展示了 S 2 S^2 S2-Attn 不仅能够实现高效的微调,还支持全注意力测试。尽管其他注意力机制也可以用于长上下文微调,但模型必须使用微调期间使用的注意力进行测试。移位防止了模型对特定注意力模式的过度拟合。

Easy Implementation

S 2 S^2 S2-Attn易于实现。它仅涉及两个步骤:

  1. 在半注意力头中移位token;
  2. 将特征从token维度转置到批次维度。

两行代码就足够了。我们在算法1中提供了一个PyTorch风格的代码示例。

Algorithm 1: Pseudocode of S2-Attn in PyTorch-like style.

Improved LoRA for Long Context

LoRA是一种高效且流行的将LLMs适应其他数据集的方法。与全微调相比,它节省了大量的可训练参数和内存成本。然而,将LLMs从短上下文长度适应到长上下文长度并不容易。我们观察到LoRA与全微调之间存在明显的差距。如表2所示,随着目标上下文长度的增加,LoRA与全微调之间的差距逐渐增大。并且,具有更大秩的LoRA无法缩小这个差距。

Finetuning normalization and embedding layers is crucial for low-rank long-context adaptation

为了弥合这一差距,我们为训练打开了嵌入层和归一化层。如表2所示,它们占用的参数有限,但对长上下文适应有显著效果。特别是对于归一化层,参数在整个Llama2 7B中仅占0.004%。在实验中,我们将这种改进版的LoRA称为LoRA+。

实验

主实验

Perplexity evaluation on proof-pile (Rae et al., 2020) test split

Maximum context length that we can fine-tune for various model sizes on a single 8× A100 machine

Topic retrieval evaluation with LongChat (Li et al., 2023)

Accuracy comparison on passkey retrieval between Llama2 7B and our 7B model fine-tuned on 32768 context length

消融实验

Ablation on fine-tuning steps in both full fine-tuning and LoRA+

Comparisons among S2-Attn and alternative attention patterns during fine-tuning

总结

在这项工作中,我们提出了LongLoRA,它能够高效地扩展LLMs的上下文长度,使其显著更大。

与标准全微调相比,LongLoRA具有更低的GPU内存成本和训练时间,同时精度损失最小。

在架构层面,我们提出了 S 2 S^2 S2-Attn,用于在训练过程中近似标准自注意力模式。 S 2 S^2 S2-Attn 易于实现,仅需两行代码。

此外,通过 S 2 S^2 S2-Attn 训练的模型在推理过程中保留了原始的标准注意力架构,使得大多数现有基础设施和优化可以重用。

在训练层面,我们通过可训练归一化和嵌入弥合了LoRA与全微调之间的差距。

我们的方法可以将Llama2 7B扩展到100k上下文长度,将70B模型扩展到32k上下文长度,在单个8×A100机器上实现。

我们还提出了一个长指令遵循数据集LongAlpaca,并使用LongLoRA进行了监督微调。

我们相信LongLoRA是一种通用方法,可以与更多类型的LLMs和位置编码兼容。

我们计划在未来工作中调查这些问题。

相关文章:

【论文笔记】LongLoRA: Efficient Fine-tuning of Long-Context Large Language Models

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: LongLoRA: Efficient Fine…...

数据挖掘——朴素贝叶斯分类

数据挖掘——朴素贝叶斯分类 朴素贝叶斯分类极大后验假设独立性假设贝叶斯分类器总结 朴素贝叶斯分类 什么是分类? 找出描述和区分数据类或概念的模型,以便能够使用模型预测未知的对象的类标号 概念区分 分类与回归 分类是预测分类(离散、…...

unity中的UI系统---GUI

一、工作原理和主要作用 1.GUI是什么? 即即时模式游戏用户交互界面(IMGUI),在unity中一般简称为GUI,它是一个代码驱动的UI系统。 2.GUI的主要作用 2.1作为程序员的调试工具,创建游戏内调测试工具 2.2为…...

鸿蒙Flutter实战:15-Flutter引擎Impeller鸿蒙化、性能优化与未来

Flutter 技术原理 Flutter 是一个主流的跨平台应用开发框架,基于 Dart 语言开发 UI 界面,它将描述界面的 Dart 代码直接编译成机器码,并使用渲染引擎调用 GPU/CPU 渲染。 渲染引擎的优势 使用自己的渲染引擎,这也是 Flutter 与其…...

C语言冒泡排序教程简介

冒泡排序(Bubble Sort)是一种简单的排序算法,因其工作原理像气泡一样逐渐上浮而得名。其基本思想是通过一轮一轮地比较相邻的元素,将较大的元素逐步“冒泡”到数组的尾部。 在本篇博客中,我们将详细讲解冒泡排序的基本…...

Fabric链码部署测试

参考链接:运行 Fabric 应用程序 — Hyperledger Fabric Docs 主文档 (hyperledger-fabric.readthedocs.io) (2)fabric2.4.3部署运行自己的链码 - 知乎 (zhihu.com) Fabric2.0测试网络部署链码 - 辉哥哥~ - 博客园 (cnblogs.com) 1.启动测试…...

k620老显卡,装cuda.等。

CUDA安装教程(超详细)-CSDN博客 1.下载支持12.0以上的驱动 NVIDIA RTX Driver Release 550 R550 U12 (553.50) | Windows 11 解压。安装。一路下一步。查看结果 2.下载 cuda CUDA Toolkit Archive | NVIDIA Developer 安装cuda时,第一次…...

网站常用功能模块-鉴权

一:JWT是什么? 常用鉴权方式有很多种,今天主要介绍基于token的鉴权方式JWT(Json JSON Web Token)。因为这种方式实现起来方便快捷。整体实现逻辑如下 第一次登陆时,前端携带账号和密码请求登录接口。服务…...

直接插入排序、折半插入排序、2路插入排序、希尔排序

本篇是排序专栏博客的第一篇,主要探讨以 “插入” 为核心思想的排序算法该如何实现 文章目录 一、前言二、直接插入排序1. 算法思想与操作分析2. 代码实现version 1version 2 3. 复杂度分析 三、折半插入排序1. 算法思想与操作分析2. 代码实现3. 复杂度分析 四、2路…...

FQ-GAN代码解析

主要看 model 、loss 和 data 部分如何实现和处理的。 model—VQ_modelsVQModelEncoderVectorQuantizerDecoder loss—VQLoss_triple_codebook model—VQ_models 创建vq_model直接根据传入的模型压缩倍率8/16初始化对应的VQ_8/VQ_16,两者都是初始化一个VQModel的类…...

如何恢复已删除的 Telegram 消息 [iOSamp;Android]

Telegram 是一款功能强大的消息应用程序,因其易用性、隐私保护和众多炫酷功能而深受用户喜爱。然而,有时我们会不小心删除重要的消息。在这种情况下你应该做什么? 本文将为您提供简单有效的解决方案来恢复 Telegram 上已删除的消息&#xff…...

asp.net core中的 Cookie 和 Session

在 Web 开发中,用户会话管理是非常重要的,尤其是在需要保持用户状态和身份验证的应用中。ASP.NET Core 提供了多种状态管理技术,如 Cookie 和 Session,它们可以帮助你管理用户会话、存储数据并实现用户身份验证等功能。下面将详细…...

Python实现一个简单的 HTTP echo 服务器

一个用来做测试的简单的 HTTP echo 服务器。 from http.server import HTTPServer, BaseHTTPRequestHandler import jsonclass EchoHandler(BaseHTTPRequestHandler):def do_GET(self):# 构造响应数据response_data {path: self.path,method: GET,headers: dict(self.headers…...

Ruby 中文编码

Ruby 中文编码 在 Ruby 编程语言中处理中文编码是一个常见的需求,尤其是在中国和其他使用中文的地区。Ruby 是一种动态、开放源代码的编程语言,它支持多种字符编码,包括中文编码。本文将探讨在 Ruby 中处理中文编码的几种方法,以…...

淘金优化算法的信息共享与更新机制改进

淘金优化算法作为一种模拟自然界淘金过程的启发式搜索算法,在解决复杂优化问题时展现出独特优势。然而,其性能在很大程度上依赖于信息共享与更新机制的有效性。传统机制在面对高维、多模态等复杂问题时,往往存在信息交流不畅、更新滞后等问题,导致算法陷入局部最优或收敛速…...

Python中的ast.literal_eval:安全地解析字符串为Python对象

Python中的ast.literal_eval:安全地解析字符串为Python对象 什么是ast.literal_eval?为什么说它是“安全”的? 如何使用ast.literal_eval?示例1:将字符串转换为列表示例2:将字符串转换为字典示例3&#xff…...

【AI数学基础】线性代数:内积和范数

(观前提醒,这是工科AI相关的数学基础的学习笔记,不是数学专业的文章,所以没有严谨的证明和定义,数院大神请勿批评) 2. 内积和范数 2.1 内积的定义 从代数的角度来说,内积是两个向量之间的一种…...

Go语言的 的泛型(Generics)核心知识

Go语言的泛型(Generics)核心知识 引言 在编程语言的发展历程中,泛型是一项重要的特性。它使得程序员能够编写更加灵活和可重用的代码,减少了代码重复,提高了类型安全性和性能。从最初的C和Java,到现代的R…...

C++vector

1. vector 的介绍及使用 1.1vector的介绍 vector的文档介绍 1.vector是表示可变大小数组的序列容器 2.就像数组一样,vector也采用的连续存储空间来存储元素,也就是意味着可以采用下标对vector 的元素进行访问,和数组一样高效但是又不像数组…...

如何配置【Docker镜像】加速器+【Docker镜像】的使用

一、配置Docker镜像加速器 1. 安装/升级容器引擎客户端​ 推荐安装1.11.2以上版本的容器引擎客户端 2. 配置镜像加速器​ 针对容器引擎客户端版本大于1.11.2的用户 以root用户登录容器引擎所在的虚拟机 修改 "/etc/docker/daemon.json" 文件(如果没有…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...