Browse Source

Update 'README.md'

天问 1 month ago
parent
commit
55d247541a
1 changed files with 176 additions and 8 deletions
  1. 176 8
      README.md

+ 176 - 8
README.md

@@ -1,42 +1,210 @@
 # open-r1
-huggingface  开源的 DeepSeek-R1 复现
+huggingface  开源的 DeepSeek-R1 复现,代码不多,复现 DeepSeek-R1 的模型训练,基于少量GPU H800 蒸馏 OpenAI 等大模型。
 
 ## Develop
 
 复现步骤:
 
--   第一步:**复现 R1-Distill 模型**:从 DeepSeek-R1 中提取高质量语料库,以此复现 R1-Distill 模型。
+-   第一步:**蒸馏 R1-Distill 小模型**: 蒸馏 Qwen / DeepSeek-R1模型,以此复现 R1-Distill 模型。
 -   第二步:**复现纯 RL 流程**:重现 DeepSeek 创建 R1-Zero 的纯强化学习(RL)流程,这可能需要为数学、推理和代码领域构建新的大规模数据集。
--   第三步:**多阶段训练验证**:展示通过多阶段训练,能将基础模型转化为经过 RL 调整的模型。
+-   第三步:**多阶段训练验证**:通过多阶段训练,能将基础模型转化为经过 RL 调整的模型。
 
 代码结构:
 
 -   **src/open_r1 文件夹**:包含用于训练和评估模型以及生成合成数据的脚本。
 
--   -   `grpo.py`负责运用 GRPO 算法在特定数据集上训练模型;
+-   -   `grpo.py`负责运用 GRPO(分组相对策略优化) 算法在特定数据集上训练模型;
     -   `sft.py`用于执行模型的监督微调(SFT);
     -   `evaluate.py`对模型进行 R1 基准测试评估;
     -   `generate.py`借助 Distilabel 从模型生成合成数据 。
 
-
 开发:
 
+安装依赖,
+
 * linux
 * CUDA 12.1
 * PyTorch v2.5.1
 * vllm
