DeepSeek-MLA

news2025/4/8 7:13:27

MLA 结构

在这里插入图片描述

  • 需要缓存
    • KV 向量共用的压缩隐特征
    • K 向量多头共享的带位置编码的向量
  • 为什么带有位置信息的 Q 向量来自于隐特征向量,而带有位置的 K 向量来自于 H 向量且共享呢?

最好的方法肯定是从H向量直接计算并且不共享,但是会大大增加显存使用和降低计算效率。原理上,基于隐向量计算ROPE肯定是有损的,共享也肯定牺牲了表达能力,所以做了一些权衡:

1、Q向量都基于潜向量生成RoPE向量而不共享,主要是为了增加计算效率。因为隐向量小所以计算更快,而且每次都要计算。不共享是为了保证表达能力。

2、K向量是从缓存中取的,不用每次计算,所以直接在H中计算就好。但是如果不共享将会让每个头都有一个RoPE向量,大大增加显存占用,所以共享。


多头注意力机制 MHA + KV cache

在这里插入图片描述

在生成第三个 token 的时候,第一个 token 进行的计算已经在生成第二个 token 的时候计算过了,重复计算。–》缓存第一个 token 计算的中间变量,并且只保留生成新 token 所需要的中间变量(KV cache)

有了 KV cache 后生成第三个 token 的过程

生成第四个 token


GQA/MQA

这里展示的是 MQA,生成 3 个 head 的 Q 向量,只生成 1 个 head 维度的 K 和 V 向量

多头间通过复制共享 query 向量一起来计算注意力,从而减少 kv cache,但会大大影响性能


为了折中,提出了 GQA,每组 query 共享一个 k 和 v 向量


MLA-Multi-Head Latent Attention

多头潜在注意力机制
  • 目的:减少 kv cache + 尽量不影响性能或者提高性能
  • 原理:对 token 的特征向量进行压缩转换,缓存压缩后的向量,在计算 attention 之后再解压回原来的尺寸

  • 可以提效果,很不错

压缩 KV 向量

kv cache 本意是为了减少推理时对之前 token 的 k 和 v 向量的计算

MLA 因为缓存了压缩的 kv cache,而减小了 kv cache 的显存占用,但是在取出缓存后,k 和 v 不能直接使用,需要经过解压计算才可以,引入了额外的计算,与 kv cache 初衷相悖

  • 对 k 进行解压操作的矩阵可以和 Wuq 矩阵进行融合,这个融合可以在推理之前算好,这样在推理时就不用进行对 k 的额外解压计算了【利用矩阵相乘的结合律,对矩阵提前进行融合,从而规避 MLA 引入的因解压隐特征带来的额外计算】

Wuv 同理,可以和 Wo 融合


压缩 Q 向量

除了对 KV 向量进行压缩外,对 Q 向量也进行了压缩,好处是降低了参数量,而且可以提高模型性能


考虑 RoPE

RoPE 需要对每一层的 Q 向量和 K 向量进行旋转,而且根据 token 位置的不同,旋转矩阵的参数也是不同的。加入了 RoPE 的矩阵无法融合,因为中间两个矩阵与 token 位置相关。

  • 解决方案:为 Q 和 K 向量额外增加一些维度来表示位置信息

对于 Q 向量,通过 WQR 为每一个头生成一些原始特征,然后通过 RoPE 增加位置信息,再把生成带有位置信息的特征拼接到每个注意力头的 Q 向量

↓拼接

对于 K 向量,通过 WKR 矩阵生成一个头共享的特征,然后通过 RoPE 增加位置信息,然后复制到多个头共享位置信息。**这里多头共享带位置编码的 K 向量,也需要被缓存,**以便在生成带有位置信息的 K 向量时用到


在推理时

  • 不带 RoPE 的 Q 向量和 K 向量进行点积运算(结果为数值),可以用融合的矩阵来消除解压操作
  • 带 RoPE 的部分进行点积运算

将两部分得到的两个值进行逐元素相加:⊕ ,就相当于对拼接了位置信息的完整的 Q 和 K 向量进行点积操作的值。


参考

  1. https://www.bilibili.com/video/BV1BYXRYWEMj
  2. https://arxiv.org/pdf/2412.19437

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

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

相关文章

pyTorch-迁移学习-学习率衰减-四种天气图片多分类问题

目录 1.导包 2.加载数据、拼接训练、测试数据的文件夹路径 3.数据预处理 3.1 transforms.Compose数据转化 3.2分类存储的图片数据创建dataloader torchvision.datasets.ImageFolder torch.utils.data.DataLoader 4.加载预训练好的模型(迁移学习) 4.1固定、修改预训练…

vscode Colipot 编程助手

1、登录到colipot,以github账号,关联登录 点击【continue】按钮,继续。 点击【打开Visual Studio Code】,回到vscode中。 2、问一下11? 可以看出,很聪明,一下子就算出来了。 3、帮我们写一个文件&#xf…

1、window 下SDL 下载使用, 测试环境搭建

1. SDL3下载 官网: https://www.libsdl.org/ 点击SDL Releases 或者 SDL GItHub 进入github下载: 因为自己在windows下使用的mingw,所以下载mingw版的,也可以 下载源码自己编译。 2. 项目搭建 这里使用的时mingw vsocde cmake, 可以使…

OpenGL学习笔记(模型材质、光照贴图)

目录 光照与材质光照贴图漫反射贴图采样镜面光贴图 GitHub主页:https://github.com/sdpyy OpenGL学习仓库:https://github.com/sdpyy1/CppLearn/tree/main/OpenGLtree/main/OpenGL):https://github.com/sdpyy1/CppLearn/tree/main/OpenGL 光照与材质 在现实世界里&…

