Hugging Face 发布 Open R1 项目:完全开源复现 DeepSeek-R1
Hugging Face 的 Open R1 项目旨在完全开源复现 DeepSeek-R1 的推理能力,已发布多个高质量数据集和训练方案,并完成第一阶段蒸馏任务。
DeepSeek-R1 的完全开放复现项目。本仓库仍在建设中,让我们一起构建它!目录- 概述- 行动计划- 安装- 训练模型- 评估模型- 复现 DeepSeek 的评估结果- 数据生成- 贡献本仓库的目标是构建 R1 流程中缺失的部分,让每个人都能复现并在此基础上构建。
项目设计简洁,主要包括:src/open_r1:包含训练模型和生成合成数据的脚本。grpo.py:在给定数据集上使用 GRPO 训练模型。sft.py:在数据集上对模型进行简单的 SFT。generate.py:使用 Distilabel 从模型生成合成数据。
Makefile:包含利用上述脚本的 R1 流程中每个步骤的易用命令。我们将以 DeepSeek-R1 技术报告为指导,大致分为三个主要步骤:- 步骤 1:通过从 DeepSeek-R1 蒸馏高质量语料库来复现 R1-Distill 模型。
- 步骤 2:复现 DeepSeek 用于创建 R1-Zero 的纯 RL 流程。这可能涉及策划新的、大规模的数学、推理和代码数据集。- 步骤 3:展示我们可以通过多阶段训练从基础模型过渡到 RL 微调模型。
- 🧑🍳 [2025/05/26](步骤 1 完成!)我们发布了 Mixture-of-Thoughts——一个精心策划的推理数据集,包含从 R1 蒸馏的 35 万条经过验证的推理轨迹。
该数据集涵盖数学、编程和科学领域的任务,旨在教会语言模型逐步推理。
我们还提供了训练 OpenR1-Distill-7B 的配方,该模型复现了 deepseek-ai/DeepSeek-R1-Distill-Qwen-7B 的推理能力,标志着 Open R1 项目步骤 1 的完成。
- ⚡️ [2025/03/11](更新 #3):我们发布了 CodeForces-CoTs 数据集,包含 1 万个竞赛编程问题和从 R1 蒸馏的 10 万个解决方案。我们还发布了 IOI24:一个来自国际奥林匹克竞赛的极难问题的新基准。
在 CodeForces-CoTs 上训练的 7B Qwen 模型在 IOI24 上可以超越 Claude 3.7 Sonnet,而 32B 模型甚至可以超越 R1 本身。
- ∞ [2025/02/10](更新 #2):我们在新版本的 NuminaMath 上发布了 OpenR1-Math-220k 数据集,包含从 R1 蒸馏的 22 万条轨迹。在该数据集上训练的模型性能与 DeepSeek 蒸馏的模型相当。
- 🔥 [2025/02/02](更新 #1):我们实现了训练、推理和评估流程的第一部分。开始吧!注意库依赖于 CUDA 12.4。如果遇到与段错误相关的错误,请使用 nvcc --version 仔细检查系统运行的版本。
要运行本项目中的代码,首先使用例如 uv 创建 Python 虚拟环境。要安装 uv,请遵循 UV 安装指南。注意作为快捷方式,运行 make install 来设置开发库(具体如下所述)。
之后,如果一切设置正确,您可以尝试 Open-R1 模型。
uv venv openr1 --python 3.11 && source openr1/bin/activate && uv pip install --upgrade pip提示对于 Hugging Face 集群用户,
请将 export UV_LINK_MODE=copy 添加到您的 .bashrc 中,以抑制来自 uv 的缓存警告。接下来,安装 vLLM 和 FlashAttention:
uv pip install vllm==0.8.5.post1uv pip install setuptools && uv pip install flash-attn --no-build-isolation这也会安装 PyTorch v2.6.0,
使用此版本非常重要,因为 vLLM 二进制文件是为它编译的。然后您可以通过 pip install -e .[LIST OF MODES] 安装特定用例的其余依赖项。
对于大多数贡献者,我们建议:GIT_LFS_SKIP_SMUDGE=1 uv pip install -e ".[dev]"接下来,按如下方式登录您的 Hugging Face 和 Weights and Biases 账户:
huggingface-cli loginwandb login最后,检查您的系统是否安装了 Git LFS,以便您可以加载模型/数据集并将其推送到 Hugging Face Hub:git-lfs --version如果未安装,请运行:
sudo apt-get install git-lfs注意下面的训练命令是针对一个 8×H100(80GB)的节点配置的。对于不同的硬件和拓扑,您可能需要调整批次大小和梯度累积步数。我们支持使用 DDP 或 DeepSpeed(ZeRO-2 和 ZeRO-3)训练模型。
例如,要对从 DeepSeek-R1 蒸馏的、包含推理轨迹的数据集(如 open-r1/Mixture-of-Thoughts)执行 SFT,请运行:
# 通过命令行训练accelerate launch --config_file=recipes/accelerate_configs/zero3.yaml src/open_r1/sft.py \--model_name_or_path open-r1/Qwen2.5-
Math-7B-RoPE-300k \--dataset_name open-r1/Mixture-of-Thoughts \--dataset_config all \--eos_token '<|im_end|>' \--learning_rate 4.0e-5 \-
-num_train_epochs 5 \--max_seq_length 32768 \--per_device_train_batch_size 2 \--gradient_checkpointing \--bf16 \--use_liger_kernel \--ou
tput_dir data/OpenR1-Distill-7B# 通过 YAML 配置训练accelerate launch --config_file recipes/accelerate_configs/zero3.yaml src/open_r1/sft.py \-
-config recipes/OpenR1-Distill-7B/sft/config_distill.yaml目前支持以下任务:
- 监督微调 (sft)- 组相对策略优化 (grpo)提示如果您扩大/缩小 GPU 数量,我们建议同时调整每设备批次大小或梯度累积步数,以保持全局批次大小不变。
默认情况下,这些脚本会将每个模型推送到您的 Hugging Face Hub 用户名下,即 {username}/{model_name}-{task}。您可以通过将参数附加到命令来覆盖每个 YAML 配置中的参数,如下所示:
# 将基础模型更改为更小的变体accelerate launch --config_file recipes/accelerate_configs/zero3.yaml src/open_r1/sft.py \--config recipes/OpenR1-Distill
-7B/sft/config_distill.yaml
yaml \--model_name_or_path Qwen/Qwen3-0.6B-Base \--hub_model_id OpenR1-Distill-0.6B \--output_dir data/OpenR1-Distill-0.6B如果您还希望覆盖 Weigh
ts and Biases 的默认设置,可以如下操作:
accelerate launch --config_file recipes/accelerate_configs/zero3.yaml src/open_r1/sft.py \--config recipes/OpenR1-Distill-7B/sft/config_
distill.yaml \--wandb_entity huggingface --wandb_project open-r1 --run_name Qwen2.5-1.5B-GRPO🚨 警告 🚨大多数基础模型(如 meta-llama/Llama-3.2-1B)没
有聊天模板,因此我们在训练期间将 ChatML 设置为默认值。但是,对于 Qwen 基础模型(如 Qwen/Qwen2.5-1.5B),分词器中预定义了聊天模板,因此必须相应设置 EOS token,例如:
# 为 Qwen 基础模型对齐 EOS token 与聊天模板accelerate launch --config_file=recipes/accelerate_configs/zero3.yaml src/open_r1/sft.py \--model_name_or
_path Qwen/Qwen2.5-1.5B \+ --eos_token '<|im_end|>' \--dataset_name open-r1/Mixture-of-Thoughts \--dataset_config all \--learning_rate 4
.0e-5 \--num_train_epochs 1 \--max_seq_length 32768 \--per_device_train_batch_size 16 \--gradient_checkpointing \--bf16 \--use_liger_ker
nel \--output_dir data/Qwen2.5-1.5B-Open-R1-Distill如果您希望使用自定义聊天模板(例如 Llama 或 Gemma),
则必须提供聊天模板和相关的 EOS token:# 将 EOS token 与自定义聊天模板对齐accelerate launch --config_file=recipes/accelerate_configs/zero3.yaml
yaml src/open_r1/sft.py \--model_name_or_path meta-llama/Llama-3.2-1B \+ --chat_template "$(cat llama_chat_template.jinja)" \+ --eos_tok
en '<|eot_id|>' \--dataset_name open-r1/Mixture-of-Thoughts \--dataset_config all \--learning_rate 4.0e-5 \--num_train_epochs 1 \--max_s
eq_length 32768 \--per_device_train_batch_size 16 \--gradient_checkpointing \--bf16 \--use_liger_kernel \--output_dir data/Llama-3.2-1B-
Open-R1-Distill我们提供了一个配方,从相同的基础模型开始,复现 deepseek-ai/DeepSeek-R1-Distill-Qwen-7B 的推理能力。为此,请运行:
ACCELERATE_LOG_LEVEL=info accelerate launch --config_file recipes/accelerate_configs/zero3.yaml \src/open_r1/sft.py \--config recipes/Op
enR1-Distill-7B/sft/config_distill.yaml结果将是一个类似 open-r1/OpenR1-Distill-7B 的模型,具有以下