DeepSeek-V3 核心架构源码讲解

1. 引言

DeepSeek-V3 由杭州深度求索人工智能基础技术研究有限公司发布的 LLM 模型,于2024年12月26日发布。DeepSeek-V3 为自研 MoE 模型,671B 参数,激活 37B,在 14.8T token 上进行了预训练。DeepSeek-V3 在推理速度上相较历史模型有了大幅提升。在目前大模型主流榜单中,DeepSeek-V3 在开源模型中位列榜首,与世界上最先进的闭源模型不分伯仲。

本文主要带领大家结合 DeepSeek-V3 技术报告一同查阅 DeepSeek-V3 核心架构的源码。建议事先下载好源码一同来学习学习,如果没有时间细看可以先收藏后查阅。

github:https://github.com/deepseek-ai/DeepSeek-V3

模型架构代码所在:inference/model.py

我们主要关注 model.py 文件中的代码即可。

2. 模型架构

我们先看一下官方展示的 DeepSeek-V3 模型架构图:

从上面这张图中,官方主要详细展示有两块内容,一是 MLA,二是 MOE,这些也是本文的主要内容所在。

对应来看下 model.py 定义的 class 有这些:

我们根据 model.py 定义的class 引用关系,可以绘制得出以下的关系:

3. 代码流程

3.1 初始化

Transformer 入口初始化:

3.1.1 Transformer类

这里核心的初始化是模型层的初始化,每一层添加 Block 层:

ps:代码中的 ParallelEmbeddingColumnParallelLinear 主要用于分布式计算的,我们可以简化为 Embedding、Linear,即向量化、线性变换。

3.1.2 Block类

Block 层初始化主要关注 attn 和 ffn 层。

其中:

  • attn 是 MLA(Multi-Head Latent Attention)替换了 Transformer 的 Multi-Head Attention
  • ffn 也不完全是原始 Transformer 的 ffn,而是前几层是 MLP(多层感知机)、后面都是 MOE

Block 的多层叠加类似下图这样,前几层是 MLA + MLP,后面就是 MLA + MOE 了:

MLP(多层感知机)就不解释细节了,就是:线性变换 + 激活 的组合。

3.1.3 MLA类

MLA 是提出的新改进的注意力机制,旨在显著减少推理时的 KV 缓存(Key-Value Cache)占用,同时保持甚至超越传统多头注意力(MHA)的性能,在 DeepSeek-V2 报告中有阐述原理:https://arxiv.org/pdf/2405.04434v5

MLA 的架构:

1. MLA 的核心机制

(1)低秩 Key-Value 联合压缩

  • 问题背景:传统 MHA 对每个 token 需缓存所有的 Key 和 Value
    KaTeX parse error: Unexpected character: '?' at position 33: …athbf{q}_{t} = ?̲?^Q\mathbf{h}_{…
    这里需要缓存的就是 k t \mathbf{k}_t kt v t \mathbf{v}_t vt,缓存的总元素数为 2 n h d h l 2n_h d_h l 2nhdhl n d n_d nd 表示头数, d h d_h dh 表示每头的维度, l l l 表示层数,这样导致长序列推理时内存占用激增。

如果你问为什么仅需要缓存 k t \mathbf{k}_t kt v t \mathbf{v}_t vt,而不需要缓存 q t \mathbf{q}_t qt,这涉及到 Transformer 的注意力机制的推理细节。Queries 通常是基于当前输入直接生成的,即它们是针对当前时间步或当前位置即时计算出来的,而 Keys 和 Values 是提前计算好的,并且可以在后续的时间步骤或层之间重复使用。不妨可以先关注后续文章再展开说明。

  • 解决方案:MLA 通过低秩投影将 Key 和 Value 联合压缩到潜在空间,类似 LoRA 的思想:
    c t K V = W D K V h t k t C = W U K c t K V v t C = W U V c t K V \begin{align} \mathbf{c}_{t}^{KV} = W^{DKV} \mathbf{h}_t \\ \mathbf{k}_{t}^{C} = W^{UK} \mathbf{c}_{t}^{KV} \\ \mathbf{v}_{t}^{C} = W^{UV} \mathbf{c}_{t}^{KV} \end{align} ctKV=WDKVhtk
### 关于 DeepSeek 开源项目的代码解析 #### 项目结构概览 DeepSeek 的开源项目通常遵循标准的 Python 项目布局,这有助于开发者快速理解整个项目的组织方式。典型的目录结构可能包括 `src` 文件夹用于存放核心源码、`tests` 文件夹放置单元测试脚本以及必要的配置文件如 `setup.py` 或者 `pyproject.toml` 来管理依赖关系和构建过程[^1]。 #### 主要组件介绍 - **MoE (Mixture of Experts)** 架构:这是 DeepSeek V3 版本中的核心技术之一,它允许模型根据不同输入动态调整内部专家网络的选择路径,从而提高效率并减少计算资源消耗。这种机制特别适合处理复杂的多模态数据集。 - **优化策略**:为了提升性能,DeepSeek 实现了一系列高效的训练技巧和技术,比如梯度累积、混合精度训练等方法来加速收敛速度而不损失准确性[^2]。 #### 配置与环境搭建指南 对于希望深入研究 DeepSeek 源码的新手来说,官方提供的安装指导文档是非常宝贵的参考资料。这些资料不仅涵盖了基本的软件包安装步骤,还包含了针对不同操作系统定制化的设置建议,确保每位贡献者都能顺利运行本地实例。 #### 调试技巧分享 当遇到难以定位的问题时,利用调试器(例如 PyCharm Professional Edition 中内置的那个)可以帮助更直观地跟踪程序执行流程;另外也可以考虑启用日志记录功能,通过分析输出的日志信息找出潜在错误所在之处。 ```python import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) def some_function(): logger.debug('This is a debug message.') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmallerFL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值