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

2024-05-12 13:28

本文主要是介绍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

这篇关于You Only Cache Once:YOCO 基于Decoder-Decoder 的一个新的大语言模型架构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/982756

相关文章

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

如何合理管控Java语言的异常

《如何合理管控Java语言的异常》:本文主要介绍如何合理管控Java语言的异常问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、Thorwable类3、Error4、Exception类4.1、检查异常4.2、运行时异常5、处理方式5.1. 捕获异常

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进

$在R语言中的作用示例小结

《$在R语言中的作用示例小结》在R语言中,$是一个非常重要的操作符,主要用于访问对象的成员或组件,它的用途非常广泛,不仅限于数据框(dataframe),还可以用于列表(list)、环境(enviro... 目录1. 访问数据框(data frame)中的列2. 访问列表(list)中的元素3. 访问jav

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印