You Only Cache Once:YOCO 基于Decoder-Decoder 的一个新的大语言模型架构

这是微软再5月刚刚发布的一篇论文提出了一种解码器-解码器架构YOCO,因为只缓存一次KV对,所以可以大量的节省内存。

以前的模型都是通过缓存先前计算的键/值向量,可以在当前生成步骤中重用它们。键值(KV)缓存避免了对每个词元再次编码的过程,这样可以大大提高了推理速度。

但是随着词元数量的增加,KV缓存占用了大量GPU内存,使得大型语言模型的推理受到内存限制。所以论文的作者改进了这一架构:

YOCO是为自回归建模而设计的,例如大型语言模型(llm)。所提出的解码器-解码器架构有两部分,即自解码器和交叉解码器,如下图所示

2个解码器架构

YOCO采用L块堆叠,其中前L/2层为自解码器,其余模块为交叉解码器,自解码器和交叉解码器都遵循与Transformer类似的块(即,交叉注意力和FFN)。

自解码器与交叉解码器的区别在于它们各自的注意力块不同,自解码器使用高效的自注意机制(例如,滑动窗口注意力)。而交叉解码器使用全局交叉注意力来关注自解码器输出产生的共享KV缓存。

自解码器:

以词元嵌入X0作为输入,计算中间向量表示M = X * u /²

这里的ESA(·)表示自注意力实现,SwiGLU(X) = (swish(XWG)⊙XW1)W2,其中的 LN(·)使用RMSNorm。

还在自注意力中使用了mask(遮蔽掉后面的内容),这个自注意力的模块在推理时的内存占用是 O(1),即KV缓存数为常数。

交叉解码器:

自解码器的输出X * u /²产生交叉解码器的全局KV缓存K, V:

其中,WK,WV∈Rd×d为可学习权重。

交叉解码器层在自解码器之后堆叠,获得最终输出向量XL。KV缓存{K}、{V}被所有L/2交叉解码器模块重用:

其中Attention(·)是标准的多头注意力,Wˡᵩ∈Rd×d为可学习矩阵。

交叉注意也应用了mask,并且使用分组注意力,进一步节省了KV缓存的内存消耗,在获得Xᴸ后,使用softmax分类器执行下一个词元的预测

推理的优势

1、节省GPU内存

下表比较了transformer和YOCO的存储复杂度,其中N、L、D分别为序列长度、层数和隐藏维数

全局KV缓存被重用,并且只需要恒定的缓存,数量为O (N + CL),其中N为输入长度,C为常数(如滑动窗口大小),L为层数。这样对于长序列,CL远小于N,因此只需要大约O(N)个缓存,就是论文名字说的 “只缓存一次”。相比之下,Transformer解码器在推理期间必须存储N × L个键和值,与Transformer解码器相比,YOCO大约为缓存节省了L倍的GPU内存

2、减少预填充时间

下图显示了YOCO 推理时的并行编码和逐个解码输出。

如上图所示,由于交叉解码重用了自解码的输出,使得预填充可以在不改变最终输出的情况下提前得到结果,从而大大加快了预填充阶段。

自解码器的选择

1、门控保留率

门控保留(gRet,又名gRetNet或RetNet-3)通过数据依赖的门控机制增强了保留,从而在序列建模中同时实现了训练并行性、良好的性能和较低的推理成本。该方法统一了并行、递归和块递归计算范式

并行表示的门控保留率定义为:

其中W,Wₖ,Wᵥ∈Rd×d和Wγ∈Rd×1是可学习的权重,并且温度项τ鼓励γ到1以更好地记忆

2、递归表示

门控保持的输出等价于并行表示,可以循环计算。对于第n个时间步长,通过以下方式获得输出:

其中Q K V γ和并行表示的定义是一样的

3、分段递归表示

分段表示是循环表示和并行表示的统一形式。给定块大小B,输出以块为单位计算,计算分为块内部分和跨块部分设[i]为第i个块,即x[i] = x(i−1)B+1,····,xiB,则第i个块计算为:

其中Ri是第i块的中间态,β总结了数据控制的衰变γ。

4、多头门控保留

与多头注意[VSP+17]和多尺度保留类似,作者对每个头部应用门控保留,并将输出组合在一起:

其中WG,WO∈Rd×d是可学习的矩阵,GroupNorm对每个头进行规范化,swish gate应用于增加非线性

5、滑动窗口的注意力

滑动窗口注意将注意范围限制为固定的窗口大小C,在推理过程中,KV缓存复杂度可以从O (N)降低到O ©,即内存占用是恒定的,而不是随着序列长度的增加而增加。与多头自注意力类似,可以通过以下方式计算滑动窗口注意的输出:

这里的WQ,WK,WV,WO∈Rd×d为可学习矩阵,窗口因果掩码B控制每个查询只关注距离小于C

实验结果

作者通过增加训练词元的数量来训练一个3B大小的YOCO语言模型。然后与基于transformer的语言模型进行比较。

与LM Eval Harness上的OpenLLaMA-v2-3B、StableLMbase-alpha-3B-v2和StableLM-3B-4E1T进行比较结果如下:

跨端任务的实验结果表明,YOCO与Transformer语言模型取得了相当的结果,同时在训练方面具有可扩展性。

Llama Transformer、带门控的YOCO (YOCOgRet)和带滑动窗口注意力的YOCO (YOCOSWA)使用相同的训练数据和设置训练不同规模(160M、400M、830M、1.4B、2.7B、6.8B、13B)的语言模型。Transformer架构增强了Llama的改进,如RMSNorm、SwiGLU和消除偏差。

与llama优化架构相比,YOCO在160M到13B的范围内获得了相当的性能,这表明YOCO在模型尺寸方面可以有效地扩展。YOCOgRet优于Transformer和YOCOSWA是因为注意力和混合架构,它们的归纳偏差往往是相互补充的。

将YOCO-3B的上下文长度扩展到1M标记,并对长上下文模型在检索和语言建模任务上进行评估。

YOCO- 3b - 1m以近乎完美的精度通过了“Needle-In-A-Haystack”测试,表明YOCO具有较强的长上下文建模能力

下表报告了N needles的精度。N = 1为参考单针检索,N > 1为多针检测。评估以128K长度进行,因为大多数以前的长上下文模型都是用这个长度进行调优的。

YOCO-3B-1M可以用一半的模型尺寸达到相当的性能。与MiniCPM-128K和ChatGLM3-128K相比,YOCO-3B-1M也优于这些语言模型。

下表显示了累积平均负对数似然(NLL)作为上下文长度的函数

NLL随序列长度的增加而降低,表明YOCO可以有效地利用远程依赖进行语言建模。

推理的优势

将YOCOgRet与Transformer进行比较

1、GPU内存

推理内存消耗由模型权重、中间激活和KV缓存三部分组成。

随着上下文长度的增加,KV缓存成为主要的内存瓶颈,而模型权重消耗恒定的内存,表明YOCOgRet减轻了激活成本和KV缓存内存占用。下图显示了Transformer和YOCO在不同长度上的推理内存,由此得出使用YOCO可以显著降低内存成本的结论

下图显示了不同模型大小的每个词元的KV缓存的GPU内存消耗

由于YOCO只缓存一层全局键值对,所以它需要的内存比Transformer大约少L倍。

在预填充阶段,模型并行地对输入进行编码。下图显示了不同长度的预填充延迟,即给定输入提示符在生成第一个结果之前的编码时间

Transformer的时间呈二次增长,而YOCO的时间呈线性增长。即使对于较短的输入长度,例如32K, YOCO仍然可以加速2.87倍

吞吐量表示模型每秒可以处理多少词元,包括预填充时间和生成时间下图显示了Transformer和YOCO在改变上下文长度时的推理吞吐量。

YOCO实现了更高的跨上下文长度的吞吐量。

总结

论文提出了一种用于大型语言建模的解码器-解码器体系结构(YOCO)。与Transformers相比,YOCO具有更好的推理效率和竞争性能。实验结果表明,在各种设置下,YOCO在大型语言模型上取得了良好的效果,即扩大训练词元数量,扩大模型大小,将上下文长度扩大到1M词元。分析结果还表明,YOCO将推理效率提高了几个数量级,特别是对于长序列建模

论文地址:

https://avoid.overfit.cn/post/90e0bd170644476cbccabb039e7105ae

作者:SACHIN KUMAR

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

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

相关文章

C/C++常用的编译器分类

1.GCC家族 GNU GCC、GNU C、Mingw、Dev-C(Mingw)、Cygwin、DJGPP gcc 原名GNU C Collection,后因支持多种编程语言,改名为GNU Compiler Collection,是大多数类Unix(如Linux)的标准编译器,且适用于Windows(借助其他移植项目实现&…

Zookeeper笔记,MIT6.824

ZooKeeper旨在提供一个简单和高性能的内核,使得客户端可以构建更复杂的协调原语。 它将组消息传递、共享寄存器和分布式锁等服务整合到一个重新分配的、集中的服务中。 由ZooKeeper暴露出来的接口在共享寄存器方面具有无等待的特性,使用类似于分布式文件…

.NET应用程序中实现安全性的最佳实践

在.NET应用程序中实现安全性是一个复杂但至关重要的任务。 以下是一些关于身份验证、授权、加密和数据保护的最佳实践: 一、身份验证 使用强密码策略:确保用户创建复杂的密码,并定期更改。多因素身份验证:除了用户名和密码外&a…

[力扣题解]1005. K 次取反后最大化的数组和

题目:1005. K 次取反后最大化的数组和 思路 贪心法; 用绝对值大小排序,自己写一个比较函数, static bool compare(int a, int b) {return abs(a) > abs(b); }注意这样写出来是降序排列; 2次贪心: &a…

全学科知网普刊征稿中!即日提交,月内即可见刊!

在当前的学术环境下,论文发表的压力日益增大。当您需要评职称、申请学位、结项课题或完成其他有期限的学术要求时,快速发表普刊能够确保您及时满足这些需求,提升您的职业竞争力,为您的职业发展需求打下坚实基础。 我处普刊现积极…

我的全新官网

科技语者-探索未来的语言和沟通 (chgskj.cn) 另外我还开放了一个网站科技语者-介绍页 (null.fit)

无锡哲讯在SAP实施方面的有哪些优势?

无锡哲讯在SAP实施领域展现出的专业性、技术实力和客户服务等方面的优势,使其成为众多企业在SAP相关项目中的优选合作伙伴。下面就从行业经验、解决方案、技术实力、服务范围和客户口碑几大方面介绍无锡哲讯在SAP实施领域的优势: 丰富的行业经验&#xf…

iOS 音量键拍照(延时拍照)

写在前面 下面有两种方法可以实现,一种简单,一种复杂,简单的方法曾经遇到过无法实现的问题,目前不确定为什么。 这是复杂实现的demo,使用很简单,就不做文字解释了 一. 思路 首先需要监听音量键的点击&a…

Java反射(含静态代理模式、动态代理模式、类加载器以及JavaBean相关内容)

目录 1、什么是反射 2、Class类 3、通过Class类取得类信息/调用属性或方法 4、静态代理和动态代理 5.类加载器原理分析 6、JavaBean 1、什么是反射 Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得…

速盾:高防服务器和高防cdn的区别

高防服务器和高防CDN是两种常用的网络安全解决方案,用于保护网站免受恶意攻击和DDoS攻击的影响。虽然它们都有类似的目标,但在保护机制、性能表现和适用场景等方面有一些区别。 首先,高防服务器是一种物理硬件设备,通常是一台具备…

java基础之面向对象的思想

一、面向对象和面向过程的编程思想对比 面向过程:是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的(自己干活)。 面向对象:是一种以对象为中心的编程思想,通过指挥对象实现具体的…

智慧生活:AI工具如何改变我们的工作与生活

文章目录 📑前言一、常用AI工具:便利与高效的结合1.1 语音助手1.2 智能推荐系统1.3 自然语言处理工具 二、创新AI应用:不断突破与发展2.1 医疗诊断AI2.2 智能家居2.3 无人驾驶技术 三、AI工具在人们生活中的应用和影响3.1 生活方式的变化3.2 …

docker和docker-compose常用指令

在 Docker 中&#xff0c;有许多常用的命令来管理容器、镜像、网络和卷。这些命令对于修复错误、更新、重建和重新运行应用尤为重要。下面是一些最常用的 Docker 命令和它们的基本用途&#xff1a; ### 1. 容器管理 - **启动容器**: bash docker start <容器ID或名称&g…

Stream流入门和创建方式

Java 8引入了Stream API&#xff0c;它提供了一种新的数据处理方式&#xff0c;使得集合和数组的处理更加灵活、高效。Stream API不是直接操作数据结构中的元素&#xff0c;而是对数据源创建一个数据流&#xff0c;通过声明式的方式对数据进行操作&#xff0c;如过滤、映射、排…

搭建本地yum仓库

步骤 找个地方存你的rpm包 #我创建了一个rpm文件夹存放我的rpm包 makdir -p /opt/repo/rpmcreaterepo 这个很重要&#xff0c;一定要安装 # 我的能连外网&#xff0c;所以直接yum安装&#xff0c;你的自己想办法 yum install createrepo -y创建repodata 安装了createrepo后…

在lua中一般使用dofile或require来执行程序块

在Lua中&#xff0c;通常可以使用dofile函数或require函数来执行程序块。 dofile函数用于执行指定文件中的Lua代码。它会执行文件中的代码并返回该代码块的返回值&#xff08;如果有的话&#xff09;。示例用法如下&#xff1a; dofile("myfile.lua")require函数也用…

【C++】引用传递 常量引用

在C中&#xff0c;引用传递和常量引用是两个常用的概念&#xff0c;主要用于函数参数传递。它们提供了对变量或对象更有效率和更安全的访问方式。 引用传递&#xff08;Pass by Reference&#xff09; 引用传递意味着当你将变量作为参数传递给函数时&#xff0c;你实际上是传…

《快快网络2024年DDoS攻击趋势白皮书》网络安全的新挑战与应对之道

随着信息技术的飞速发展&#xff0c;网络空间已成为国家、企业乃至个人生存与发展的重要基础。然而&#xff0c;伴随着网络空间的日益扩大&#xff0c;网络安全问题也日益凸显&#xff0c;其中DDoS攻击便是其中最为严重且难以防范的一种。近日&#xff0c;快快网络发布的《快快…

SOA构架介绍

1.SOA定义 SOA面向服务的架构是一种计算机环境设计、开发、部署和管理离散模型的方法&#xff0c;SOA中所有的功能都被定义成立独立的服务&#xff0c;所有的服务通过总线&#xff08;ESB)或者流程管理连接。这种松耦合的结构使得服务器在交互的过程中无需考虑双方内部细节&am…

MATLAB--Number Manipulation II

例1.Problem 2193. Mysterious digits operation (easy) What is this digit operation? 0 -> 01 -> 9121 -> 944 -> 615 -> 51243 -> 7... 这是一个数字运算。具体规则如下&#xff1a; 0 变为 01 变为 9121 变为 944 变为 615 变为 51243 变为…