Skip to content

[RFC] Fine-tune DeepSeek-V4-Flash official DSpark speculator in speculators #2

Description

@chengda-wu

RFC:在 speculators 上微调 DeepSeek-V4-Flash 的 DSpark 投机层

目标

对 DeepSeek 官方发布的 deepseek-ai/DeepSeek-V4-Flash-DSpark 投机层进行微调(fine-tune),使用 speculators 的 DSpark 算法路径。DSv4-Flash 的 DSpark 是 self-drafting(draft 复用 target 自身层),target 层是 MoE,因此 draft 天然含 MoE experts——满足"MoE 投机层"需求。

背景事实(已核实)

DSv4-Flash 与 DSpark

  • 模型deepseek-ai/DeepSeek-V4-Flash,284B 参数 / 13B activated,1M 上下文。基础版原生带 MTP(num_nextn_predict_layers: 1),不自带 DSpark
  • DSpark checkpointdeepseek-ai/DeepSeek-V4-Flash-DSpark 是"同一 checkpoint 附加了一个投机解码模块"(官方卡片原文)。配置含 dspark_block_size: 5dspark_target_layer_ids: [40,41,42]dspark_noise_token_id: 128799
  • DSpark 是 DeepSeek 官方算法(arXiv 2607.05147),官方训练/评估代码库 github.com/deepseek-ai/DeepSpec,含 DSpark/DFlash/Eagle3 三种 draft。DeepSpec README 明确建议 domain-specific 场景"fine-tune the draft model again"。
  • 架构:MoE(n_routed_experts: 256n_shared_experts: 1num_experts_per_tok: 6,expert FP4)+ mHC(hc_mult: 4)+ MLA(CSA+HCA,num_key_value_heads: 1q_lora_rank: 1024),hidden_size: 4096num_hidden_layers: 43
  • self-drafting:draft 复用 target 自身层(vLLM PR [New Model][Nvidia] Add SM12x support for DeepSeek V4 Flash with essential fixes vllm-project/vllm#41834 原文:"DSpark is DeepSeek's self-drafting speculative-decode variant, draft weights carried in the target checkpoint, block size 5")。因 target 层是 MoE,draft 含 MoE experts(vLLM PR [Bugfix][Spec Decode] DSpark: build draft under its own model/quant config (NVFP4 target corrupts MXFP4 draft experts) vllm-project/vllm#49133 提到 "MXFP4 draft experts")。
  • vLLM 推理侧已支持[Spec Decode] DSpark vllm-project/vllm#46995(DSpark 主合并,2026-07-01);服务命令 vllm serve deepseek-ai/DeepSeek-V4-Flash-DSpark --speculative_config '{"method":"dspark","num_speculative_tokens":5}'。本 issue 不涉及推理侧。

speculators 现状(代码证据,commit f8cf626

DSpark 在本仓库继承 DFlash,draft 层硬编码 dense,未适配 DSv4:

  • src/speculators/models/dspark/core.py:21-22 —— DSparkDraftModel(DFlashDraftModel)__init__super().__init__(core.py:33),复用 DFlash 的 layer 构造。
  • src/speculators/models/dflash/core.py:78-83 —— draft 层硬编码 Qwen3DFlashDecoderLayer,无 layer 注册/分发。
  • src/speculators/models/dflash/model_definitions.py:158,163 —— Qwen3DFlashDecoderLayer.mlp = Qwen3MLP(dense),attention 为 Qwen3DFlashAttention(标准 GQA,非 MLA)。
  • DSpark 相比 DFlash 仅多 MarkovHeaddspark/model_definitions.py:12-81)+ ConfidenceHeadmodel_definitions.py:83-91),draft 层结构完全相同,dense
  • src/speculators/models/dspark/dflash/hc_mult|hc_head|mHC|dsv4|deepseek 零代码命中(仅 dspark/config.py:36 一句无关注释)。DSv4 的 mHC 未适配。
  • scripts/train.py:50-53 —— DRAFT_ARCH_CONFIGS = {"llama": LlamaConfig, "qwen3": Qwen3Config},from-scratch 路径只产出 dense。
  • src/speculators/convert/ 下只有 dflash / eagle / mtp无 dspark converterentrypoints.py:22-24, 140-142)。

微调已有 checkpoint 的现有路径

  • scripts/train.py:446-459--from-pretrained(非 config-only、非 mtp)分支 → SpeculatorModel.from_pretrainedsrc/speculators/model.py:232-388):可加载 speculators 原生格式(config.json 含 speculators_model_type="dspark" + safetensors)的 DSpark checkpoint 并继续训练。
  • 但官方 DeepSeek-V4-Flash-DSpark 不是 speculators 原生格式,而是 DeepSpec/vLLM 的 self-drafting 格式(draft 权重嵌在 target checkpoint 里,按 dspark_target_layer_ids 复用 target 层)。speculators 没有把它转成原生格式的 converter。

需要的改造

