DeepSeek V2报告阅读
概况
MoE架构,236B参数,每个token激活参数21B,支持128K上下文。采用了包括多头潜在注意力(MLA)和DeepSeekMoE在内的创新架构。MLA通过将KV缓存显著压缩成潜在向量来保证高效的推理,而DeepSeekMoE通过稀疏计算使得以经济成本训练强大的模型成为可能。
与DeepSeek 67B相比,DeepSeek-V2实现了显著更强的性能,同时节省了42.5%的训练成本,减少了93.3%的KV缓存,并将最大生成吞吐量提高到5.76倍。我们在由8.1T token组成的语料库上预训练DeepSeek-V2,并进一步进行SFT和RL以充分释放其潜力。
这个版本最大的贡献,就是MLA和DeepSeekMoE。MLA是一种低秩的、将K和V联合压缩的注意力机制,减少KV缓存的同时降低GQA/MQA带来的性能损耗;DeepSeekMoE和普通MoE相比,专家的划分粒度更细、并将一部分专家隔离为共享专家,这些专家始终被激活。
还有一个小参数量版本的DeepSeek-V2-Lite,参数量15.7B,每个token激活参数2.4B
架构
MLA
在标准MHA中,隐向量分别的三个权重矩阵相乘,得到qkv,然后把每次推理的kv存储到显存中。
MLA的核心是键和值的低秩联合压缩,以减少KV缓存。
此外,为了在训练过程中减少激活内存,我们还对查询进行了低秩压缩,即使它不能减少KV缓存:
旋转位置编码RoPE与低秩KV压缩不兼容,RoPE是一种相对位置编码方式,当前q与之前的k/v相乘时乘上一个旋转矩阵,来标记两个token的相对位置。
关于rope不兼容没法做吸收计算的解释,这篇文章4.2节讲的非常详细:http://zhuanlan.zhihu.com/p/16730036197。大致就是在使用rope之前,由于满足矩阵乘法结合律可以提前把它俩乘积算出来,也就是权重矩阵吸收,而使用rope之后会导致这两个矩阵中间多了个表示相对位置的旋转矩阵,没法提前计算了。
为了解决这种不兼容,就通过concat的方式,在向量的尾部加一个小的位置编码向量。这样相乘的时候,前面的维度通过矩阵吸收处理,所有head缓存一个,后面一段通过正常MQA方式计算。
文中说MLA缓存的Latent KV比较短(相当于2.25个MQA的缓存量),但MLA恢复了kv的能力,使得表征能力强于GQA和MQA,甚至强于MHA(这一点存疑,不好解释为什么比MHA还强)

