DeepSeek 家族与版本
- **DeepSeek-V3-0324**:685B 总参数(MoE),激活参数峰值 370B,通用模型 - **DeepSeek-R1(671B)**:主打推理——靠 CoT 思维链机制,MATH-500 / AIME 2024 超 o1 - **R1-Zero(671B)**:纯 RL(无 SFT 冷启动)验证推理能力可被 RL 直接激发 - 端点:`deepseek-chat` → V3 系列;`deepseek-reasoner` → R1 系列(reasoner 输出含 reasoning_content 思维链)
R1 的 6 个蒸馏版(teacher 的推理模式蒸馏进小底座): ```text DeepSeek-R1-Distill-Qwen-1.5B / 7B / 14B / 32B DeepSeek-R1-Distill-Llama-8B / 70B ``` GGUF 与 safetensors 双格式分发;全量 671B 需 400-500G 磁盘(下载后删 .git 可省一半)。蒸馏 32B(Qwen2.5-32B 底座)推理速度快约 50 倍、部分基准超 o1-mini。
vLLM 部署要点: ```bash # 版本锁定组合(vllm 0.5.5 期) pip install torch==2.4.0 transformers==4.44.0 tokenizers==0.19.1 triton==3.0.0 vllm==0.5.5 vllm serve /wks/models/deepseek/DeepSeek-R1-Distill-Qwen-32B \ --tensor-parallel-size 2 --max-model-len 32768 --enforce-eager ``` - 1.5B + 4K 上下文仅需约 6G 显存(入门实验友好) - 流式响应中 `reasoning_content` 与 `content` 分离处理
V3 架构配置总览
DeepSeek-V3(model.py 配置,节选): | 项 | 值 | |----|----| | vocab / dim | 129280 / 7168 | | 层数 | 61(前 3 层 dense FFN,其余 MoE) | | 注意力头 | 128 | | 专家 | 256 路由专家 + 1 共享专家,每 token 激活 8 | | 分组路由 | 8 组限制选 4 组,route_scale=2.5 | | MLA 低秩 | q_lora_rank=1536,kv_lora_rank=512 | | 每头维度 | qk_nope=128,qk_rope=64,v_head=128 | | 打分 | sigmoid;dtype=fp8 | 三档规格:16B / 236B / 671B 共用同一套代码不同配置。
一句话架构:**MLA(省 KV Cache)+ 细粒度 MoE(省每 token 计算)+ FP8 混合精度训练 + MTP 多 token 预测**。 对应开源代码 deepseek-ai/DeepSeek-V3 的单文件 `model.py`(文章《Deepseek-v3原理及代码详解》逐类讲解,本页后两节为其提炼)。
MLA:多头潜在注意力
动机:KV Cache 随"层数×头数×序列长"线性膨胀,是长上下文推理的最大显存杀手。 MLA 方案——**先缩小再放大**(低秩压缩): ```text x --wkv_a--> 潜在向量 c (kv_lora_rank 维) + 单独的 RoPE 部分 k_pe ↓ 只缓存 c 和 k_pe(很小) --wkv_b--> 还原 k_nope / v(按需升维) ``` KV Cache 从每头各自的 (nope+v) 维,压到全局共享的 `c(512) + k_pe(64)` 维/token。
两种实现模式: - **naive**:还原图 k/v 后按经典方式算注意力(缓存仍大) - **absorb(权值吸收)**:把升维矩阵 wkv_b **吸收进 q**,直接对 latent cache 算注意力: ```python # einsum 把 wkv_b 并入 q_nope,与缓存的 c 直接内积 attn_nope = torch.einsum("bshd,hdc->bshc", q_nope, wkv_b) # q' = q·W_v # 再与 rope 部分 k_pe 拼接做完整注意力 ``` 实验对照(dim=1024、8 头、kv_lora=256、qk_rope=32):naive 缓存 8×(96+64) 维/token,absorb 仅 256+32 维——**约为 1/5**。
代码要点(对应论文公式): - 式 1 降维得 c;式 3 k_pe;式 2/5 升维还原 k_nope/v;式 4 拼完整 k;式 6-9 q 侧(wq_a→RMSNorm→wq_b 低秩,拆 q_nope/q_pe) - `softmax_scale = (qk_nope + qk_rope) ** -0.5` - YaRN 上下文扩展时乘 `mscale = 0.1 × ln(rope_factor) + 1` - 双缓存策略:register_buffer 的 k_cache/v_cache 或 kv_cache/pe_cache
DeepSeekMoE
传统 MoE:$h' = \sum_i g_i\,\text{FFN}_i(u_t)$,$g'=Softmax(W_g u_t)$ 取 TopK。 DeepSeekMoE 三改进: 1. **共享专家**:所有 token 必经,保证基础能力 2. **细粒度专家**:FFN 隐藏维缩至 1/m,分组路由选 K 组补偿——同样激活参数下组合更灵活 3. **sigmoid 替代 softmax**:专家独立打分,有效/无效差异更显著 总输出:$h'_t = u_t + \text{FFN}_{share}(u_t) + \sum_r g_{i,t}\,\text{FFN}_r(u_t)$
**V3 改进①:无辅助损失负载均衡**——用 bias 代替 LB loss: - 专家得分 $s_{i,t} + b_i$ 参与 TopK;b_i 随负载动态调整(γ 控速度) - **开源代码实现差异(重要)**:仅 671B(dim=7168)设 bias 且为可学习参数,更小模型不设 **V3 改进②:序列级平衡损失**(论文式 17-20): $$L_{Bal} = \alpha \sum_i f_i \cdot P_i$$ f_i = TopK 激活频率(指示函数),P_i = 归一化亲和度 $s'_{i,t} = s_{i,t}/\sum_j s_{j,t}$ 的时序均值,α 极小。
Gate 选专家流程(model.py,五步): ```text sigmoid 打分(+bias) → 按 n_groups 分组:组分数取 amax(无bias) 或 topk(2) 之和(有bias) → 选 topk_groups,未选组填 -inf → 全局 topk 选出最终专家 → 从原始分数 gather 并归一化 × route_scale ``` MoE 前向四步:gate 选专家 → 本地专家循环 `y[idx] += expert(x[idx]) * w` → 加共享专家 z → 多卡时 `dist.all_reduce(y)` 后再加 z。 并行基元:ColumnParallel(输出按特征切,需 concat)vs RowParallel(输出需 all_reduce 求和)。
参考
     Deepseek-v3原理及代码详解(知乎·Peter Pan) 
     deepseek-ai/DeepSeek-V3