A. 加载官方 DSpark checkpoint(最关键,决定能否微调)

  1. 新建 dspark converter:在 src/speculators/convert/dspark/ 新增 converter(注册到 entrypoints.py:22-24, 32, 140-142),从 DeepSeek-V4-Flash-DSpark checkpoint 抽取 DSpark draft 权重,转成 speculators 原生格式。需处理:
    • self-drafting 的权重布局:draft 权重在 target checkpoint 里的 key 前缀与 speculators 的 DSparkSpeculator 期望布局(dspark/config.py:23-26architectures=["DSparkSpeculator"])之间的映射。
    • dspark_target_layer_ids: [40,41,42] → speculators DSpark 的 layer 数(DFlash/DSpark 的 num_draft_layers,见 dflash/core.py:78-83)。
    • dspark_block_size: 5 → DSpark config 的 block_sizedspark/config.py 继承 DFlash 的 block_size)。
    • dspark_noise_token_id → DSpark 的 noise/mask token。
    • 参考 convert/mtp/converter.py 的抽取+fuse 模式,但 DSpark 无 mtp.* 前缀,权重来自 target 层复用。

B. 让 DSpark draft 层支持 MoE(对齐 DSv4 self-drafting 的 MoE 结构)

  1. 新建 MoE DFlash decoder layer:参照 dflash/model_definitions.py:158-207Qwen3DFlashDecoderLayer,把 self.mlp = Qwen3MLP(第 163 行)换成 DSv4 的 MoE block(256 routed + 1 shared expert,aux-loss-free 路由,FP4 expert)。attention 部分需从 Qwen3DFlashAttention(GQA)换成 DSv4 MLA(CSA+HCA) 的 DFlash 变体。
  2. 让 DSpark 用该 layerDFlashDraftModel.__init__dflash/core.py:78-83)当前硬编码 Qwen3DFlashDecoderLayer,需改为按 model_type 分发(对齐 eagle3/model_definitions.py:131-137 的注册制),或 DSpark 覆盖 __init__。同步更新 _no_split_modulesdflash/core.py:36)。

C. 适配 DSv4 的 mHC 与 MLA

  1. mHC(hc_mult=4:DSv4 hidden state 是 hc_mult * hidden_size。需在 DSpark/DFlash 里加 hc_head_project 折叠 hc_mult*hidden_size → hidden_size(参考 Add hc_mult support to DFlash for DeepSeek-V4-Flash vllm-project/speculators#524 给 dense DFlash 的 mHC 适配,但 Add hc_mult support to DFlash for DeepSeek-V4-Flash vllm-project/speculators#524 尚未合入 main)。DSpark 的 MarkovHead/ConfidenceHead 输入维度也要相应对齐。
  2. MLAQwen3DFlashAttention 假设标准 GQA + hidden_size 形状的 target_hidden。DSv4 用 MLA + hc_mult*hidden_size,K/V 构造需重写(风险最高)。

D. 训练侧

  1. config 注册DRAFT_ARCH_CONFIGSscripts/train.py:50-53)加 DSv4 条目;create_transformer_layer_configtrain.py:178-194)支持构造含 n_routed_experts / num_experts_per_tok / hc_mult / q_lora_rank 等字段的 config。
  2. MoE aux lossdspark/metrics.py / dspark/core.py:187-199 的 loss 当前无 router aux loss,需加入(DSv4 是 aux-loss-free 路由,可能不需要传统 load-balance loss,需对照 DeepSpec 实现)。
  3. 数据生成src/speculators/train/data.py hidden state 抽取架构无关,但 DSv4 的 mHC hidden state 形状(hc_mult*hidden_size)需在 dataloader 里处理(参考 Add hc_mult support to DFlash for DeepSeek-V4-Flash vllm-project/speculators#524hc_mult 透传到 collate/sample 形状)。

vllm-project#524 的关系

vllm-project#524dense DFlash 加 DSv4 mHC 适配(hc_mult 透传、hc_head_projectload_verifier_weights override),尚未合入 main。本 issue 的 DSpark MoE 路径应建立在 vllm-project#524 的 mHC 适配之上,但额外需要:MoE layer、MLA attention、dspark converter、self-drafting 权重抽取——范围远大于 vllm-project#524

开放问题

  • 是否应直接用 DeepSpec 微调? DeepSeek 官方 github.com/deepseek-ai/DeepSpec 已提供 DSpark 训练流水线且原生支持 DSv4-Flash。若目标只是微调 DSv4-Flash-DSpark,DeepSpec 可能比改造 speculators 更直接。本 issue 的价值在于:把 DSv4-Flash DSpark 纳入 speculators 的统一 draft 训练框架(与 EAGLE-3/DFlash/MTP 一致的 config/数据/部署契约)。需讨论是否值得。
  • self-drafting vs 独立 draft:DSv4-Flash-DSpark 是 self-drafting(draft=target 层)。speculators 的 DSpark 是独立 dense draft。微调时是保持 self-drafting(draft 层=target MoE 层)还是改成独立 MoE draft?前者更贴近官方、改造在 converter;后者更通用、改造在 layer 注册。倾向前者。
  • MoE draft 在 DSv4 上的接受率:self-drafting draft=target 层理论上接受率高(与 target 同构),但 mHC+MLA+FP4 expert 的训练稳定性需小规模验证(DSv4-Lite 或减少 expert 数)。
  • expert FP4 训练:DSv4 expert 是 FP4,微调时是否保持 FP4?speculators 的 trainer(src/speculators/train/trainer.py)当前 dense-only,FP4 MoE 训练需额外支持。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions