KV Cache大模型推理加速功能
KV Cache
KV Cache是大模型标配的推理加速功能,也是推理过程中,显存资源巨大开销的元凶之一。在模型推理时,KV Cache在显存占用量可达30%以上。
目前大部分针对KV Cache的优化工作,主要集中在工程上。比如著名的VLLM,基于paged Attention,最大限度地利用碎片化显存空间,从而提升了空间利用率。
但是这些方案并没有从根本上改变KV Cache占用空间巨大的问题。
我们先来看看KV Cache的基本原理,然后在文章后面详细介绍DeepSeek MLA机制时,再来看DeepSeek-V2是怎么解决这个问题的。
KV Cache基本原理
如果不熟悉Transformer的生成过程,这部分推荐看看国外博主Jay Alammar的这篇文章:https://jalammar.github.io/illustrated-gpt2/
我们先回到Transformer计算Attention的公式,
大模型的推理是一个自回归的过程,即一个从头到尾逐步生成的过程。下一步的输出,取决于上一步。
假如我们需要输出Robot must obey orders这四个字。
模型生成第一步Robot时,会接收一个特殊字符,作为第一步的输入,然后输出Robot。接着将“ Robot”作为第二步的输入,生成must,以此类推,直到模型输出遇到最大长度限制,或者输出了停止字符,则停止输出过程。
我们来模拟一个输出过程中每一步全局的Masked Attention的计算过程。这里公式中忽略了
以便展示。
每一行代表一个查询向量与所有键向量的点积,但由于掩码的存在,每个查询只能访问它自己和之前的键(因果关系)。毕竟在生成的过程中,是不能看到后续的值的。
最后输出的softmax结果大概如下:
然后再将这个softmax结果,和对应的V值进行计算。在这个过程中,上面的矩阵计算,四行的Attention拆解下来如下,
我们可以发现这么一些规律:
每一个
的计算,只取决于当前步的,不需要以前的
。
之前的K和V,在后面会被重复利用。
那么这里就很清楚了,随着生成序列的增加,计算Attention的增多,前面步骤的K和V都需要参与后续的计算。
所以我们如果将之前的K和V都存储下来,就不用在当前这一步,再重新生成计算一次以前生成过的K和V。这就是KV Cache。一种空间换时间的做法。
所以可以看出,随着序列增长,需要存储的K和V逐渐增多,因此推理中产生的开销也会越大。
MOE架构
MOE层替代的是传统Transformer架构中FFN这一层。就是图中框红圈的Feed Forward层。
之前有写过一篇介绍大模型推理加速的文章,
队长:大模型推理加速,从逮虾户说起34 赞同 · 0 评论文章
阐述了FFN层
的几个问题,
第一,是FFN层参数量巨大,大概占了整个模型参数量的三分之二左右。
第二,FFN层的激活存在较大的稀疏性,也就是针对某些问题的输入,FFN层只有部分的参数是有用的。
MOE架构主要针对第二个问题进行了较大的改进。简而言之就是将一个完整的FFN,替换成由多个“专家网络
”组成的神经网络,这个神经网络可以是简单的FFN,或者其它结构。从而在推理或者训练时,能够针对不同的数据进行解耦,增加效率。
从上图的结构可以看出,MOE架构包含两个部分:
一个是之前说的多个专家网络组成的稀疏MOE层。
另一个是门控网络,决定了模型的输入,需要由哪个专家网络进行处理。
这么做的好处在推理中体现如下,
首先,提升了模型的拓展性,MoE的每个专家都负责处理一部分数据。这意味着整个模型可以包含大量的专家(和相应的参数),而每次只有少部分专家被激活处理特定的数据。这样,我们可以扩展模型的能力而不必担心处理速度变慢。
只有被门控机制选中的专家才会参与到当前输入的处理中。这不仅使模型在处理单个任务时更为高效,而且大大减少了不必要的计算,每个专家只计算与其专长相关的数据。
不过,也有随之而来的问题,最主要的问题是,需要设计一个高效和公平的门控机制,即负载均衡问题。它需要确保正确的专家被激活,同时避免某些专家被过度使用而其他专家则几乎闲置。
此外,还得确保每个专家都能得到足够的训练,以避免过拟合或欠拟合的问题,否则输出的稳定性会受到极大影响。
DeepSeek-V2详解
说完了背景知识,KV Cache和MOE,以及它们存在的一些问题。
我们可以来看看DeepSeek-V2对上述两个核心部分到底做了哪些改进。
Multiple Latent Attention
MLA是对传统多头注意力做的改进,其目的有两个:
降低推理过程中的KV Cache资源开销。
缓解MQA、MGA对性能的损耗。
首先来说第一点,之前介绍KV Cache中,提到每一步都需要将K和V缓存下来。假设单个Attention Block块中的多头注意力,有n个头,每个k和v的维度为d,则每一步需要缓存的参数量为
,l为block的块数。
因此,MLA立足于在推理中,降低
。对Key和Value进行了一个低秩联合压缩。
简单理解就是,假设有个矩阵的维度是
,那么可以将其分解为两个的矩阵相乘,而
。这样就降低了存储量。
具体来看看DeepSeek中的具体实现公式:
是对Key和Value压缩后的隐向量,通过一个降维映射矩阵和模型输入得到。的维度,远小于多头key和value的原始维度
。
得到这个
后,具体的key和value,由两个对应的升维矩阵和
还原。
在推理的过程中,只需要缓存每一步的
,然后再计算还原回原始的K和V即可。由于的维度远小于K、V。因此每一步token的推理产生的缓存由之前的,变成
。
另外,之前提到KV Cache中,Q的作用只发生在当下,但是在模型训练的过程中,每个输入的token会通过多头注意力机制生成对应的query、key和value。这些中间数据的维度往往非常高,因此占用的内存量也相应很大。所以论文中也提到,为了降低训练过程中的激活内存activation memory,DeepSeek-V2还对queries进行低秩压缩,即便这并不能降低KV Cache。
对Q的压缩方式和K、V一致。
至此,架构图中红圈部分已解释完毕。
位置编码解耦
从架构图中发现,DeepSeek-V2的q和k各自都有2个部分。1个部分是刚刚解释过的压缩部分,而另外的1个部分,加上了RoPE位置编码
。做了一个位置编码的解耦。
在RoPE的实现中,如果我们要让Q、K带上位置信息,会分别乘以相应的位置编码矩阵。
如果计算
时,就变成了
DeepSeek-V2对Q和K都进行了压缩,则整个过程变成:
这里,
和 分别是用于从低秩表示恢复到原始维度的解压缩矩阵。问题在于,由于低秩表示已经是压缩了的状态,直接在 和 上应用 和
不再等价于在完整的Q和K上应用位置编码。这是因为压缩操作可能已经丢失了某些信息,使得位置编码不能直接和有效地反映原始Q和K的位置关系。
为了解决这个问题,Deepseek-V2设计了两个pe结尾的变量用于储存旋转位置编码的信息,将信息存储和旋转编码解耦开。
最后将这四个变量分别拼接起来,形成带信息压缩的Q、K,以及带位置信息的Q、K,进行最后的计算。
最终,单个Token产生的缓存包含了两个部分,即
。
同时,与GQA和MQA相比,不同于MQA和GQA可能因合并或分组而丢失细节信息,MLA的压缩是基于保持尽可能多的原始信息的前提下进行的。这使得模型在执行注意力操作时,能够利用到更精确的信息,从而提高整体的性能。
DeepSeek MOE
DeepSeekMoE引入了两个主要策略:
细粒度专家分割(Fine-Grained Expert Segmentation):通过将每个FFN专家进一步细分,这允许模型在保持参数总数不变的情况下,激活更多的、更细粒度的专家。这种策略使得各个专家能够专注于更细致的知识领域,提高了专家的专业化程度。
共享专家隔离(Shared Expert Isolation):设置一部分专家作为“共享专家”,这些专家总是被激活,用于捕捉和整合常见的跨上下文知识。这样可以减少路由专家之间的知识冗余,每个路由专家可以更专注于独特的知识领域。
上图摘取自DeepSeek MOE的技术报告,从左到右分别是传统的MOE,细粒度专家分割,细粒度专家分割+共享专家隔离。
这两个策略是对缓解传统MoE的缺陷进行的改进,
知识杂糅(Knowledge Hybridity):传统的MoE模型中,每个专家往往需要处理多种类型的知识,这使得专家难以形成专门化的知识结构。
知识冗余(Knowledge Redundancy):不同的专家在处理不同的输入时可能需要相同的知识,导致多个专家中存在重复的知识,浪费了模型参数。
针对上面的缺陷,业界其实有挺多人做过实验,例如这篇文章,
作者对Mixtral-8x7B进行了实验,想知道模型中不同的专家是否贡献相同。于是作者逐一去掉了网络中的专家,再对模型进行测试。最后发现expert 3的贡献远大于其它专家。
呈现出了一人干活,旁人看戏的特点。
显然,Mixtral-8x7B可能负载均衡没做好,导致了这个问题。
那么Deepseek MoE是否也有类似的问题呢?
从技术报告的说明来看,似乎是没有,因为报告里专门写了一下,当只有4个路由专家被激活时,DeepSeekMoE 的表现(Pile 损失)也与基于GShard架构的同等参数量模型相当。
相关文章:
KV Cache大模型推理加速功能
KV Cache KV Cache是大模型标配的推理加速功能,也是推理过程中,显存资源巨大开销的元凶之一。在模型推理时,KV Cache在显存占用量可达30%以上。 目前大部分针对KV Cache的优化工作,主要集中在工程上。比如著名的VLLM,…...
速盾:高防CDN节点对收录有影响吗?
引言 搜索引擎收录是网站运营中至关重要的环节,它直接影响着网站的曝光度和流量。近年来,随着网络安全威胁的增加,许多企业开始采用高防CDN(内容分发网络)来保护其网站免受DDoS攻击和其他形式的网络攻击。然而&#x…...
脑科学与人工智能的交叉:未来智能科技的前沿与机遇
引言 随着科技的迅猛发展,脑科学与人工智能(AI)这两个看似独立的领域正在发生深刻的交汇。脑机接口、神经网络模型、智能机器人等前沿技术,正带来一场跨学科的革命。这种结合不仅推动了科技进步,也在医疗、教育、娱乐等…...
Linux 系统中从源码编译安装软件
以下是 Linux 系统中 从源码编译安装软件 的详细步骤和注意事项,帮助你掌握这一高级操作技能: 一、编译安装的核心流程 1. 下载源码包(通常为 .tar.gz/.tar.bz2/.tar.xz) 2. 解压源码包 3. 进入源码目录 4. 配置编译参数…...
docker 运行自定义化的服务-后端
docker 运行自定义化的服务-前端-CSDN博客 运行自定义化的后端服务 具体如下: ①打包后端项目,形成jar包 ②编写dockerfile文件,文件内容如下: # 使用官方 OpenJDK 镜像 FROM jdk8:1.8LABEL maintainer"ATB" version&…...
基于关键字定位的自动化PDF合同拆分
需求背景: 问题描述: 我有一份包含多份合同的PDF文件,需要将这些合同分开并进行解析。 传统方法(如以固定页数作为分割点)不够灵活,无法满足需求。 现有方法的不足: 网上找到的工具大多依赖手动…...
spring security 使用auth2.0
在 Spring Security 中集成 OAuth 2.0 可以实现安全的第三方认证和资源保护。以下是完整的配置指南和代码示例: 一、OAuth 2.0 核心概念 角色作用资源所有者用户(授权访问资源的人)客户端应用(如Web、移动端)授权服务…...
NO.82十六届蓝桥杯备战|动态规划-从记忆化搜索到动态规划|下楼梯|数字三角形(C++)
记忆化搜索 在搜索的过程中,如果搜索树中有很多重复的结点,此时可以通过⼀个"备忘录",记录第⼀次搜索到的结果。当下⼀次搜索到这个结点时,直接在"备忘录"⾥⾯找结果。其中,搜索树中的⼀个⼀个结点…...
ubuntu 服务器版本常见问题
一、系统安装与初始化 1. 安装过程中断或失败 原因:镜像损坏、硬件兼容性、磁盘分区错误。 解决: 验证 ISO 文件的完整性(计算 SHA256 校验和)。 检查 BIOS/UEFI 设置(禁用 Secure Boot)。 使用手动分区模式,确保根分区(/)和 EFI 分区(如有)正确配置。 2. 系…...
【时时三省】(C语言基础)用switch语句实现多分支选择结构 例题
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 例题: 用switch语句处理菜单命令。在许多应用程序中,用菜单对流程进行控制,例如从键盘输入一个 A 或 a 字符,就会执行A操作,输入一…...
全域数字化:从“智慧城市”到“数字生命体”的进化之路
一、国家战略下的城市数字化浪潮 2024年5月,国家四部委联合发布《关于深化智慧城市发展 推进城市全域数字化转型的指导意见》,明确提出以数据为引擎,系统性重塑城市技术架构与管理流程,推动城市治理迈向“全域协同、数实融合”的…...
Java网络编程干货
1.网络编程是什么 了解 在Java语言中,我们可以使用java.net包下的技术轻松开发出常见的网络应用程序,从而把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统&#x…...
如何在 Spring Boot 项目中使用 MyBatis 进行批量操作以提升性能?
MyBatis 提供了 ExecutorType.BATCH 类型,允许将多个 SQL 语句进行组合,最后统一执行,从而减少数据库的访问频率,提升性能。 以下是如何在 Spring Boot 项目中使用 MyBatis 进行批量操作的关键点: 1. 配置 MyBatis 使…...
基于SSM的线上花店鲜花销售商城网站系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
Python Lambda表达式详解
Python Lambda表达式详解 1. Lambda是什么? Lambda是Python中用于创建匿名函数(没有名字的函数)的关键字,核心特点是简洁。它适用于需要临时定义简单函数的场景,或直接作为参数传递给高阶函数(如map()、f…...
DAPP实战篇:使用web3.js连接合约
说明 本系列内容目录:专栏:区块链入门到放弃查看目录 如果你还没有创建好项目请先查看:《DApp实战篇:先用前端起个项目》,如果你还不知道web3.js是什么请先查看:《DApp实战篇:前端技术栈一览》。 安装 点此查看web3.js官方文档 打开项目根目录,并唤起终端: 键入w…...
linux sar 系统运行状态统计
概述 sar 命令来自英文词组**“System activity reporter”**的缩写,其功能是用于统计系统运行状态。是一个系统活动报告工具,用于收集、报告和保存系统活动信息。它可以帮助系统管理员监控和分析系统性能,识别潜在的性能瓶颈或问题。 实时…...
【C#】一种优雅的基于winform的串口通信管理
serialPort.DataReceived、串口优雅管理 完整《C#串口通信系统》功能清单 Part 1 — SerialPortManager.cs —— 串口核心管理类 using System; using System.IO.Ports; using System.Text; using System.Threading; using System.Windows.Forms;/// <summary> /// 专业…...
ChatGPT之智能驾驶问题讨论
ChatGPT之智能驾驶问题讨论 1. 源由2. 问题:2.1 智能驾驶级别定义🚗 L2(部分自动化,Partial Automation)🤖 L3(有条件自动化,Conditional Automation)🛸 L4&a…...
K8S-证书过期更新
K8S证书过期问题 K8S证书过期处理方法 Unable to connect to the server: x509: certificate has expired or is not yet valid 1、查看证书有效期: # kubeadm certs check-expiration2、备份证书 # cp -rp /etc/kubernetes /etc/kubernetes.bak3、直接重建证书 …...
蓝桥杯第十五届真题——握手问题
#include<bits/stdc.h> using namespace std; int main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int sum0;for(int i7;i<49;i){sumi;}cout<<sum;return 0; }...
5G_WiFi_CE_DFS
目录 一、规范要求 1、法规目录 2、定义 3、运行模式 4、主/从设备相关的运行行为及具体的动态频率选择(DFS)要求 5、产品角色确定测试项目 6、测试项目 测试项1:信道可用性检查(Channel Availability Check) …...
第二节:React 基础篇-受控组件 vs 非受控组件
一、场景题:设计一个实时搜索输入框,说明选择依据 受控组件 vs 非受控组件 核心区别 特征受控组件非受控组件数据管理由React状态(state)控制通过DOM元素(ref)直接访问更新时机每次输入触发onChange提交…...
springboot 处理编码的格式为opus的音频数据解决方案【java8】
opus编码的格式概念: Opus是一个有损声音编码的格式,由Xiph.Org基金会开发,之后由IETF(互联网工程任务组)进行标准化,目标是希望用单一格式包含声音和语音,取代Speex和Vorbis,且适用…...
RK3568 基于Gstreamer的多媒体调试记录
文章目录 1、环境介绍2、概念理清3、提前准备4、GStreamer编译5、GStreamer基础介绍6、视频播放初体验7、视频硬编码7.1、h2647.2、h265 8、视频硬解码8.1、解码视频并播放8.2、解码视频并播放带音频 1、环境介绍 硬件:飞凌ok3568-c开发板 软件:原厂rk…...
VS Code 的 .S 汇编文件里面的注释不显示绿色
1. 确认文件语言模式 打开 .S 文件后,查看 VS Code 右下角的状态栏,确认当前文件的识别模式(如 Assembly、Plain Text 等)。如果显示为 Plain Text 或其他非汇编模式: 点击状态栏中的语言模式(如 Plain Te…...
在 Wireshark 中如何筛选数据包
1. 显示过滤器(Display Filters) 显示过滤器用于 在已捕获的数据包中筛选,语法类似于编程语言中的条件表达式。 (1)基本过滤 表达式说明ip.addr 192.168.1.1显示所有涉及 192.168.1.1 的 IP 包ip.src 192.168.1.1…...
[MySQL]数据库与表创建
欢迎来到啾啾的博客🐱。 这是一个致力于构建完善 Java 程序员知识体系的博客📚。 它记录学习点滴,分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 欢迎评论交流,感谢您的阅读😄。 本篇简单记录…...
5分钟读懂ArgoCD:在Kubernetes中实现持续部署
Kubernetes中的Argo CD介绍 Argo CD是用于Kubernetes的声明式GitOps持续交付工具。它遵循GitOps模式,以Git仓库作为定义所需应用程序状态的唯一真实来源,能在指定的目标环境中自动部署应用程序,并持续监控应用程序的运行状态,确保…...
cs224w课程学习笔记-第10课
cs224w课程学习笔记-第10课 异构图 前言一、异构图1、异构图定义2、异构图与同构图 二、异构图下的GNN1、GCN扩展至RGCN1.1 RGCN原理1.2 异构图的任务预测特点1.3 异构图任务预测基础案例 2、完整的异构图GCN三、异构图下的Transformer 前言 异构图的定义是节点内部存在类型不…...
