今天在 GitHub Trending 上看到一个有意思的项目:DeepSeek 开源的 DeepSpec,这是一个专为投机解码(Speculative Decoding)设计的全栈训练与评估框架,帮助研究者训练更高效的 Draft 模型,从而显著加速大模型的推理过程。

一、项目概述

DeepSpec 是 DeepSeek 开源的全栈代码库,用于训练和评估投机解码中的 Draft 模型。投机解码是一种在不影响生成质量的前提下大幅加速 LLM 推理的关键技术——它使用一个小型 Draft 模型快速生成候选 token,再由大目标模型进行验证。

项目核心包含三大模块:

  • 数据准备:下载 prompts、重新生成目标模型答案、构建目标缓存
  • 模型训练:支持三种前沿 Draft 算法——DSpark、DFlash 和 Eagle3
  • 模型评估:在 9 个标准化 benchmark 上测量投机解码的接受率

DeepSpec 目前支持 Qwen3 和 Gemma 系列作为目标模型,并提供了完整的预训练 checkpoint 供直接使用。

二、技术原理

投机解码的工作流程

投机解码的核心思想是"以小博小"——用一个轻量级 Draft 模型快速生成多个候选 token,然后由大目标模型并行验证。如果 Draft 模型猜对了大部分 token,推理速度可以提升 2-3 倍甚至更多。DeepSpec 的完整流程分为三阶段:

  1. 数据准备:从训练集中下载 prompts,使用目标模型重新生成标准答案,并构建目标缓存。注意默认配置下缓存可能高达 38TB(以 Qwen/Qwen3-4B 为例),需要充分规划存储。
  2. 训练:Draft 模型以目标模型的输出为目标进行训练,学习预测目标模型的生成行为。
  3. 评估:在标准化 benchmark 上测量接受率和加速比。

三种 Draft 算法

DeepSpec 集成了三种主流的 Draft 模型架构:

算法特点
Eagle3基于 Transformer 的 Draft 模型,利用目标模型的隐藏状态作为额外输入
DFlash高效的轻量级 Draft 设计,通过 flash-style attention 优化推理速度
DSparkDeepSpec 的核心贡献,详见配套论文《DSpark》

训练框架设计

train.py 可以看到,训练流程的设计非常工程化:

def main(local_rank):
    args = parse_args()
    seed_all(int(args.seed))
    if local_rank == 0:
        print(json.dumps(args, indent=4, cls=CustomJSONEncoder), flush=True)
    trainer = args.train.trainer_cls(local_rank, args)
    trainer.train()
    trainer.clean_up()

关键设计点:

  • 使用 torch.multiprocessing.spawn 实现多 GPU 并行,每 GPU 一个 worker
  • 通过 config 文件驱动训练配置,支持 --opts 覆盖单个字段
  • 集成了 git SHA 记录,方便复现训练结果

评估框架

eval.py 中通过配置驱动的 Evaluator 选择机制:

EVALUATORS = {
    "Qwen3DSparkModel": Qwen3DSparkEvaluator,
    "Gemma4DSparkModel": Gemma4DSparkEvaluator,
    "Qwen3Eagle3Model": Qwen3Eagle3Evaluator,
    "Gemma4Eagle3Model": Gemma4Eagle3Evaluator,
    "Eagle3DraftModel": Qwen3Eagle3Evaluator,
}

模型架构名称与 Evaluator 类自动映射,支持 9 个标准 benchmark 的一次性评估。

三、安装与快速开始

环境要求

  • Python 3.10+
  • CUDA 兼容的 GPU(默认配置需要 8 张 GPU,可通过 CUDA_VISIBLE_DEVICES 调整)
  • 足够的磁盘空间(数据缓存可能需要 TB 级存储)

安装步骤

# 克隆仓库
git clone https://github.com/deepseek-ai/DeepSpec.git
cd DeepSpec

# 安装依赖
python -m pip install -r requirements.txt

最简运行示例

# 训练(需要先准备好数据)
bash scripts/train/train.sh

# 评估
bash scripts/eval/eval.sh

四、使用方法与实战

数据准备

完整的 Pipeline 需要按顺序执行:

# 1. 下载并分割训练数据
# 2. 重新生成目标模型答案
# 3. 构建目标缓存

⚠️ 存储警告:默认配置下目标缓存可能达到 38TB,建议在 SSD 或大容量存储上运行。

训练配置

训练通过配置文件驱动,例如训练 DSpark 搭配 Qwen3-4B:

bash scripts/train/train.sh

配置路径指向 config/dspark/dspark_qwen3_4b.py,可以通过 --opts 覆盖参数:

bash scripts/train/train.sh --opts train.batch_size=32 train.learning_rate=5e-4

checkpoint 保存于 ~/checkpoints/<project_name>/<exp_name>/step_*

使用预训练 Checkpoint

DeepSpec 提供了多个预训练 checkpoint 可直接下载使用:

python scripts/eval/eval.sh \
    --target_name_or_path Qwen/Qwen3-4B \
    --draft_name_or_path deepseek-ai/dspark_qwen3_4b_block7

支持的预训练 checkpoint 已在 Hugging Face 上发布,覆盖 Qwen3-4B/8B/14B 和 Gemma-4-12B 四种目标模型。

多 GPU 适配

默认配置使用 8 GPU,如果 GPU 数量不足:

export CUDA_VISIBLE_DEVICES=0,1,2,3
bash scripts/train/train.sh

五、常见问题与解决方案

安装失败

问题pip install -r requirements.txt 失败,特别是 torch 依赖。 解决:CUDA torch 需要手动安装匹配版本的 wheel,官方 wheel 可能不适合所有环境。请根据 CUDA 版本从 pytorch.org 安装。

磁盘空间不足

问题:数据准备阶段报磁盘空间错误。 解决:默认缓存约 38TB,可通过修改配置中的缓存路径指向大容量存储卷,或减少数据集大小。

GPU 内存不足

问题:训练时 OOM。 解决:减少 batch size,或降低模型规模(从 Qwen3-14B 降到 4B)。

引用规范

如果使用 DeepSpec 进行学术研究,请注意:

  • 使用仓库提供的默认训练配置,确保结果可比性
  • 如果目标模型运行在 thinking mode,需要对 Draft 模型进行微调

六、总结

DeepSpec 是 DeepSeek 开源的一个高质量投机解码全栈框架,将数据准备、模型训练和标准化评估整合为一条完整的 Pipeline。它集成了 DSpark、DFlash 和 Eagle3 三种主流 Draft 算法,并提供预训练 checkpoint 供直接使用。

对于从事 LLM 推理加速的研究者和工程师来说,DeepSpec 提供了一个开箱即用的实验平台。它的模块化设计也方便研究者贡献新的 Draft 算法——只需要按照接口规范实现并添加到 EVALUATORS 映射中即可。