Open R1
我们知道DeepSeek-R1离完全真开源有一定距离,只开放了最终的模型权重,整个训练的数据,代码以及过程权重都没有开放。因此网上有很多复刻deepseek-R1的项目,其中Huggingface主导的 open-r1
项目最为活跃与知名,目前已有18.7K星。
1. 项目概述
“
- 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 流水线中缺失的部分,以便每个人都能复现并在此基础上进行开发。项目设计简洁,主要包含以下内容:
2. 计划步骤
将 DeepSeek-R1 的技术报告作为指导,大致可分为三个主要步骤:
-
步骤 1:通过从 DeepSeek-R1 中提炼高质量语料库来复现 R1-Distill 模型。
-
步骤 2:复现 DeepSeek 用于创建 R1-Zero 的纯强化学习(RL)流水线。这可能涉及策划新的大规模数学、推理和代码数据集。
-
步骤 3:展示可以通过多阶段训练从基础模型到 RL 调优的过程。
3. 安装
-
注意事项:依赖 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
4. 训练模型
有监督微调(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大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。