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相乘

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

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

相关文章

TCP服务器与客户端搭建

一、思维导图 二、给代码添加链表 【server.c】 #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <fcntl.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.…

【自动化测试】使用Python selenium类库模拟手人工操作网页

使用Python selenium类库模拟手人工操作网页 背景准备工作安装Python版本安装selenium类库下载selenium驱动配置本地环境变量 自动化脚本输出页面表单自动化填充相关代码 背景 待操作网页必须使用IE浏览器登录访问用户本地只有edge浏览器&#xff0c;通过edge浏览器IE模式访问…

如何通过Davinci Configurator来新增一个BswM仲裁规则

本文框架 前言1.增加一个Mode Declaration Group2.增加一个Mode Request RPorts3.与操作Port的SWC连线4.新建一个Expression5.新建ActionList6.将表达式新建或加进现有Rule内7.生成BswM及Rte模块代码8.在代码中调用RTE接口前言 在Autosar模式管理系列介绍01-BswM文章中,我们对…

智慧交通:如何通过数据可视化提升城市交通效率

随着城市化进程的加速&#xff0c;交通管理面临着前所未有的挑战。为了应对日益复杂的交通状况&#xff0c;智慧交通系统应运而生&#xff0c;其中数据可视化技术成为了提升交通管理效率的关键一环。本文将探讨如何利用山海鲸可视化软件来优化交通管理&#xff0c;并展示其在智…

Android Studio:如何利用Application操作全局变量

目录 一、全局变量是什么 二、如何把输入的信息存储到全局变量 2.1 MainApplication类 2.2 XML文件 三、全局变量读取 四、修改manifest ​编辑 五、效果展示 一、全局变量是什么 全局变量是指在程序的整个生命周期内都可访问的变量&#xff0c;它的作用范围不限于某个…

Kafka 可靠性探究—副本刨析

Kafka 的多副本机制提升了数据容灾能力。 副本通常分为数据副本与服务副本。数据副本是指在不同的节点上持久化同一份数据&#xff1b;服务副本指多个节点提供同样的服务&#xff0c;每个节点都有能力接收来自外部的请求并进行相应的处理。 1 副本刨析 1.1 相关概念 AR&…

Unity Dots学习

ISystem和SystemBase的区别 Archetype和Chunk 相同组件的实体放在一起&#xff0c;也就是我们所说的内存块&#xff08;Chunk&#xff09; Chunk有一个大小 https://blog.csdn.net/weixin_40124181/article/details/103716338 如果批量操作的entity都是同一个chunk下的效率会更…

Oracle(windows安装遇到的ORA-12545、ORA-12154、ORA-12541、ORA-12514等问题)