-*
 
 ```
+git clone https://github.com/huggingface/open-r1
+cd open-r1/rl_training  
+pip install -r requirements.txt  
+
+# conda create -n openr1 python=3.11 && conda activate openr1  # 用uv代替conda
 uv venv openr1 --python 3.11 && source openr1/bin/activate && uv pip install --upgrade pip
 
 uv pip install vllm==0.6.6.post1
+uv pip install -e ".[dev]"
 
 # 下载模型
-huggingface-cli loginwandb login
+huggingface-cli login
+wandb login
+
+sudo apt-get install git-lfs
+
+```
+
+
+
+-   **SFT 监督微调阶段**
+
+
+```
+accelerate launch --config_file=configs/zero3.yaml src/open_r1/sft.py \
+    --model_name_or_path Qwen/Qwen2.5-Math-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 4 \
+    --per_device_eval_batch_size 4 \
+    --gradient_accumulation_steps 4 \
+    --gradient_checkpointing \
+    --bf16 \
+    --logging_steps 5 \
+    --eval_strategy steps \
+    --eval_steps 100 \
+    --output_dir data/Qwen2.5-1.5B-Open-R1-Distill
+```
+
+
+
+-   ### **GRPO** 
+
+```
+accelerate launch --config_file configs/zero3.yaml src/open_r1/grpo.py \
+    --output_dir DeepSeek-R1-Distill-Qwen-7B-GRPO \
+    --model_name_or_path deepseek-ai/DeepSeek-R1-Distill-Qwen-7B \
+    --dataset_name AI-MO/NuminaMath-TIR \
+    --max_prompt_length 256 \
+    --per_device_train_batch_size 1 \
+    --gradient_accumulation_steps 16 \
+    --logging_steps 10 \
+    --bf16
+```
+
+
+
+模型评估:
+
+```
+MODEL=deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
+MODEL_ARGS="pretrained=$MODEL,dtype=float16,max_model_length=32768,gpu_memory_utilisation=0.8"
+TASK=aime24
+OUTPUT_DIR=data/evals/$MODEL
+
+lighteval vllm $MODEL_ARGS "custom|$TASK|0|0" \
+    --custom-tasks src/open_r1/evaluate.py \
+    --use-chat-template \
+    --system-prompt="Please reason step by step, and put your final answer within \boxed{}." \
+    --output-dir $OUTPUT_DIR
+ 
+```
+
+
+
+数据生成 generate.py:
+
+```
+from datasets import load_dataset
+from distilabel.models import vLLM
+from distilabel.pipeline import Pipeline
+from distilabel.steps.tasks import TextGeneration
+
+prompt_template = """\
+You will be given a problem. Please reason step by step, and put your final answer within \boxed{}:
+{{ instruction }}"""
+
+dataset = load_dataset("AI-MO/NuminaMath-TIR", split="train").select(range(10))
+
+model_id = "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B"
+
+with Pipeline(
+    name="distill-qwen-7b-r1",
+    description="A pipeline to generate data from a distilled r1 model",
+) 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 is not None else {}
+    )
+
+if __name__ == "__main__":
+    distiset = pipeline.run(dataset=dataset)
+    distiset.push_to_hub(repo_id="username/numina-deepseek-r1-qwen-7b")
+```
+
+
 
 ```
+pip install openr1==0.5.2  
+
+# 运行预训练模型  
+from openr1 import load_model  
+model = load_model("uid/qwen-1.5b-r1-distilled")  
+response = model.generate("用牛顿法求√2 的近似值")  
+print(response.thought_chain)  # 输出完整推理步骤
+```
+
+
+
+数据集:
+
+bespokelabs/Bespoke-Stratos-17k :是Berkeley Sky-T1数据管道的复制品,它使用 DeepSeek-R1 创建问题、推理轨迹和答案的数据集。随后,使用类似于 R1 论文的蒸馏方法,使用这些数据对 7B 和 32B Qwen 模型进行微调。
+
+open-thoughts/OpenThoughts-114k:一个“开放的综合推理数据集,包含 114k 个高质量示例,涵盖数学、科学、代码和谜题”。Open Thoughts 工作的一部分。
+
+perceptioncomputations/dolphin-r1:800k 个样本数据集,包括来自 DeepSeek-R1、Gemini flash 的完成情况和来自 Dolphin chat 的 200k 个样本,目的是帮助训练 R1 风格的模型。
+
+ServiceNow-AI/R1-Distill-SFT:目前有 17,000 个样本,这是 ServiceNow 语言模型实验室为创建数据以支持 Open-R1 工作所做的努力。
+
+NovaSky-AI/Sky-T1_data_17k:用于训练 Sky-T1-32B-Preview 的数据集。该数据集是复制 o1 风格推理的早期努力的一部分。在此数据集上训练的模型的训练成本不到 450 美元。这篇博客文章对此进行了更详细的介绍。
+
+Magpie-Align/Magpie-Reasoning-V2-250K-CoT-Deepseek-R1-Llama-70B:此数据集扩展了Magpie及其生成指令数据的方法,无需启动提示即可在响应中包含推理。指令由 Llama 3.1 70B Instruct 和 Llama 3.3 70B Instruct 生成,响应由 DeepSeek-R1-Distill-Llama-70B 生成
+
+
+
+## **数据生成**
+
+-   ### **从一个小型蒸馏的R1模型生成数据**
+
+1块H100显卡,从deepseek-ai/DeepSeek-R1-Distill-Qwen-7B生成数据
+
+-   **从DeepSeek-R1生成数据**
+
+使用了2个节点,每个节点配备8块H100显卡,从DeepSeek-R1模型生成数据
+
+
+
+## Reference
+
+https://github.com/huggingface/open-r1
+
+https://colab.research.google.com/github/huggingface/open-r1
+
+[deepseek-ai/DeepSeek-R1](https://github.com/deepseek-ai/DeepSeek-R1)
+
+[deepseek-ai/DeepSeek-V2](https://github.com/deepseek-ai/DeepSeek-V2)
 
+[deepseek-ai/DeepSeek-VL2](https://github.com/deepseek-ai/DeepSeek-VL2)
 
+[deepseek-ai/DeepSeek-V3](https://github.com/deepseek-ai/DeepSeek-V3)
 
-https://github.com/huggingface/open-r1