delock/deepspeed_finetune_demo
GitHub: delock/deepspeed_finetune_demo
基于 DeepSpeed 的大模型微调演示项目,通过统一代码配合不同配置文件即可快速对比和验证各类分布式训练特性。
Stars: 4 | Forks: 2
# DeepSpeed 微调示例
此微调示例提取并修改自 [DeepSpeedExamples](https://github.com/deepspeedai/DeepSpeedExamples) 中的 [ZenFlow Llama-2 微调示例](https://github.com/deepspeedai/DeepSpeedExamples/tree/master/training/DeepSpeed-ZenFlow/finetuning)。其目的是在同一个地方演示如何使用不同的 DeepSpeed 训练特性并比较它们的性能。
目前在 DeepSpeedExamples 中,每项技术都有一个专门的目录来展示如何使用它。然而,DeepSpeed 的理念是允许用户通过不同的配置文件来使用不同的特性,而无需修改代码。本项目正是为了验证这一说法。
# 如何使用
要运行该示例,只需运行:
```
./finetune.sh
```
例如,如果我们想在 2 个 GPU 上使用 ZeRO offload 运行 Qwen2.5-3B 模型,我们可以运行:
```
./finetune.sh 2 Qwen2.5-3B zo_config.json
```
## 关键参数
| 参数 | 描述 | 默认值 |
|----------|-------------|---------|
| `--batch_size` | 每个 GPU 的训练 batch size | 必填 |
| `--eval_batch_size` | 每个 rank 的评估 batch size | 1 |
| `--eval_steps` | 每运行 N 步进行一次评估(0 表示禁用) | 0 |
| `--max_steps` | N 步后停止(-1 = 完整 epoch) | -1 |
| `--checkpoint_steps` | 每运行 N 步保存一次 checkpoint(0 表示禁用);保留最近 2 个 | 0 |
| `--wandb_name` | Wandb 运行名称(可选) | None |
| `--num_train_epochs` | 训练 epoch 数量 | 1 |
| `--weight_decay` | Weight decay | 0.01 |
| `--warmup` | Warmup 步数 | 0 |
注意:学习率完全由 DeepSpeed 配置 JSON 控制,而不是通过命令行参数控制。
## Batch size
在 DeepSpeed 中,batch size 由配置文件决定。然而,为了避免修改配置文件,这个 Python 脚本接收 `--batch_size` 参数并使用它来决定训练 batch size。如果你需要尝试不同的 batch size,请记住这一点。
## Wandb 支持
可以向 finetune_llama.py 提供一个可选的 `--wandb_name` 来生成 wandb 图表。但是你需要手动修改 `finetune.sh` 来提供此参数。
## 数据集支持
训练脚本会自动检测数据集格式:
- **Alpaca 格式**(默认):具有 `instruction`/`input`/`output` 字段的数据集(例如 `sahil2801/CodeAlpaca-20k`、`tatsu-lab/alpaca`)
- **Magicoder 格式**:具有 `problem`/`solution` 字段的数据集(例如 `ise-uiuc/Magicoder-OSS-Instruct-75K`)
这两种格式都使用 instruction-masked loss(只有回复部分会计入 loss)。
# Moonlight-16B-A3B 与 AutoEP + Muon
本项目支持使用 DeepSpeed AutoEP(自动专家并行)和 Muon 优化器对 [Moonlight-16B-A3B](https://huggingface.co/moonshotai/Moonlight-16B-A3B)(一个拥有 3B 活跃参数的 16B 参数 MoE 模型)进行微调。
## 快速开始 (8x A100 40GB)
```
# 1. Train
deepspeed --num_gpus=8 finetune_llama.py \
--model_name moonshotai/Moonlight-16B-A3B \
--output_dir output_moonlight_muon \
--batch_size 16 --max_length 512 \
--deepspeed_config z2_moonlight_autoep_muon.json \
--dataset_name sahil2801/CodeAlpaca-20k \
--num_train_epochs 1
# 2. 将 DeepSpeed checkpoint 转换为 HuggingFace format
python convert_ds_to_hf.py \
--ds_checkpoint output_moonlight_muon/step_ \
--original_model moonshotai/Moonlight-16B-A3B \
--output_dir hf_model_muon \
--ep_size 8
# 3. 生成 HumanEval completions
python evaluate/humaneval/gen_humaneval.py \
--model hf_model_muon \
--output evalplus_results/muon \
--instruction
# 4. Evaluate
python -m evalplus.evaluate \
--dataset humaneval \
--samples evalplus_results/muon/samples.jsonl
```
## Checkpoint 格式
使用 AutoEP 时,每个 rank 持有不同的 expert shard。训练脚本会将 checkpoint 保存到 `/step_/`:
- `0/model_weights.pt`:完整 state dict(非 expert 参数 + rank 0 的本地 expert)
- `1/model_weights.pt` ... `7/model_weights.pt`:仅包含 expert shard 参数
使用 `convert_ds_to_hf.py` 将所有 shard 合并回标准的 HuggingFace 模型。
## HumanEval 结果
| 模型 | HumanEval (base) | HumanEval+ |
|-------|-----------------|------------|
| Moonlight-16B-A3B (baseline) | 46.3% | 40.2% |
| + Muon fine-tune on CodeAlpaca-20k (1 epoch) | 54.9% | 47.0% |
## AutoEP 配置
AutoEP 配置位于 DeepSpeed JSON 的 `expert_parallel` 内部:
```
{
"expert_parallel": {
"enabled": true,
"autoep_size": 8,
"expert_w1": "gate_proj",
"expert_w2": "down_proj",
"expert_w3": "up_proj",
"route_scale": 2.446,
"load_balance_coeff": null
}
}
```
| 参数 | 描述 |
|-----------|-------------|
| `autoep_size` | 专家并行 rank 数量(通常 = num_gpus) |
| `expert_w1/w2/w3` | HF 模型中 expert 权重投影的名称 |
| `route_scale` | Router 输出缩放因子(应与模型 config 中的 `routed_scaling_factor` 匹配) |
| `load_balance_coeff` | 辅助负载均衡 loss 系数(`null` 表示禁用) |
注意:如果使用 DeepSpeed 的 `gma/autoep-muon-fixes` 分支,`route_scale` 和 expert 组设置可以从 HF 模型 config 中自动填充。
# 基准测试
要运行 benchmark,请运行:
```
./benchmark.sh
```
# 性能分析
要运行 profiling,请运行:
```
./profile.sh
```
# 配置文件
为了方便快速开始,添加了一些配置文件,你也可以修改配置以满足你的需求。
| 配置文件 | 描述 |
|-------------|-------------|
| z2_config.json | 包含 AdamW 的 ZeRO Stage 2 |
| z3_config.json | 包含 AdamW 的 ZeRO Stage 3 |
| zo_config.json | ZeRO Offload,stage 2 |
| z3o_config.json | ZeRO Offload,stage 3 |
| zf_config.json | 包含 ZenFlow 的 ZeRO Offload |
| so_config.json | 包含 SuperOffload 的 ZeRO Offload |
| z2_muon.json | 包含 Muon 优化器的 ZeRO 2 |
| z3_muon.json | 包含 Muon 优化器的 ZeRO 3 |
| tp_config.json | 包含 AutoTP 的 ZeRO 2 |
| z2_moonlight_autoep_muon.json | Moonlight-16B-A3B 与 AutoEP + Muon |
## Muon 优化器配置
Muon 是一个混合优化器:它将 Muon 更新应用于 2D 隐藏层权重,将 Adam 应用于其他所有参数。该配置支持不同的学习率:
```
{
"optimizer": {
"type": "Muon",
"params": {
"muon_lr": 1e-3,
"adam_lr": 2e-5,
"momentum": 0.95,
"betas": [0.9, 0.999],
"eps": 1e-8,
"weight_decay": 0.01
}
}
}
```
| 参数 | 描述 |
|-----------|-------------|
| `muon_lr` | Muon 的学习率(2D 隐藏层权重) |
| `adam_lr` | Adam 的学习率(embeddings、layer norms、lm_head 等) |
| `momentum` | Muon 动量因子 |
| `betas` | Adam betas(用于非 Muon 参数) |
| `eps` | Adam epsilon |
| `weight_decay` | 用于 Muon 和 Adam 参数的 weight decay |
标签:AI, DeepSpeed, 凭据扫描, 分布式训练, 大模型, 模型微调, 自动化代码审查, 逆向工具