其实出现该问题就是监听或者服务没有配好。 G:\xiaowangzhenshuai\software\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMINlistener.ora SID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME CLRExtProc)(ORACLE_HOME G:\xiaowangzhenshuai\software\Oracle\product\11.2.0\d…

Mac上搭建k8s环境——Minikube

1、在mac上安装Minikube可执行程序 brew cask install minikub 安装后使用minikube version命令查看版本 2、安装docker环境 brew install --cask --appdir/Applications docker #安装docker open -a Docker #启动docker 3、安装kubectl curl -LO https://storage.g…

PostgreSQL 中进行数据导入和导出

在数据库管理中&#xff0c;数据的导入和导出是非常常见的操作。特别是在 PostgreSQL 中&#xff0c;提供了多种工具和方法来实现数据的有效管理。无论是备份数据&#xff0c;还是将数据迁移到其他数据库&#xff0c;或是进行数据分析&#xff0c;掌握数据导入和导出的技巧都是…

【Gitlab】虚拟机硬盘文件丢失,通过xx-flat.vmdk恢复方法

前言 由于近期过年回家&#xff0c;为了用电安全直接手动关闭了所有的电源&#xff0c;导致年后回来商上电开机后exsi上的虚拟机出现了问题。显示我的gitlab虚拟机异常。 恢复 开机之后虚拟机异常&#xff0c;通过磁盘浏览发现gitlab服务器下面的虚拟机磁盘文件只有一个xxx-f…

python的ruff简单使用

Ruff 是一个用 Rust 编写的高性能 Python 静态分析工具和代码格式化工具。它旨在提供快速的代码检查和格式化功能&#xff0c;同时支持丰富的配置选项和与现有工具的兼容性。ruff是用rust实现的python Linter&Formatter。 安装&#xff1a; conda install -c conda-forge…

第16章 Single Thread Execution设计模式(Java高并发编程详解:多线程与系统设计)

简单来说&#xff0c; Single Thread Execution就是采用排他式的操作保证在同一时刻只能有一个线程访问共享资源。 1.机场过安检 1.1非线程安全 先模拟一个非线程安全的安检口类&#xff0c;旅客(线程)分别手持登机牌和身份证接受工作人员的检查&#xff0c;示例代码如所示。…

项目练习:重写若依后端报错cannot be cast to com.xxx.model.LoginUser

文章目录 一、情景说明二、解决办法 一、情景说明 在重写若依后端服务的过程中 使用了Redis存放LoginUser对象数据 那么&#xff0c;有存就有取 在取值的时候&#xff0c;报错 二、解决办法 方法1、在TokenService中修改如下 getLoginUser 方法中&#xff1a;LoginUser u…

简述mysql 主从复制原理及其工作过程,配置一主两从并验证。

MySQL 主从复制工作过程 1、二进制日志记录&#xff08;Binary Logging&#xff09;&#xff1a; 主服务器开启二进制日志记录功能&#xff0c;将所有更改数据的操作&#xff08;如 INSERT、UPDATE、DELETE&#xff09;记录到二进制日志文件中。 2、日志传输&#xff08;Log…

Python Pandas(3):DataFrame

1 介绍 DataFrame 是 Pandas 中的另一个核心数据结构&#xff0c;类似于一个二维的表格或数据库中的数据表。它含有一组有序的列&#xff0c;每列可以是不同的值类型&#xff08;数值、字符串、布尔型值&#xff09;。DataFrame 既有行索引也有列索引&#xff0c;它可以被看做由…

Windows Docker笔记-安装docker

安装环境 操作系统&#xff1a;Windows 11 家庭中文版 docker版本&#xff1a;Docker Desktop version: 4.36.0 (175267) 注意&#xff1a; Docker Desktop 支持以下Windows操作系统&#xff1a; 支持的版本&#xff1a;Windows 10&#xff08;家庭版、专业版、企业版、教育…

Android学习20 -- 手搓App2(Gradle)

1 前言 昨天写了一个完全手搓的&#xff1a;Android学习19 -- 手搓App-CSDN博客 后面谷歌说不要用aapt&#xff0c;d8这些来搞。其实不想弄Gradle的&#xff0c;不过想着既然开始了&#xff0c;就多看一些。之前写过一篇Gradle&#xff0c;不过是最简单的编译&#xff0c;不涉…

团建 蓝桥杯省a 15

问题描述 小蓝正在和朋友们团建&#xff0c;有一个游戏项目需要两人合作&#xff0c;两个人分别拿到一棵大小为 nn 和 mm 的树&#xff0c;树上的每个结点上有一个正整数权值。 两个人需要从各自树的根结点 1 出发走向某个叶结点&#xff0c;从根到这个叶结点的路径上经过的所…

vscode 如何通过Continue引入AI 助手deepseek

第一步&#xff1a; 在deepseek 官网上注册账号&#xff0c;得到APIKeys(deepseek官网地址) 创建属于自己的APIKey,然后复制这个key,(注意保存自己的key)! 第二步&#xff1a; 打开vscode,在插件市场安装Continue插件, 点击设置&#xff0c;添加deepseek模型&#xff0c;默认…