[微调实战 -- 用Open-R1微调Qwen模型,强化AI数学推理能力](微调实战%20--%20用Open-R1微调Qwen模型,强化AI数学推理能力.md)
[[分布式训练策略]]
[[vLLM]]
[[max_seq_length]]
# 🚀 在AutoDL平台上运行Open-R1项目详细教程
Open-R1 是一个旨在完全开源复现 DeepSeek-R1 的项目,目标是构建 DeepSeek-R1 流程中缺失的部分,使每个人都能复制并在其基础上构建。
DeepSeek-R1 是由 DeepSeek 团队开发的一个大型语言模型,旨在提升模型的推理能力。然而,DeepSeek-R1 的训练代码和数据集并未公开。因此,Open-R1 项目致力于重建 DeepSeek-R1 的数据和训练流程,验证其声明,并推动开放推理模型的发展。
Open-R1 项目包括以下主要步骤:[GitHub+2Hugging Face+2Hugging Face+2](https://huggingface.co/blog/open-r1?utm_source=chatgpt.com)
1. **复制 R1-Distill 模型**:通过从 DeepSeek-R1 中提取高质量的推理数据集,重现 R1-Distill 模型。[YouTube+7Hugging Face+7GitHub+7](https://huggingface.co/blog/open-r1?utm_source=chatgpt.com)
2. **复制纯强化学习流程**:重现 DeepSeek 用于创建 R1-Zero 的纯强化学习流程,这可能涉及策划新的大规模数学、推理和代码数据集。[YouTube+6GitHub+6GitHub+6](https://github.com/huggingface/open-r1?utm_source=chatgpt.com)
3. **多阶段训练**:展示如何从基础模型经过监督微调(SFT)和强化学习(RL)进行多阶段训练。[Medium+3GitHub+3Hugging Face+3](https://github.com/huggingface/open-r1?utm_source=chatgpt.com)
通过 Open-R1 项目,研究人员和开发者可以更深入地理解 DeepSeek-R1 的工作原理,并在此基础上进行进一步的研究和开发。该项目的开源性质也促进了社区的参与和贡献,共同推动人工智能领域的进步。
---
| 目的 | 对应步骤 | 具体实现命令 |
| --------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------- |
| ✅ 创建隔离的运行环境 | 一(创建虚拟环境)| `conda create -n openr1 python=3.11 -y` `conda activate openr1` |
| ✅ 安装项目运行的基础依赖 | 一(安装基本工具)| `pip install --upgrade pip setuptools``apt-get update && apt-get install git-lfs -y``git lfs install` |
| ✅ 获取项目源码 | 二(克隆项目)| `git clone https://github.com/huggingface/open-r1.git` |
| ✅ 安装项目特定依赖(确保库版本正确)| 三(依赖安装)| 推荐:`uv pip install vllm==0.7.2 flash-attn --no-build-isolation``uv pip install -e ".[dev]"` |
| ✅ 验证登录以获取模型和记录实验 | 四(Hugging Face 和 WandB 登录)| `huggingface-cli login``wandb login` |
| ✅ 测试项目环境正常运行 | 五(模型推理测试)| `lighteval vllm pretrained=deepseek-ai/... --custom-tasks src/open_r1/evaluate.py` |
| ✅ 执行监督微调训练(SFT)| 六(模型SFT训练)| `accelerate launch --config_file=... src/open_r1/sft.py...` |
| ✅ 执行强化学习训练(GRPO,进阶用法)| 七(模型RL训练)| `accelerate launch --config_file recipes/.../grpo.py --config...` |
| ✅ 评估训练效果(推理性能验证)| 八([[模型评估]])| `lighteval vllm pretrained=... --custom-tasks src/open_r1/evaluate.py` |
| ✅ 合成和生成新的数据集(可选高阶)| 九(数据生成)| `python scripts/generate.py --dataset... --model... --output-dataset...` |
## 📌 配置环境说明
在[[AutoDL]]平台运行的是:
```java
镜像:
- PyTorch 2.5.1
- Python 3.12 (Ubuntu 22.04)
- CUDA 12.4
GPU:
- H20-NVLink (96GB) * 1
CPU:
- 20 vCPU Intel(R) Xeon(R) Platinum 8457C
内存:
- 200GB
硬盘:
- 系统盘: 30GB
- 数据盘: 免费50GB,付费600GB
```
---
## 🟢 一、准备环境与安装基础依赖
### ✅ 解决系统盘空间不足(软链接方式)
```bash
rm -rf ~/.cache
ln -s /root/autodl-tmp ~/.cache
cd ~ && ll # 验证成功标志: .cache -> /root/autodl-tmp/
```
---
### ✅ 创建虚拟环境并激活
```bash
conda create -n openr1_py311 python=3.11 -y
source ~/miniconda3/bin/activate
conda activate openr1_py311
```
---
### ✅ 安装基础依赖
```bash
pip install --upgrade pip setuptools
apt-get update && apt-get install git-lfs -y
git lfs install
```
---
## 🟢 二、获取项目源码
```bash
git clone https://github.com/huggingface/open-r1.git
cd open-r1
```
---
## 🟢 三、安装项目特定依赖
```bash
pip install vllm==0.6.6.post1 --extra-index-url https://download.pytorch.org/whl/cu121
pip install ninja
pip install git+https://github.com/microsoft/DeepSpeed.git@master
pip install -e ".[dev]"
```
---
## 🟢 四、登录 Hugging Face 和 WandB
```bash
huggingface-cli login # 获取token: https://huggingface.co/settings/tokens
wandb login # 获取token: https://wandb.ai/authorize
```
---
## 🟢 五、环境测试与评估
```bash
huggingface-cli download open-r1/OpenR1-Math-220k --repo-type dataset --local-dir ./data/OpenR1-Math-220k
huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B --local-dir ./model_cache
lighteval vllm \
pretrained=deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B,dtype=bfloat16,max_model_length=8192,gpu_memory_utilization=0.6 \
"custom|aime24|0|0" \
--custom-tasks src/open_r1/evaluate.py \
--use-chat-template \
--output-dir data/evals/DeepSeek-R1-Distill-Qwen-1.5B
```
---
## 🟢 六、执行监督微调训练(SFT示例)
**基本命令**:
```bash
## 启动新训练
accelerate launch --config_file=recipes/accelerate_configs/zero2.yaml src/open_r1/sft.py \
--model_name_or_path Qwen/Qwen2.5-1.5B-Instruct \
--dataset_name /root/autodl-tmp/open-r1/data/OpenR1-Math-220k \
--learning_rate 1.0e-5 \
--num_train_epochs 1 \
--packing \
--max_seq_length 2048 \
--per_device_train_batch_size 8 \
--gradient_accumulation_steps 2 \
--gradient_checkpointing \
--fp16 \
--output_dir data/Qwen2.5-1.5B-Open-R1-Distill \
--eval_strategy no
## 从 checkpoint 恢复训练
--resume_from_checkpoint data/Qwen2.5-1.5B-Open-R1-Distill/checkpoint-103500 \
```
如果显存不足,加入:
```bash
--gradient_accumulation_steps 4
```
| | | | |
| --------------------------- | --------------------------------- | ------------------------ | -------------------------------------------------- |
| 名字 | 值 | 通俗解释 | 改为 |
| model_name_or_path | Qwen/Qwen2.5-1.5B-Instruct | 要微调的基础模型名字或路径 | |
| model_revision | main | 模型仓库分支(默认主分支)| |
| torch_dtype | bfloat16 | 模型精度类型,训练更快更省显存 | |
| attn_implementation | flash_attention_2 | 注意力机制实现方式,更快的GPU运算 | |
| dataset_name | open-r1/OpenR1-Math-220k | 用于微调的数据集名称 | |
| dataset_num_proc | 8 | 并发加载数据集时使用的线程数量 | 8 下载东西时候的并发线程数 |
| bf16 | TRUE | 开启bf16格式(更高效的训练格式)| 用fp16,bf16 更适合 H100 的显卡 |
| do_eval | FALSE | 是否进行模型评估(这里不评估)| |
| eval_strategy | no | 评估策略(无评估)| |
| gradient_accumulation_steps | 1 | 梯度累积次数(多少个batch更新一次模型)| 32 |
| gradient_checkpointing | TRUE | 节省显存,用计算换显存 | 可以关掉,速度会更快 |
| use_reentrant | FALSE | 使用更高效的梯度checkpoint方式 | |
| hub_model_id | Qwen2.5-1.5B-Open-R1-Distill | 模型在Hub上发布的名字(如果推送)| |
| hub_strategy | every_save | 上传模型到Hub的频率(每次保存都上传)| |
| learning_rate | 5.00E-05 | 学习率,决定模型参数更新幅度 | |
| log_level | info | 日志记录级别(一般记录)| |
| logging_steps | 5 | 每隔多少步记录一次训练日志 | |
| logging_strategy | steps | 按步数记录日志 | |
| lr_scheduler_type | cosine_with_min_lr | 学习率调度方式(余弦退火,有最低限度)| |
| min_lr_rate | 0.1 | 最终学习率会降到初始学习率的10% | |
| packing | TRUE | 是否将多个短样本合并成长序列,加速训练 | |
| max_length | 16384 | 模型支持的最大token序列长度 | 4096,如果这个数字非常大,意味着模型要一次性处理长度达1万多个token的数据,会消耗巨量显存。|
| max_steps | -1 | 最大训练步数(-1代表不限制,按epoch训练)| |
| num_train_epochs | 1 | 数据集训练的遍数 | |
| output_dir | data/Qwen2.5-1.5B-Open-R1-Distill | 训练模型保存的文件夹 | |
| overwrite_output_dir | TRUE | 如果输出目录存在则覆盖 | |
| per_device_eval_batch_size | 16 | 每个设备(GPU)评估时的批次大小 | |
| per_device_train_batch_size | 16 | 每个设备(GPU)训练时的批次大小 | 8,根据 GPU 显存占用比例调,85%的话算跑满 |
| push_to_hub | TRUE | 是否将模型推送到HuggingFace Hub | FALSE |
| report_to | wandb | 训练指标不上报到任何平台 | "none" |
| save_strategy | "steps" | 模型保存策略,按步数保存 | |
| save_steps | 100 | 每100步保存一次检查点 | |
| save_total_limit | 1 | 最多只保留1个最近的模型检查点 | |
| seed | 42 | 随机种子,确保结果可重复 | |
| use_liger | TRUE | 使用Liger优化库,加快训练 | |
| warmup_ratio | 0.05 | 前5%的训练阶段逐渐升高学习率,避免不稳定 | |
| max_seq_length | | | 2048,修改这个会触发重新 packing |
**训练进度条已经达到100%后,生成了最终微调后的模型**
```Java
- model.safetensors(模型权重文件)
- config.json(模型架构配置)
- tokenizer.json、tokenizer_config.json、vocab.json(分词器相关文件)
- generation_config.json(生成推理的默认参数)
```
![CleanShot 2025-03-25 at
[email protected]|1000](https://imagehosting4picgo.oss-cn-beijing.aliyuncs.com/imagehosting/fix-dir%2Fmedia%2Fmedia_HScb9GxJuV%2F2025%2F03%2F25%2F17-24-53-34b6d6e92937282b6ef10ca405415d25-CleanShot%202025-03-25%20at%2017.23.48-2x-fdad89.png)
**train metrics(训练指标)会显示**:
```Java
***** train metrics *****
total_flos = 463968GF
train_loss = 0.1392
train_runtime = 5:21:43.37
train_samples = 93733
train_samples_per_second = 14.198
train_steps_per_second = 7.099
训练损失(loss)已经稳定,最终为`0.1392`,说明模型已经很好地收敛了。
```
![CleanShot 2025-03-25 at
[email protected]|1500](https://imagehosting4picgo.oss-cn-beijing.aliyuncs.com/imagehosting/fix-dir%2Fmedia%2Fmedia_Sv3gJdYXEX%2F2025%2F03%2F25%2F17-22-27-eb61907a4bd35481284eb78502dbfa89-CleanShot%202025-03-25%20at%2017.22.15-2x-ed8da5.png)
---
## 🟢 七、执行强化学习训练(GRPO示例,进阶用法)
```bash
ACCELERATE_LOG_LEVEL=info accelerate launch --config_file recipes/accelerate_configs/zero2.yaml \
--num_processes=7 src/open_r1/grpo.py \
--config recipes/Qwen2.5-Math-7B/grpo/config_simple_rl.yaml
```
- 推荐显存 ≥ 40GB,A100、H100 等更佳。
---
# 训练后
- **评估模型**:
使用脚本如`evaluate.py`,运行对应的评估benchmark(如MATH-500或AIME-2024),确认模型性能。
- **保存和上传模型**(可选):
```shell
huggingface-cli login
huggingface-cli repo create your-model-name
git add .
git commit -m "helloworld"
git push
```
- **模型推理和生成数据**:
使用训练好的模型进行推理,验证模型效果,或用模型生成新的数据。
## 🟢 八、评估训练效果(推理性能验证)
[模型评估](模型评估.md)
```bash
MODEL=data/Qwen2.5-1.5B-Open-R1-Distill
MODEL_ARGS="pretrained=$MODEL,dtype=bfloat16,max_model_length=32768,gpu_memory_utilization=0.8"
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
MODEL=data/Qwen2.5-1.5B-Open-R1-Distill
MODEL_ARGS="pretrained=$MODEL,dtype=fp16,max_model_length=8192,gpu_memory_utilization=0.5"
OUTPUT_DIR=data/evals/Qwen2.5-1.5B-eval
lighteval vllm $MODEL_ARGS "custom|math_500|0|0" \
--custom-tasks src/open_r1/evaluate.py \
--use-chat-template \
--output-dir $OUTPUT_DIR
类似的方式,你也可以评估:
• math_500:数学推理任务
• gpqa:diamond :常识推理任务
• lcb:codegeneration:代码生成任务
```
---
## 🟢 九、合成与生成新数据集(高级用法)
```bash
uv pip install "distilabel[vllm]>=1.5.2"
python scripts/generate.py \
--dataset AI-MO/NuminaMath-TIR \
--prompt-column problem \
--model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B \
--temperature 0.6 \
--output-dataset your-username/generated-r1-dataset
```
---
## 🚨 常见问题排查(针对出现的SIGFPE错误)
**快速解决步骤:**
- 将启动命令中的`--bf16`改为`--fp16`。
- DeepSpeed配置中关闭CPU offload(`offload_optimizer_device: none`)。
- 降低学习率到`5e-6`。
修正后的DeepSpeed配置示例:
```yaml
compute_environment: LOCAL_MACHINE
deepspeed_config:
gradient_accumulation_steps: 4
gradient_clipping: 1.0
offload_optimizer_device: none
offload_param_device: none
zero3_init_flag: true
zero_stage: 3
distributed_type: DEEPSPEED
downcast_bf16: 'no'
machine_rank: 0
num_machines: 1
num_processes: 1
rdzv_backend: static
use_cpu: false
```
---
完成以上步骤后,你将顺畅且稳定地在AutoDL平台运行和扩展Open-R1项目。
希望本次整理的教程能帮助你高效开展后续的研究与开发工作!🚀✨
---
---
## 在AutoDL平台上运行
下面我以详细的步骤教你如何在AutoDL平台上成功运行你提到的这个开源项目(**huggingface/open-r1**):
以上步骤确保你能完整、顺畅地在 AutoDL 平台运行和扩展 Open-R1 项目,理解其核心技术,并为进一步的研究和开发奠定坚实基础。
### 🟢 一、准备环境与安装基础依赖
在AutoDL中,首先进入你的服务器(使用带有 GPU 环境,如A100、H100、RTX3090 等高显存机器更好)。
#### 软连接
彻底解决了因系统盘空间不足导致无法下载大模型的问题
| 步骤 | 操作 | 命令示例 | 作用 |
| --- | ------ | ----------------------------------------------- | ------------ |
| ① | 删除原有缓存 | `rm -rf ~/.cache` | 删除占满系统盘的缓存文件 |
| ② | 建立软链接 | `ln -s /root/autodl-tmp ~/.cache` | 将缓存目录指向数据盘 |
| ③ | 验证链接 | `cd ~ && ll` | 检查软链接是否建立成功 |
| ④ | 开始训练 | `xtuner train internlm_20b_qlora_oasst1_512_e3` | 启动训练任务 |
验证成功的标志:
```Java
.cache -> /root/autodl-tmp/
```
#### 1. 创建虚拟环境并激活
```bash
conda create -n openr1_py311 python=3.11 -y
source ~/miniconda3/bin/activate
conda activate openr1_py311
```
#### 2. 安装基本工具与依赖
```bash
pip install --upgrade pip setuptools
```
安装 Git LFS (用于下载大模型权重):
```bash
apt-get update && apt-get install git-lfs -y
git lfs install
```
---
### 🟢 二、克隆项目到本地
```bash
git clone https://github.com/huggingface/open-r1.git
cd open-r1
```
---
### 🟢 三、安装项目依赖
```bash
pip install vllm==0.6.6.post1 --extra-index-url https://download.pytorch.org/whl/cu121
pip install ninja
pip install git+https://github.com/microsoft/DeepSpeed.git@master
pip install -e ".[dev]"
```
此过程会自动安装PyTorch 2.5.1、Accelerate、transformers 等重要库。
---
### 🟢 四、登录 Hugging Face 和 WandB(权重管理和训练监控)
登录 Hugging Face:
```bash
huggingface-cli login
```
(访问 [https://huggingface.co/settings/tokens](https://huggingface.co/settings/tokens) 获取token)
登录 Weights & Biases:
```bash
wandb login
```
(访问 [https://wandb.ai/authorize](https://wandb.ai/authorize) 获取token)
---
### 🟢 五、测试项目是否正常运行(可选但推荐)
执行一次简单的评测,确保环境正常运行,例如:
```bash
# 自己手动下载模型和数据
huggingface-cli download open-r1/OpenR1-Math-220k --repo-type dataset --local-dir ./data/OpenR1-Math-220k
huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B --local-dir ./model_cache
lighteval vllm \
pretrained=deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B,dtype=bfloat16,max_model_length=8192,gpu_memory_utilization=0.6 \
"custom|aime24|0|0" \
--custom-tasks src/open_r1/evaluate.py \
--use-chat-template \
--output-dir data/evals/DeepSeek-R1-Distill-Qwen-1.5B
```
这一步若成功则说明环境配置正确,模型下载和加载没有问题。
---
### 🟢 六、运行模型训练(SFT示例)
示例:在`open-r1/OpenR1-Math-220k`数据集上运行SFT(监督微调)训练:
```bash
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 /root/autodl-tmp/open-r1/data/OpenR1-Math-220k \
--learning_rate 1.0e-5 \
--num_train_epochs 1 \
--packing \
--max_seq_length 4096 \
--per_device_train_batch_size 2 \
--gradient_checkpointing \
--bf16 \
--output_dir data/Qwen2.5-1.5B-Open-R1-Distill
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 /root/autodl-tmp/open-r1/data/OpenR1-Math-220k \
--learning_rate 1.0e-5 \
--num_train_epochs 1 \
--packing \
--max_seq_length 8192 \
--per_device_train_batch_size 8 \
--gradient_checkpointing \
--bf16 \
--output_dir data/Qwen2.5-1.5B-Open-R1-Distill
accelerate launch --config_file=recipes/accelerate_configs/zero3.yaml src/open_r1/sft.py \
--model_name_or_path /root/autodl-tmp/Qwen2.5-1.5B-Instruct \
--dataset_name /root/autodl-tmp/open-r1/data/OpenR1-Math-220k \
--learning_rate 1.0e-5 \
--num_train_epochs 1 \
--packing \
--max_seq_length 8192 \
--per_device_train_batch_size 8 \
--gradient_accumulation_steps 2 \
--gradient_checkpointing \
--bf16 \
--output_dir data/Qwen2.5-1.5B-Open-R1-Distill
```
- 你可能需要根据GPU显存情况调整`per_device_train_batch_size`(一般设置为4、8或16)。
- 如果GPU显存不足,建议增加`--gradient_accumulation_steps`参数,如:
```bash
--per_device_train_batch_size 4
--gradient_accumulation_steps 4
```
*针对 1卡 RTX 4090
```bash
cd ~/autodl-tmp/projects/open-r1
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
accelerate launch --config_file=recipes/accelerate_configs/zero3.yaml src/open_r1/sft.py \
--model_name_or_path /root/autodl-tmp/Qwen2.5-1.5B-Instruct \
--dataset_name /root/autodl-tmp/projects/open-r1/data/OpenR1-Math-220k \
--learning_rate 1.0e-5 \
--num_train_epochs 1 \
--packing \
--max_seq_length 2048 \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 8 \
--gradient_checkpointing \
--bf16 \
--output_dir data/Qwen2.5-1.5B-Open-R1-Distill
```
**参数调整原因:**
- 改用`zero2`配置降低单卡负载。
- 调整`max_seq_length=8192`,缓解显存占用。
- 增加`gradient_accumulation_steps=8`,可保证更高的等效batch。
[[OutOfMemoryError]]
```Java
torch.OutOfMemoryError: CUDA out of memory.
- 模型(Qwen2.5-1.5B)本身虽然不算特别大,但你当前的训练配置中设置了:
- `--per_device_train_batch_size 8` (每个设备的批次大小)
- `--max_seq_length 16384` (序列长度达到16384 token,非常长)
这两个因素同时作用,导致显存使用远远超过你的GPU(RTX 4090,24GB)的容量,从而训练启动后直接显存溢出。
```
| 步骤 | 操作内容 | 说明 | 耗时 |
| ---------------- | --------------------------- | ------------------------------- | ----------------- |
| 1. 环境初始化 | 自动探测并设置DeepSpeed的CUDA加速器 | 设置ds_accelerator至cuda,初始化NCCL后端 | 几秒 |
| 2. 数据集处理 | 解析数据文件 | 读取本地数据集`OpenR1-Math-220k` | 几秒 |
| | 生成训练数据集 (train split) | 共处理93,733条训练样本 | 约12秒 |
| 3. 模型初始化 | 加载模型`Qwen2.5-1.5B-Instruct` | 模型参数共约17.8亿个元素 | 几秒 |
| | 加载checkpoint权重 | 完成checkpoint文件加载 | 约1秒 |
| 4. 数据预处理 | 转换数据为ChatML格式 | 将数据转化为模型训练的ChatML输入格式 | 约21秒 |
| | 应用聊天模板到数据集 | 应用chat template到训练数据 | 约28秒 |
| 5. Tokenization | 数据集Tokenization(分词)| 对93,733条数据进行tokenize | 约18分钟 |
| 6. 数据[[Packing]] | 数据打包操作(packing)| 提升训练效率,高效打包tokenized后的数据 | 约37分钟 |
| 7. DeepSpeed参数 | 参数offload | 确定参数的offload策略,提高GPU内存使用效率 | 几秒 |
| 8. WandB 初始化 | 启动Weights & Biases服务 | 提供3种方式供用户选择(创建账号/使用账号/不进行可视化)| 等待用户输入(此处你选择创建账号)|
以上步骤完成后,你选择了“创建一个新的 WandB 账号”并开始了后续的登录和使用操作。
---
### 🟢 七、运行RL训练(GRPO示例,可选进阶)
```bash
ACCELERATE_LOG_LEVEL=info accelerate launch --config_file recipes/accelerate_configs/zero2.yaml \
--num_processes=7 src/open_r1/grpo.py \
--config recipes/Qwen2.5-Math-7B/grpo/config_simple_rl.yaml
```
注意:
- GRPO训练涉及到更多资源,需要至少2-8张高性能GPU。
- 推荐显存 ≥ 40GB(例如A100、H100)确保稳定训练。
---
### 🟢 八、评估已训练好的模型(评测推理阶段)
例如,运行 MATH-500 评估:
```bash
MODEL=deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
MODEL_ARGS="pretrained=$MODEL,dtype=bfloat16,max_model_length=32768,gpu_memory_utilization=0.8"
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
```
---
### 🟢 九、运行数据生成(合成新数据集,可选高级用法)
以小模型为例生成数据:
```bash
uv pip install "distilabel[vllm]>=1.5.2"
python scripts/generate.py \
--dataset AI-MO/NuminaMath-TIR \
--prompt-column problem \
--model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B \
--temperature 0.6 \
--output-dataset your-username/generated-r1-dataset
```
生成数据集后可上传到Hugging Face以便后续使用。
---
### 🚨 常见问题排查与注意事项
- 如果出现 **CUDA Segmentation Fault**,请确认CUDA版本为12.4:
```bash
nvcc --version
```
- 显存不够时尝试:
- 降低batch size
- 增加`gradient_accumulation_steps`
- 开启`gradient_checkpointing`
- 确认网络正常(AutoDL机器下载模型时可能较慢),建议使用镜像加速或者提前手动下载模型权重。
---
### 🎯 总结(核心命令速查)
| 动作 | 核心命令 |
| ------ | ------------------------------------------ |
| 创建环境 | `conda create -n openr1 python=3.11` |
| 激活环境 | `conda activate openr1` |
| 安装依赖 | `uv pip install -e ".[dev]"` |
| SFT训练 | `accelerate launch... src/open_r1/sft.py` |
| GRPO训练 | `accelerate launch... src/open_r1/grpo.py` |
| 模型评估 | `lighteval vllm pretrained=...` |
---
## AutoDI系统盘数文件移到数据盘(详细教程)
### 📌 你的整体思路分析
你当前遇到的问题是:
- AutoDL平台的**系统盘空间较小且无法扩容**;
- 模型文件默认下载到系统盘的缓存目录(`~/.cache`)导致空间不足;
- 数据盘(`/root/autodl-tmp`)空间大且可用。
你给出的解决方案是:
**『将默认的缓存目录 `~/.cache` 转移到数据盘,通过软链接形式将数据盘与系统盘目录关联』**
---
### 🔗 具体实现步骤(已完善)
| 步骤 | 操作 | 命令示例 | 作用 |
| --- | ------ | ----------------------------------------------- | ------------ |
| ① | 删除原有缓存 | `rm -rf ~/.cache` | 删除占满系统盘的缓存文件 |
| ② | 建立软链接 | `ln -s /root/autodl-tmp ~/.cache` | 将缓存目录指向数据盘 |
| ③ | 验证链接 | `cd ~ && ll` | 检查软链接是否建立成功 |
| ④ | 开始训练 | `xtuner train internlm_20b_qlora_oasst1_512_e3` | 启动训练任务 |
验证成功的标志:
```Java
.cache -> /root/autodl-tmp/
```
---
### 🚩 该方案的优势
- **长期有效**:彻底解决了因系统盘空间不足导致无法下载大模型的问题;
- **简单易行**:不需要复杂操作,命令简单易懂;
- **灵活可扩展**:今后下载的模型自动存储到数据盘,再大文件也不用担心。
---
### ⚠️ 但注意几个细节
1. **数据安全性**:
- 确认`/root/autodl-tmp`目录不是临时目录(AutoDL一般会保留该目录数据直至实例释放)。
2. **权限与路径**:
- 执行软链接时确保以root用户执行命令。
3. **原目录文件备份**:
- 若原缓存目录下有重要文件,建议先备份至数据盘再执行删除。
---
### 🚨 可能的问题排查
| 可能问题 | 解决方案 |
| ---- | ---- |
| 建立软 | |
你遇到的这个错误:
yaml
CopyEdit
`exitcode: -8 (pid: 2116) traceback: Signal 8 (SIGFPE) received by PID 2116`
表示程序触发了浮点运算错误(Floating Point Exception,SIGFPE)。
在深度学习模型训练中,这通常由以下情况导致:
---
## 🚩 一、问题的可能原因
- **数值异常**:
- 出现了 NaN 或者 Inf,特别在启用 `bf16` 或者较激进的优化器配置时,可能导致数值不稳定。
- 计算loss过程中出现了数值溢出(overflow)或除零操作。
- **DeepSpeed 或 PyTorch 本身的兼容性问题**:
- 使用`bf16`训练时,某些计算可能出现不兼容或bug。
- CPU offload 和 DeepSpeed ZeRO3 结合,可能存在稳定性问题。
- **梯度裁剪未生效**:
- 如果`gradient_clipping`参数未正确生效,可能会导致数值异常。
---
## 🚩 二、针对你当前的情况快速解决方案
建议你逐步做以下调整:
### ✅ 第一步(最关键,先尝试此步)
#### **改用fp16而非bf16** (bf16偶尔可能引发兼容性问题)
将启动命令中的`--bf16`替换为:
bash
CopyEdit
`--fp16`
> **注意:**fp16在NVIDIA A100 GPU上高度稳定,尤其当bf16出现问题时fp16通常更稳妥。
### 修复后启动命令示例
bash
CopyEdit
`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 /root/autodl-tmp/open-r1/data/OpenR1-Math-220k \ --learning_rate 1.0e-5 \ --num_train_epochs 1 \ --packing \ --max_seq_length 4096 \ --per_device_train_batch_size 2 \ --gradient_checkpointing \ --fp16 \ --output_dir data/Qwen2.5-1.5B-Open-R1-Distill`
---
### ✅ 第二步(如果上述未解决,继续尝试此步)
#### **调整 DeepSpeed 配置以确保稳定性**
修改你的`zero3.yaml`为:
yaml
CopyEdit
`compute_environment: LOCAL_MACHINE deepspeed_config: gradient_accumulation_steps: 4 gradient_clipping: 1.0 offload_optimizer_device: none offload_param_device: none zero3_init_flag: true zero_stage: 3 distributed_type: DEEPSPEED downcast_bf16: 'no' machine_rank: 0 num_machines: 1 num_processes: 1 rdzv_backend: static use_cpu: false`
> 去掉 CPU offload,完全在GPU上执行,有时能解决由DeepSpeed CPU offload导致的SIGFPE问题。
---
### 🚨 **额外检查与预防措施**
1. **数值稳定性检查**:
训练前或训练初期加一段代码检查loss值,如果出现NaN或inf立刻停止并降低学习率或调整优化器。
2. **学习率降低**:
若还出现数值异常,尝试将`learning_rate`降低为`5e-6`甚至`1e-6`:
bash
CopyEdit
`--learning_rate 5.0e-6`
3. **重启环境**:
有时环境异常(特别是GPU进程异常)可能导致这个问题,可以尝试重启Jupyter kernel或直接重启容器。
---
## ⏳ **预期效果与训练时长**
- 上述改用fp16后,对训练速度无负面影响(甚至略有提升)。
- 显存占用与bf16接近或略有减少,仍然稳定在30-50GB之间。
- 预计训练时长保持不变 (约3小时