SoFarSoGoodya's picture
DeepMath: LoRA SFT+DPO adapters on DeepSeek-R1-Distill-Qwen-7B
5ef583d verified
|
Raw
History Blame Contribute Delete
4.15 kB
---
license: mit
library_name: peft
pipeline_tag: text-generation
base_model: deepseek-ai/DeepSeek-R1-Distill-Qwen-7B
tags:
- lora
- sft
- dpo
- math
- reasoning
- llama-factory
- deepseek-r1
- qwen
datasets:
- AI-MO/NuminaMath-CoT
language:
- en
- zh
---
# DeepMath (LoRA SFT + DPO on DeepSeek-R1-Distill-Qwen-7B)
> 🇨🇳 [中文简介](#中文) below.
**DeepMath** is a math-reasoning fine-tune of [`deepseek-ai/DeepSeek-R1-Distill-Qwen-7B`](https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B), produced by a **two-stage LoRA pipeline** with **LLaMA-Factory** (template `deepseekr1`):
```
DeepSeek-R1-Distill-Qwen-7B ──SFT (LoRA, NuminaMath-CoT)──► merged ──DPO (LoRA, math prefs)──► DeepMath
```
This repo contains **LoRA adapters**, not a merged model. It was built in a 5-day sprint on rented consumer GPUs (8×5090 for SFT, 1×5090 for DPO) — the full engineering story is in the [GitHub repo](https://github.com/SoFarSoGoodya/DeepMath).
## ⚠️ What's in here & how to use it
There are **two adapters**, applied **in sequence**:
| Path | Role | Size |
|---|---|---|
| `sft_adapter/` | Stage 1 — SFT LoRA (NuminaMath-CoT) | 78 MB |
| `./` (top level) | Stage 2 — DPO LoRA (math preference pairs), the **final** adapter | 77 MB |
The DPO adapter was trained on top of the *SFT-merged* model, so to reconstruct the final model you must apply **SFT first, then DPO**. Use the included `merge.py`:
```bash
pip install transformers peft torch accelerate
python merge.py \
--base deepseek-ai/DeepSeek-R1-Distill-Qwen-7B \
--sft ./sft_adapter \
--dpo ./ \
--out ./DeepMath-merged
```
Or load adapters on the fly (see `merge.py` docstring / the GitHub `examples/inference.py`).
## Training summary (honest)
| Stage | Config | Outcome |
|---|---|---|
| **SFT** | 8×5090, native DDP, LoRA r=8/α=16 (target=all), lr 5e-5, 1 epoch, cutoff 2048, 1,410 steps | loss **0.73 → 0.39** |
| **DPO** | 1×5090, **QLoRA** 4-bit NF4 + double-quant, lr 1e-6, 3 epochs, cutoff 1024, 456 steps | loss **0.6947** (≈ ln 2 baseline), reward acc ~0.5–0.55 |
![SFT loss](sft_training_loss.png)
![DPO reward accuracy](dpo_rewards_accuracies.png)
## Limitations & intended use
- **This is a learning/pipeline-demonstration artifact, not a SOTA model.** SFT converged cleanly; DPO completed without mode collapse but its gain is **modest** (reward accuracy only slightly above the 50% baseline) and **no held-out benchmark was evaluated**.
- Best understood as a reproducible reference for a resource-constrained SFT→DPO pipeline. Don't deploy it expecting strong math-reasoning gains.
- Base model `DeepSeek-R1-Distill-Qwen-7B` inherits its biases/limits; tokenizer derives from Qwen.
## Provenance & license
- **Base**: [`deepseek-ai/DeepSeek-R1-Distill-Qwen-7B`](https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-7B) (MIT).
- **SFT data**: [`AI-MO/NuminaMath-CoT`](https://huggingface.co/datasets/AI-MO/NuminaMath-CoT) (Apache-2.0), cleaned 100k→90,217.
- **DPO data**: 2,418 math preference pairs (distilabel-math-preference style).
- **Adapters + code**: **MIT**. Please retain upstream attributions.
**Author**: [@SoFarSoGoodya](https://github.com/SoFarSoGoodya) — full attribution & contact in the [GitHub repo](https://github.com/SoFarSoGoodya/DeepMath).
---
## 中文
**DeepMath** 是基于 `DeepSeek-R1-Distill-Qwen-7B` 的数学推理微调,用 **LLaMA-Factory****LoRA SFT(NuminaMath)→ 合并 → LoRA DPO(数学偏好对)** 两段式流水线。
本仓库是 **LoRA adapter**(非合并模型)。含两个 adapter,需**按顺序**使用:先 `sft_adapter/`(SFT),再顶层目录(DPO,最终)。用自带的 `merge.py` 一条命令重建完整模型(见上方命令)。
**如实说明**:这是一个学习/流水线演示作品,**不是 SOTA 模型**。SFT 收敛良好;DPO 完整跑通但提升有限(奖励准确率仅略高于随机),且未做独立评测。权重与代码采用 **MIT**;请保留对上游(DeepSeek / Qwen / NuminaMath)的署名。完整工程复盘见 [GitHub 仓库](https://github.com/SoFarSoGoodya/DeepMath)。