视频分析设备平台EasyCVR打造汽车门店经营场景安全:AI智慧安防技术全解析

一、方案背景 某电动车企业不停爆出维权新闻,支持和反对的声音此起彼伏,事情不断发酵、反转,每天都有新消息,令人目不暇接。车展、车店作为维权事件的高发场所,事后复盘和责任认定时,安防监控和视频监控平…

Hibernate里的对象不同状态和Session的核心方法

临时状态的测试 Student student new Student("张三", "男", 22, new Date()); 以上student就是一个Transient(临时状态),此时student并没有被session进行托管,即在session的缓存中还不存在student这个对象,当执行完save方法后&a…

模型嵌入式部署

背景 自从深度学习大规模应用以来,其中一个应用方向就是将深度学习视觉算法部署到嵌入式平台上,使用NPU推理。虽然已经做了很久的模型部署,但一直都是在公司默默耕耘,为了发展一下自己“边缘部署专家”这个个人品牌,打…

Redlinux(2025.3.29)

1、将你的虚拟机的网卡模式设置为nat模式,给虚拟机网卡配置三个主机位分别为100、200、168的ip地址。(以nmtui命令为例) 2、测试你的虚拟机是否能够ping通网关和dns,如果不能请修改网关和dns的地址。 首先打开虚拟网络编辑器查看NAT设置里的网关IP&…

uni-app项目运行在浏览器、微信开发者工具、mumu模拟器

一、安装HBuilder X 1、下载HBuilder X 官网网址:https://dcloud.io/hbuilderx.html 根据电脑系统下载对应的版本(我的电脑是Windows 10) 2.安装HBuilder X 直接将HBuilderX.4.61.2025040322-alpha.zip解压到自己想要存放的文件夹中 双击…

2025-04-07 NO.3 Quest3 MR 配置

文章目录 1 MR 介绍1.1 透视1.2 场景理解1.3 空间设置 2 配置 MR 环境2.1 场景配置2.2 MR 配置 3 运行测试 配置环境: Windows 11Unity 6000.0.42f1Meta SDK v74.0.2Quest3 1 MR 介绍 1.1 透视 ​ 透视(Passthrough)是将应用的背景从虚拟的…

抓wifi无线空口包之Macbook Pro抓包(一)

参考: 在MAC OS上进行Wi-Fi抓包和空中包分析_空口抓包和无线网卡抓包的区别-CSDN博客 WireShark中802.11帧的类型、子类型对照表_wireshark 怎么看disassociate帧和deauthenticate-CSDN博客 一、在macbook pro上,点击option 同时点击右上角wifi 功能&a…

单元测试原则之——不要模拟值对象 (1)

1. 什么是值对象(Value Objects)? 值对象是指那些不可变且仅通过其属性(数据)来定义的对象。它们通常没有复杂的逻辑或行为,主要用于存储和传递数据。例如: ● 字符串(String) ● 数字(Integer, Double) ● 日期(LocalDate, Instant) ● 自定义的简单数据类(如…

版本控制工具——SVN

目录 【版本控制系统】 【SVN概述】 【SVN基本使用】 【解决SVN拉取文件到本地后不显示绿色图标问题】 【版本控制系统】 版本控制系统(version control system)是一种用于管理文件变更的软件工具,主要用于记录文件的修改历史&#xff0c…

2022第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(题解解析)

记录刷题的过程、感悟、题解。 希望能帮到,那些与我一同前行的,来自远方的朋友😉 大纲: 1、九进制转十进制-(解析)-简单的进制转化问题😄 2、顺子日期-(解析)-考察日期 3…

【EC200N-CN——Linux驱动移植】问题回顾

【EC200N-CN——Linux驱动移植】问题回顾 1)、开发回顾一、问题回顾与解决过程二、核心原理分析1. **USB设备识别的关键:VID/PID**2. **为什么之前不生成ttyUSB节点?**3. **为什么添加PID后就能生成节点?** 三、日志关键信息解读1…

构建k8s下Helm私有仓库与自定义Chart开发指南

#作者:程宏斌 文章目录 自定义helm模板1、开发自己的chare包2、调试chart3、安装chart 自定义helm模板 https://hub.helm.sh/ 1、开发自己的chare包 [rootmaster ~]# helm create mychare //创建一个名为mychare的chare包 [rootmaster ~]# tree -C mychare/ //以…

【7】C#上位机---Modbus RTU 界面设计与封装

C#上位机---Modbus通讯 1 Modbus RTU 通讯1.1 RS485串口与串行通信(Serial Communications)1.2 Modbus RTU协议1.3 Modbus RTU主从模式1.4 Modbus 主从站模拟调试2 Modbus RTU 界面设计与封装2.1 温度控件的类属性2.2 C#封装Modbus实现通讯2.3 C#封装Modbus TRU通用类2.4 上位…

【嵌入式学习6】多任务版TCP服务器

目录 如何实现: 客户端1.0版本: 服务端: 客户端2.0版本: thread.join() 是一个线程同步方法,用于主线程等待子线程完成。当你调用 thread.join() 时,主线程会阻塞,直到调用 join() 的子线程…

每天认识一个设计模式-外观模式:化繁为简的接口魔法

一、前言 在设计模式中,结构型设计模式处理类或对象组合,可助力构建灵活、可维护软件结构。此前探讨过组合模式(将对象组合成树形结构,统一处理单个与组合对象,如文件系统管理)和装饰器模式(动…

VLAN(虚拟局域网)

一、vlan概述 VLAN(virtual local area network)是一种通过逻辑方式划分网络的技术,允许将一个物理网络划分为多个独立的虚拟网络。每一个vlan是一个广播域,不同vlan之间的通信需要通过路由器或三层交换机 [!注意] vlan是交换机独有的技术,P…