DeepSeekMoE
DeepSeekMoE有两个关键思想:将专家细分为更细的粒度以实现更高的专家专业化和更准确的知识获取,以及隔离一些共享专家以减轻路由专家之间的知识冗余。
表达公式为:
表示共享专家的数量,表示路由专家的数量,表示第i个专家的门控值,表示token与第i个专家的亲合度,表示第i个专家的质心。
上面这三个公式从上往下看:
- 专家的质心也就是说专家更擅长哪些知识,那么最下面公式计算得到的结果就是当前token与这个专家擅长内容的近似程度。
- 计算当前token和所有专家的近似程度,就可以排序得到当前token最适合哪些专家来处理,利用第二个公式,选出其中近似度最高的个专家。
- 最后用最上面的公式,用选定的专家+共享专家来对输入进行处理,得到之后再和原始输入相加,相当于残差连接,就得到了MLP的输出。
限制设备的路由:
研究人员还设计了一种设备限制的路由机制,以限制与MoE(Mixture of Experts)相关的通信成本:由于专家的细粒度分割,激活的专家数量可能很大,因此应用专家并行,MoE相关的通信将更加昂贵。
对于DeepSeek-V2,除了对路由专家进行简单的top-K选择之外,还确保每个token的目标专家将分布在最多M个设备上。也就是首先选择M个设备,然后在这些M个设备上的专家中进行top-K选择。在实践中,我们发现当M>=3时可以实现和无限制接近的效果
负载平衡:
不平衡的负载会增加路由崩溃的风险,并且会降低计算效率。在DeepSeek-V2的训练过程中,设计了三种辅助损失函数,分别用于控制专家级别的负载均衡(LExpBal)、设备级别的负载均衡(LDevBal)和通信平衡(LCommBal)。
专家级别的负载均衡,通过统计当前专家被选择的频率、整个序列上被分配的权重,来计算损失,被选择的频率越低、权重越小,损失就越小。设备级别的负载均衡损失也是类似。
设备限制的路由机制基于确保每个设备最多向其他设备传输 𝑀𝑇 个隐藏状态的原则运作。同时,使用通信平衡损失来鼓励每个设备从其他设备接收大约 𝑀𝑇 个隐藏状态。通信平衡损失保证了设备间信息的平衡交换,促进了高效的通信。
token丢弃策略:
虽然平衡损失旨在鼓励平衡负载,但它们不能保证严格的负载平衡。为了进一步减轻不平衡负载,在训练期间引入了设备级别的token丢弃策略。
这种方法首先计算每个设备的平均计算预算,这意味着每个设备的容量因子相当于1.0。然后,在每个设备上丢弃最低亲和力分数的token,直到达到计算预算。
此外,确保大约10%训练序列的token永远不会被丢弃。通过这种方式,我们可以根据效率要求灵活决定在推理时是否丢弃令牌,并始终确保训练和推理之间的一致性。
pre-train
Infra:
DeepSeek-V2是基于HAI-LLM框架进行训练的,这是他们自研的训练框架。
它采用了16路无气泡流水线并行、8路专家并行以及ZeRO-1数据并行。鉴于DeepSeek-V2激活的参数相对较少,且部分操作符被重新计算以节省激活内存,因此无需张量并行即可进行训练,从而减少了通信开销。此外,为了进一步提高训练效率,将共享专家的计算与专家并行的全对全通信进行了重叠处理。
16路PP意思就是整个模型的forward/backward被划分成16个stage,分布在16组机器上;8路专家并行是指每组机器整套专家分布在8张卡上。
**上下文长度扩展:**使用YaRN,将上下文窗口从4K扩展到128K
训练成本:
由于DeepSeek-V2对每个标记激活的参数较少,并且所需的浮点运算次数(FLOPs)比DeepSeek 67B少,因此理论上训练DeepSeek-V2将比训练DeepSeek 67B更经济。
尽管训练MoE模型将引入额外的通信开销,但通过算子和通信优化,DeepSeek-V2的训练可以达到相对较高的模型浮点运算利用率(MFU)。在方佳瑞的知乎文章中介绍了他对V3的MFU估算:https://zhuanlan.zhihu.com/p/16445683081
在H800集群上进行的实际训练中,对于每万亿标记的训练,DeepSeek 67B需要300.6K GPU小时,而DeepSeek-V2仅需要172.8K GPU小时,即稀疏的DeepSeek-V2与密集的DeepSeek 67B相比,可以节省42.5%的训练成本。
推理效率:
为了高效部署DeepSeek-V2服务,首先将它的参数转换为FP8的精度。
此外,对DeepSeek-V2的KV缓存进行了量化,将KV缓存中的每个元素平均压缩到6位。得益于MLA和这些优化,实际部署的DeepSeek-V2比DeepSeek 67B需要的KV缓存显著减少,因此可以服务更大的批次大小。
在配备8个H800 GPU的单个节点上,DeepSeek-V2实现了超过每秒50K个令牌的生成吞吐量,这是DeepSeek 67B的最大生成吞吐量的5.76倍。此外,DeepSeek-V2的提示输入吞吐量超过每秒100K个令牌。
Alignment
在SFT方面,数据量和DeepSeek 67B一样,质量更高。
在RL方面,使用了在DeepSeek Math技术报告中的组相对策略优化GRPO。
强化学习的训练策略:
初步实验发现,在推理数据(如代码和数学提示)上的RL训练表现出与在一般数据上训练时不同的独特特征。例如,在代码和数学推理任务上的能力可以在更长的训练步骤期间持续提高。
因此采用了一个两阶段的RL训练策略,首先进行推理对齐,然后进行人类偏好对齐。
在第一个推理对齐阶段,训练了一个奖励模型𝑅𝑀𝑟𝑒𝑎𝑠𝑜𝑛𝑖𝑛𝑔,用于代码和数学推理任务,并使用𝑅𝑀𝑟𝑒𝑎𝑠𝑜𝑛𝑖𝑛𝑔的反馈来优化策略模型。在第二个人类偏好对齐阶段,采用了一个多奖励框架,该框架从一个有帮助的奖励模型、一个安全奖励模型、以及一个基于规则的奖励模型RMrule中获取奖励。
Discussion
SFT数据的数量:
- 先前研究认为,少于10K的SFT数据实例足以产生令人满意的结果。然而,在实验中如果使用少于10K的实例,在IFEval基准测试上的性能显著下降。
- 一个可能的解释是,语言模型需要一定量的数据来发展特定技能。尽管随着模型大小的增加所需的数据量可能会减少,但它不能完全消除。我们的观察强调了为LLM配备所需充足数据的关键性。
- 此外,SFT数据的质量也至关重要,特别是对于涉及写作或开放式问题的任务。
RL的对齐税:
- 对齐税(Alignment Tax) 指的是在通过RLHF过程中,模型在对齐人类偏好以提高安全性和有用性的同时,可能导致其在其他任务上的性能下降。
- 报告中说在数据处理和改进训练策略方面做出来很多努力来减轻对齐税,但是没说怎么做的
- 在报告之外,减轻对齐税的方法比如: RLHF 过程混合一小部分原始预训练数据,继续进行对数似然最大化训练
在线强化学习:
- 在线 RL:通过与环境的实时交互收集数据。
- 离线 RL:使用预先收集的历史数据集进行训练。
- 在偏好对齐实验中,发现在线方法显著优于离线方法。因此在实现在线强化学习框架上投入了巨大的努力。关于在线或离线偏好对齐的结论可能因不同上下文而异,将对它们进行更全面的分析留待未来的工作。

