Open R1
我们知道DeepSeek-R1离完全真开源有一定距离,只开放了最终的模型权重,整个训练的数据,代码以及过程权重都没有开放。因此网上有很多复刻deepseek-R1的项目,其中Huggingface主导的 open-r1 项目最为活跃与知名,目前已有18.7K星。

一、项目概述
https://github.com/huggingface/open-r1.git
open-r1 是一个致力于完全开放复现 DeepSeek-R1 的仓库,目前仍在开发中…
项目根目录下的文件和文件夹说明。以下是对 open-r1 项目目录结构的解析
1. 基础文件
-
.gitignore:用于指定在使用 Git 进行版本控制时,哪些文件或目录应被忽略,不纳入版本管理。 -
LICENSE:项目的许可证文件,明确了该项目的使用和分发规则。 -
Makefile:包含一系列易于运行的命令,借助src/open_r1中的脚本,实现 R1 管道中各个步骤的自动化操作。 -
README.md:项目的说明文档,包含项目概述、安装步骤、使用方法等重要信息。 -
setup.cfg:用于配置项目的元数据,如项目名称、版本号、作者等信息。 -
setup.py:Python 项目的打包和安装脚本,可用于将项目打包为可分发的 Python 包。
2. 测试相关
-
tests/: -
__init__.py:使tests目录成为一个 Python 包,方便进行模块化的测试组织。 -
test_rewards.py:用于测试rewards模块相关功能的测试脚本。
3. 食谱配置文件目录
-
recipes/: -
DeepSeek-R1-Distill-Qwen-7B/:包含与DeepSeek-R1-Distill-Qwen-7B相关的配置文件,如config_demo.yaml用于配置模型训练参数等。 -
Qwen2.5-1.5B-Instruct/:包含Qwen2.5-1.5B-Instruct模型相关的配置文件。 -
Qwen2.5-Math-7B/:包含Qwen2.5-Math-7B模型相关的配置文件。 -
README.md:该目录下的说明文档,介绍相关配置的使用方法等。 -
accelerate_configs/:存储加速配置文件,例如用于分布式训练的配置文件。
4. GitHub 相关配置
-
.github/: -
dependabot.yml:用于配置 Dependabot,它可以自动检测项目依赖项的更新,并根据配置文件中的规则自动创建 Pull Request 以更新依赖项。 -
workflows/:包含 GitHub Actions 的工作流文件,用于自动化项目的构建、测试、部署等流程。
5. 脚本目录
-
scripts/: -
generate_reasoning.py:用于生成推理相关数据的脚本。 -
run_benchmarks.py:运行基准测试的脚本。
6. SLURM 脚本目录
-
slurm/: -
README.md:该目录下的说明文档,介绍 SLURM 作业脚本的使用方法等。 -
evaluate.slurm:用于在 SLURM 集群上提交评估任务的作业脚本。 -
experimental/:可能包含一些实验性质的 SLURM 作业脚本。 -
generate.slurm:用于在 SLURM 集群上提交数据生成任务的作业脚本。 -
serve_r1.slurm:用于在 SLURM 集群上启动 R1 服务的作业脚本。 -
serve_router.slurm:用于在 SLURM 集群上启动路由服务的作业脚本。 -
train.slurm:用于在 SLURM 集群上提交训练任务的作业脚本。
7. 日志目录
-
logs/: -
.gitkeep:用于保持该目录在 Git 仓库中的存在,即使该目录为空,也能被版本控制。
8. assets目录
-
assets/: -
plan-of-attack.png:项目计划的图片文件,可能用于可视化项目的执行步骤等。
9. 源代码目录
-
src/: -
包含训练、评估模型以及生成合成数据的脚本,例如:
-
grpo.py:用于在给定数据集上使用 GRPO 方法训练模型。 -
sft.py:用于在数据集上对模型进行简单的监督微调(SFT)。 -
evaluate.py:用于在 R1 基准上评估模型。 -
generate.py:使用Distilabel从模型生成合成数据。 -
open_r1/: -
Makefile:包含利用上述脚本在R1管道的每个步骤中易于运行的命令。
这个项目的目录结构组织清晰,各个目录和文件分工明确,便于开发和维护。 项目的目标是构建 R1 流水线中缺失的部分,以便每个人都能复现并在此基础上进行开发。项目设计简洁,主要包含以下内容:
二、计划步骤