这是V2-Lite的layer0的参数,重点通过红框内的参数信息来熟悉MLA:
- 由于V2-Lite并没有压缩q,因此q_proj矩阵维度是2048*3072,3072是由16个自注意力头组成,每个头的维度是128+64=192
- kv先是被压缩成了576大小的低秩向量,这个向量前512个维度是kv原始信息压缩后的表示,后64个维度表示位置信息;然后通过一个512*4096的矩阵把前512维度给升维成4096,即k和v各2048
- q和k相乘的时候,k的每个头拼接上576向量的后面那64个维度,于是大小也是128*192=3072,能够和q相乘
相关文章:
DeepSeek V2报告阅读
概况 MoE架构,236B参数,每个token激活参数21B,支持128K上下文。采用了包括多头潜在注意力(MLA)和DeepSeekMoE在内的创新架构。MLA通过将KV缓存显著压缩成潜在向量来保证高效的推理,而DeepSeekMoE通过稀疏计…...
超详细UE4(虚幻4)第一人称射击(FPS)游戏制作教程
超详细UE4(虚幻4)第一人称射击(FPS)游戏制作教程 引言 在游戏开发领域,第一人称射击(FPS)游戏一直是最受欢迎的类型之一。从经典的《反恐精英》(CS)到现代的《使命召唤》(Call of Duty),FPS游戏凭借其紧张刺激的游戏体验和高度沉浸感,吸引了无数玩家。如果你是一…...
【开发电商系统的技术选型】
开发电商系统的技术选型是一个复杂而细致的过程,涉及到多个方面和层面的考量。以下是一份详细的技术选型指南: 前端技术 基础技术 HTML5/CSS3/JavaScript:这是构建现代网页应用的基础。HTML5提供了丰富的语义元素,便于搜索引擎优…...
JAVA异步的TCP 通讯-服务端
一、服务端代码示例 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousServerSocketChannel; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.Completion…...
零基础Vue入门6——Vue router
本节重点: 路由定义路由跳转 前面几节学习的都是单页面的功能(都在专栏里面https://blog.csdn.net/zhanggongzichu/category_12883540.html),涉及到项目研发都是有很多页面的,这里就需要用到路由(vue route…...
关于JS继承的七种方式和理解
1.原型链继承 function Fun1() {this.name parentthis.play [1, 2, 3] } function Fun2() {this.type child }Fun2.prototype new Fun1()let s1 new Fun2() let s2 new Fun2() s1.play.push(4) console.log(s1.play, s2.play) // [1, 2, 3, 4] [1, 2, 3, 4]可以看到两个…...
Elasticsearch的使用场景、数据量级及选择原因?为什么没有用Hbase?
目录 Elasticsearch 的使用场景、数据量级及选择原因 1. Elasticsearch 的使用场景 2. 数据量级 3. 选择 Elasticsearch 的原因 4. 为什么选择 Elasticsearch 而不是 HBase 5. 数据量级对比 6. 总结 Elasticsearch 的使用场景、数据量级及选择原因 1. Elasticsearch 的…...
Oracle迁移到MySQL
Oracle迁移到MySQL业务需要全面改造适配,数据库对象和业务SQL语法需要一对一映射分析如何改写,根据业务使用实际情况评估改造适配成本较高。 目前,已有数据库产品能力缺少自动化迁移工具,需要依赖生态产品能力,比如云和…...
.Net Core笔记知识点(跨域、缓存)
设置前端跨域配置示例: builder.Services.AddCors(option > {option.AddDefaultPolicy(policy > {policy.WithOrigins(originUrls).AllowAnyMethod().AllowAnyHeader().AllowCredentials();});});var app builder.Build();app.UseCors(); 【客户端缓存】接…...
【Vue】在Vue3中使用Echarts的示例 两种方法
文章目录 方法一template渲染部分js部分方法一实现效果 方法二template部分js or ts部分方法二实现效果 贴个地址~ Apache ECharts官网地址 Apache ECharts示例地址 官网有的时候示例显示不出来,属于正常现象,多进几次就行 开始使用前,记得先…...
每日Attention学习18——Grouped Attention Gate
模块出处 [ICLR 25 Submission] [link] UltraLightUNet: Rethinking U-shaped Network with Multi-kernel Lightweight Convolutions for Medical Image Segmentation 模块名称 Grouped Attention Gate (GAG) 模块作用 轻量特征融合 模块结构 模块特点 特征融合前使用Group…...
Qt —— 加载百度离线地图、及简单绘图(附源码)
效果 说明 软件代码已下载了某区域的离线瓦片地图,通过百度离线api进行调用的地图效果。 源码 void PointMapTEST...
124,【8】buuctf web [极客大挑战 2019] Http
进入靶场 查看源码 点击 与url有关,抓包 over...
源路由 | 源路由网桥 / 生成树网桥
注:本文为 “源路由” 相关文章合辑。 未整理去重。 什么是源路由(source routing)? yzx99 于 2021-02-23 09:45:51 发布 考虑到一个网络节点 A 从路由器 R1 出发,可以经过两台路由器 R2、R3,到达相同的…...
c#中lock的经典示例
lock 是 C# 中的一种用于同步线程执行的机制,它帮助确保多个线程在访问共享资源时不会发生冲突或数据损坏。其作用是通过给临界区(即多线程访问共享资源的代码段)加锁,使得在同一时刻只能有一个线程进入执行该代码段。 1、lock 的…...
python编程-集合内置函数和filter(),集合常见操作
在Python中,列表、集合、字典是三种常用的数据结构,它们各自拥有一些内置函数,用于执行各种操作。 一、列表的常用内置函数 #1、append(obj): 在列表末尾添加新的对象。list_a [1, 2, 3] list_a.append(4) print(list_a) # 输出: [1,…...
蓝桥杯Java之输入输出练习题
题目 1:多组AB(基础版) 题目描述: 输入多组数据,每组数据包含两个整数 A 和 B,计算它们的和。输入以 文件结尾(EOF) 结束。 输入格式: 每行包含两个整数 A 和 B&#x…...
FPGA的IP核接口引脚含义-快解
疑问 手册繁琐,怎样快速了解IP核各输入输出接口引脚的含义。 答疑 不慌不慌,手册确实比较详细但繁琐,如何快速知晓该部分信息,涛tao道长给你们说,简单得很,一般新入门的道友有所不知,往往后面…...
Linux的循环,bash的循环
Linux的循环,bash的循环 在 Linux 系统中,Bash 循环是最常用的循环实现方式(Bash 是 Linux 默认的 Shell),但广义上“Linux 的循环”可能涉及其他 Shell 或编程语言的循环结构。以下是 Bash 循环的详细解析及其在 Linux 环境中的…...
Qwen2-VL-2B-Instruct 模型 RK3576 板端部署过程
需要先在电脑上运行 RKLLM-Toolkit 工具,将训练好的模型转换为 RKLLM 格式的模型,然后使用 RKLLM C API 在开发板上进行推理。 在安装前先查看板端的内存容量,和自己模型占用大小比较一下,别安装编译好了不能用。 这里我就是先尝试…...
如何设计光耦电路
光耦长这样,相信小伙伴们都见过,下图是最为常用的型号PC817 怎么用?我们先看图,如下图1: Vin为输入信号,一般接MCU的GPIO口,由于这里的VCC1为3.3V,故MCU这边的供电电源不能超过3.3V…...
ADC模数转换器概念函数及应用
ADC模数转换器概念函数及应用 文章目录 ADC模数转换器概念函数及应用1.ADC简介2.逐次逼近型ADC2.1逐次逼近型ADC2.2stm32逐次逼近型2.3ADC基本结构2.4十六个通道 3.规则组的4种转换模式3.1单次转换,非扫描模式3.2连续转换,非扫描模式3.3单次转换…...
DFX(Design for eXcellence)架构设计全解析:理论、实战、案例与面试指南*
一、什么是 DFX ?为什么重要? DFX(Design for eXcellence,卓越设计)是一种面向产品全生命周期的设计理念,旨在确保产品在设计阶段就具备**良好的制造性(DFM)、可测试性(…...
【LeetCode】152、乘积最大子数组
【LeetCode】152、乘积最大子数组 文章目录 一、dp1.1 dp1.2 简化代码 二、多语言解法 一、dp 1.1 dp 从前向后遍历, 当遍历到 nums[i] 时, 有如下三种情况 能得到最大值: 只使用 nums[i], 例如 [0.1, 0.3, 0.2, 100] 则 [100] 是最大值使用 max(nums[0…i-1]) * nums[i], 例…...
Doris更新某一列数据完整教程
在Doris,要更新数据,并不像mysql等关系型数据库那样方便,可以用update set来直接更新某个列。在Doris只能进行有限的更新,官方文档如下: UPDATE - Apache Doris 1、使用Doris自带的Update功能 描述 该语句是为进行对数据进行更新的操作,UPDATE 语句目前仅支持 UNIQUE…...
《云夹:让书签管理变得轻松又高效》
在当今数字化的生活与工作场景中,我们畅游于网络的浩瀚海洋,每天都会邂逅各式各样有价值的网页内容。而如何妥善管理这些如繁星般的书签,使其能在我们需要时迅速被找到,已然成为众多网络使用者关注的焦点。云夹,作为一…...
Microsoft Fabric - 尝试一下在pipeline中发送请求给web api(获取数据和更新数据)
1.简单介绍 Microsoft Fabric中的Pipeline支持很多种activity,分成数据转换和控制流两种类型的activitly。 这边将尝试一下发送web请求的activity,要做成的pipeline大概如下图所示, 上图中有4个Activity,作用如下 Web - 从一个…...
Ruby:从宝石到编程语言的奇妙联系(中英双语)
Ruby:从宝石到编程语言的奇妙联系 在珠宝世界中,红宝石(Ruby)是一种象征热情、力量和高贵的珍贵宝石;而在编程世界中,Ruby则是一门灵活、优雅且富有创造力的编程语言。那么,这两者究竟有何联系…...
如何对java 源码进行分析, 统计出每个方法被引用的次数
使用 JavaParser 统计源码中每个方法的引用次数是一个可行且有效的方法。JavaParser 是一个用于解析 Java 源代码并生成抽象语法树(AST)的库,它提供了丰富的 API 来遍历和操作 AST。下面是一个详细的指南,说明如何使用 JavaParser…...
数据完整性与约束的分类
一、引言 为什么需要约束?为了保证数据的完整性。 (1)数据完整性 数据完整性指的是数据的精确性和可靠性。 为了保证数据的完整性,SQL对表数据进行额外的条件限制,从以下四方面考虑: ①实体完整性&…...