将 DeepSeek-R1 的技术报告作为指导,大致可分为三个主要步骤:
-
步骤 1:通过从 DeepSeek-R1 中提炼高质量语料库来复现 R1-Distill 模型。
-
步骤 2:复现 DeepSeek 用于创建 R1-Zero 的纯强化学习(RL)流水线。这可能涉及策划新的大规模数学、推理和代码数据集。
-
步骤 3:展示可以通过多阶段训练从基础模型到 RL 调优的过程。
三、安装
-
注意事项:依赖 CUDA 12.4。如果遇到与段错误相关的错误,请使用
nvcc --version检查系统运行的版本。 -
创建虚拟环境:
uv venv openr1 --python 3.11 && source openr1/bin/activate && uv pip install --upgrade pip --link-mode=copy -
安装 vLLM:
uv pip install vllm==0.7.1 --link-mode=copy这将安装 PyTorch
v2.5.1,使用此版本非常重要,因为 vLLM 二进制文件是为此版本编译的。 -
安装其他依赖:
GIT_LFS_SKIP_SMUDGE=1 uv pip install -e ".[dev]" --link-mode=copy -
登录账号:
huggingface-cli login wandb login -
检查和安装 Git LFS:
git-lfs --version如果未安装,运行:
sudo apt-get install git-lfs
四、训练模型
有监督微调(SFT)
支持使用 DDP 或 DeepSpeed(ZeRO-2 和 ZeRO-3)训练模型。例如,要在从 DeepSeek-R1 提炼的带有推理痕迹的数据集(如 Bespoke-Stratos-17k)上运行 SFT,可以运行以下命令:
# Train via command line
accelerate launch --config_file=recipes/accelerate_configs/zero3.yaml src/open_r1/sft.py \
--model_name_or_path Qwen/Qwen2.5-1.5B-Instruct \
--dataset_name HuggingFaceH4/Bespoke-Stratos-17k \
--learning_rate 2.0e-5 \
--num_train_epochs 1 \
--packing \
--max_seq_length 4096 \
--per_device_train_batch_size 2 \
--gradient_accumulation_steps 8 \
--gradient_checkpointing \
--bf16 \
--output_dir data/Qwen2.5-1.5B-Open-R1-Distill
# Train via YAML config
accelerate launch --config_file recipes/accelerate_configs/zero3.yaml src/open_r1/sft.py \
--config recipes/Qwen2.5-1.5B-Instruct/sft/config_demo.yaml
基于梯度的随机策略优化(GRPO)
python src/open_r1/grpo.py --config recipes/Qwen2.5-1.5B-Instruct/grpo/config_demo.yaml
五、评估模型
使用 lighteval 来评估模型,自定义任务定义在 src/open_r1/evaluate.py 中。对于可以在单个GPU上运行的模型,请执行以下操作:
MODEL=deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
MODEL_ARGS="pretrained=$MODEL,dtype=bfloat16,max_model_length=32768,gpu_memory_utilisation=0.8"
OUTPUT_DIR=data/evals/$MODEL
# AIME 2024
TASK=aime24
lighteval vllm $MODEL_ARGS "custom|$TASK|0|0" \
--custom-tasks src/open_r1/evaluate.py \
--use-chat-template \
--output-dir $OUTPUT_DIR
# MATH-500
TASK=math_500
lighteval vllm $MODEL_ARGS "custom|$TASK|0|0" \
--custom-tasks src/open_r1/evaluate.py \
--use-chat-template \
--output-dir $OUTPUT_DIR
# GPQA Diamond
TASK=gpqa:diamond
lighteval vllm $MODEL_ARGS "custom|$TASK|0|0" \
--custom-tasks src/open_r1/evaluate.py \
--use-chat-template \
--output-dir $OUTPUT_DIR
“
[!重要提示] 对于需要跨GPU进行分片的大型模型,请使用_张量并行_并运行以下命令:
NUM_GPUS=8 MODEL=deepseek-ai/DeepSeek-R1-Distill-Qwen-32B MODEL_ARGS="pretrained=$MODEL,dtype=bfloat16,tensor_parallel_size=$NUM_GPUS,max_model_length=32768,gpu_memory_utilisation=0.8" TASK=aime24 OUTPUT_DIR=data/evals/$MODEL export VLLM_WORKER_MULTIPROC_METHOD=spawn lighteval vllm $MODEL_ARGS "custom|$TASK|0|0" \ --custom-tasks src/open_r1/evaluate.py \ --use-chat-template \ --output-dir $OUTPUT_DIR
你还可以使用 make evaluate 来启动评估,同时指定模型、任务,以及可选的并行技术和GPU数量。
在单个GPU上进行评估
make evaluate MODEL=deepseek-ai/DeepSeek-R1-Distill-Qwen-32B TASK=aime24
使用数据并行
make evaluate MODEL=deepseek-ai/DeepSeek-R1-Distill-Qwen-32B TASK=aime24 PARALLEL=data NUM_GPUS=8
使用张量并行
make evaluate MODEL=deepseek-ai/DeepSeek-R1-Distill-Qwen-32B TASK=aime24 PARALLEL=tensor NUM_GPUS=8
六、复现Deepseek的评估结果
[!NOTE] DeepSeek-R1论文采用温度为0.6的采样方法、top-p值为0.95,并且每个查询生成64个响应来估计
pass@1。下面我们报告的是贪婪解码的结果,这可能解释了我们的结果与他们的结果之间存在1 - 3个标准差的微小差异。
MATH-500
我们能够在约1 - 3个标准差的范围内复现Deepseek在MATH-500基准测试中报告的结果:

要复现这些结果,请使用以下命令:
NUM_GPUS=1 # 对于32B和70B模型,将其设置为8
MODEL=deepseek-ai/{model_name}
MODEL_ARGS="pretrained=$MODEL,dtype=bfloat16,max_model_length=32768,gpu_memory_utilisation=0.8,tensor_parallel_size=$NUM_GPUS"
OUTPUT_DIR=data/evals/$MODEL
lighteval vllm $MODEL_ARGS "custom|math_500|0|0" \
--custom-tasks src/open_r1/evaluate.py \
--use-chat-template \
--output-dir $OUTPUT_DIR
另外,你可以按如下方式启动Slurm作业:
python scripts/run_benchmarks.py --model-id={model_id} --benchmarks math_500
七、数据生成
从一个小型蒸馏的R1模型生成数据
model_id = "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B" # 可替换为其他小型蒸馏的R1模型
with Pipeline(
name="distill-qwen-7b-r1",
description="一个从蒸馏的R1模型生成数据的管道",
) as pipeline:
llm = vLLM(
model=model_id,
tokenizer=model_id,
extra_kwargs={
"tensor_parallel_size": 1,
"max_model_len": 8192,
},
generation_kwargs={
"temperature": 0.6,
"max_new_tokens": 8192,
},
)
prompt_column = "problem"
text_generation = TextGeneration(
llm=llm,
template=prompt_template,
num_generations=4,
input_mappings={"instruction": prompt_column} if prompt_column isnotNoneelse {}
)
if __name__ == "__main__":
distiset = pipeline.run(dataset=dataset)
distiset.push_to_hub(repo_id="username/numina-deepseek-r1-qwen-7b")
查看示例数据集:HuggingFaceH4/numina-deepseek-r1-qwen-7b。
从DeepSeek-R1生成数据
要运行更大的DeepSeek-R1模型,我们使用了2个节点,每个节点有8块H100 GPU,使用本仓库中的slurm文件 slurm/generate.slurm。首先,安装依赖项:
(目前我们需要安装vllm的开发版本,该版本修复了R1的CUDA图捕获问题)
pip install https://wheels.vllm.ai/221d388cc5a836fa189305785ed7e887cea8b510/vllm-1.0.0.dev-cp38-abi3-manylinux1_x86_64.whl --extra-index-url https://download.pytorch.org/whl/cu121
uv pip install "distilabel[vllm,ray,openai]>=1.5.2"
然后运行以下命令:
sbatch slurm/generate.slurm \
--hf-dataset AI-MO/NuminaMath-TIR \
--temperature 0.6 \
--prompt-column problem \
--model deepseek-ai/DeepSeek-R1 \
--hf-output-dataset username/r1-dataset
[!注意] 在作业运行期间,你可以通过集群登录节点设置SSH隧道,以便从你的计算机访问Ray仪表板,运行
ssh -L 8265:ray_ip_head_node:8265 <login_node>,然后访问http://localhost:8265。
八、如何系统学习掌握AI大模型?
AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。
学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。
这里给大家精心整理了一份
全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享!

1. 成长路线图&学习规划
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。

2. 大模型经典PDF书籍
书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。(书籍含电子版PDF)

3. 大模型视频教程
对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识。

4. 2024行业报告
行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

5. 大模型项目实战
学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

6. 大模型面试题
面试不仅是技术的较量,更需要充分的准备。
在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以
微信扫描下方优快云官方认证二维码,免费领取【保证100%免费】


被折叠的 条评论
为什么被折叠?



