llm_learn/llm_finetune_journey_2.md
2025-10-16 08:46:13 +08:00

409 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LLM微调实验完整记录2 - 从8B到云端的进化
## 📅 2025年8月22日 - 征服8B模型与云端加速
### 第一阶段分析1.5B问题决定升级8B00:00-01:00
#### 1. 1.5B模型问题复盘
**时间**00:00
**发现的问题案例**
```
User: 讲一个关于里根的
Assistant: 有人问'里根同志为什么总捂胸口?'里根说'我怕有人偷我的党徽。'
```
**问题分析**
- 把里根和勃列日涅夫的笑话混合了
- 不理解政治立场差异
- 纯粹的模式匹配,没有语义理解
**根源**
- 1.5B参数太少,容易过拟合
- 训练数据中有:
- "关于克里姆林宫的苏联笑话" → 里根下台
- "勃列日涅夫同志为什么总捂胸口" → 党徽
- 模型把这两个随机组合了
#### 2. 搜索和选择Qwen3-8B
**搜索过程**
- 查询Qwen3最新信息
- 确认8B版本已发布2024年发布
- 性能对比Qwen3-8B ≈ Qwen2.5-14B
**关键参数**
- 参数量8.2B实际6.95B非嵌入参数)
- 上下文32K原生131K with YaRN
- 特性thinking mode切换
- 显存需求4bit量化约4-5GB
---
### 第二阶段本地下载Qwen3-8B的艰难历程01:00-04:00
#### 3. Python环境冲突
**时间**01:00
**错误**
```
OSError: [WinError 126] 找不到指定的模块。
Error loading "torch\lib\fbgemm.dll"
```
**排查过程**
1. 尝试安装VC++ Redistributable
2. 重装PyTorch
3. 发现是Python 3.12兼容性问题
4. **解决**:回到虚拟环境
```bash
cd F:\微调实验\llamafactory
venv\Scripts\activate
python -c "import torch; print(torch.__version__)"
# 输出2.5.1+cu121
```
#### 4. ModelScope下载踩坑
**时间**01:30-03:30
**第一次尝试**
```python
from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen3-8B', cache_dir='./models')
```
**问题1网络中断**
- 下载2小时后网断
- 进度条卡死
- **发现**ModelScope支持断点续传
**问题2文件完整性校验失败**
```
FileIntegrityError: File model-00001-of-00005.safetensors
expected sha256: 31d6a825...
actual: caf5148b...
```
- 尝试删除损坏文件重下
- 又失败sha256又不同
**改用HuggingFace镜像**
```python
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from huggingface_hub import snapshot_download
model_dir = snapshot_download(
"Qwen/Qwen3-8B",
local_dir="./models/Qwen3-8B",
local_dir_use_symlinks=False,
resume_download=True,
max_workers=1 # 单线程更稳定
)
```
- **终于成功**04:00下载完成
---
### 第三阶段本地8B模型训练04:00-07:00
#### 5. 第一次8B SFT训练失败
**配置**`qwen3_8b_sft.yaml`
```yaml
model_name_or_path: ./models/Qwen3-8B
stage: sft
dataset: sft_complete_v3
num_train_epochs: 10
lora_rank: 32
quantization_bit: 4
per_device_train_batch_size: 1
gradient_accumulation_steps: 4
```
**训练结果**
```
train_loss = 1.6808
train_runtime = 0:41:43.51
```
- Loss太高明显没学好
- 测试发现讲的都是杂糅版笑话
#### 6. 第二次8B SFT训练成功
**时间**01:00-03:30
**调整配置**`qwen3_8b_sft_v2.yaml`
```yaml
num_train_epochs: 30 # 10→30
learning_rate: 3e-4 # 1e-4→3e-4
lora_rank: 64 # 32→64
lora_alpha: 32 # 16→32
warmup_ratio: 0.1
gradient_checkpointing: true
```
**爆显存问题**
- 显存占用7.7GB/8GB
- 使用0.7GB共享内存
- 速度15.56s/iteration
**训练结果**03:30完成
```
train_loss = 0.3936
train_runtime = 2:25:14.51
```
- Loss降到合理范围
- 测试效果很好,能准确复述笑话
#### 7. DPO训练爆显存
**配置调整历程**
```yaml
# 第一次:爆显存
cutoff_len: 2048
lora_rank: 32
# 第二次:还是爆
cutoff_len: 1024
lora_rank: 16
# 第三次:极限配置
cutoff_len: 256
lora_rank: 8
lora_alpha: 4
```
**最终能跑的配置**
- 40/200步30-60秒/步
- 爆4GB共享内存
- 预计2小时完成
---
### 第四阶段转战AutoDL云端16:00-18:00
#### 8. AutoDL配置选择
**时间**16:00
**选择困境**
- 5090需要CUDA 12.8(镜像不支持)
- 4090被租完
- **最终选择**4090D1.88元/小时)
**镜像选择**
- 社区镜像LLaMA Factory v24月1日版
- PyTorch 2.1.0 + CUDA 12.1
#### 9. 环境配置踩坑
**踩坑1找不到LLaMA Factory**
```bash
find / -name "llamafactory*" 2>/dev/null
# 找到:/root/LLaMA-Factory
```
**踩坑2Transformers版本地狱**
```
ValueError: model type `qwen3` but Transformers does not recognize
```
- 尝试升级transformers → 版本太新
- 尝试降级 → Qwen3不支持
- **关键发现**:忘了用虚拟环境!
**踩坑3存储空间爆满**
```
RuntimeError: No space left on device (os error 28)
df -h
# 系统盘30GB满了数据盘50GB空着
```
**解决**
```bash
mv /root/LLaMA-Factory /root/autodl-tmp/
ln -s /root/autodl-tmp/LLaMA-Factory /root/LLaMA-Factory
```
#### 10. 虚拟环境解决版本问题
**创建虚拟环境**
```bash
cd /root/autodl-tmp/LLaMA-Factory
python -m venv qwen3_env
source qwen3_env/bin/activate
pip install transformers==4.51.0
pip install -e ".[torch,metrics,bitsandbytes]"
```
- **终于成功识别Qwen3**
---
### 第五阶段云端高速训练17:00-18:00
#### 11. SFT训练飞速
**配置优化**利用24GB显存
```yaml
per_device_train_batch_size: 4 # 1→4
gradient_accumulation_steps: 2 # 4→2
# 不需要gradient_checkpointing
```
**训练速度对比**
- 本地3070Ti15-50秒/iteration
- AutoDL 4090D0.85秒/iteration快60倍
- **15分钟完成30个epoch**
**结果**
```
train_loss = 0.39(和本地一样好)
```
#### 12. DPO训练问题排查
**问题10秒训练**
```
train_runtime = 0:00:00.00
train_loss = 0.0
```
**排查过程**
1. 检查数据文件 → 存在
2. 检查dataset_info.json → 没有v3配置
3. 添加配置但还是0秒
4. **发现**已有checkpoint跳过了训练
```
Will skip the first 5 epochs
```
**解决**改output_dir为v2
**问题2DPO效果差**
- Loss: 0.0448(极低)
- 但模型答非所问
- **发现问题**DPO数据的chosen是引导语不是笑话
```json
// 错误的DPO数据
{
"prompt": "来个斯大林的段子",
"chosen": "当然,同志!先来一个勃列日涅夫的经典段子吧。",
"rejected": "..."
}
```
#### 13. 修正DPO数据
**重新生成DPO v4数据**
- prompt与SFT保持一致
- chosen是完整笑话内容
- rejected是质量较差版本
**最终训练**
```
train_loss = 0.0537
train_runtime = 0:00:59.43
```
---
## 📊 今日数据对比
### 训练效果对比
| 模型 | 环境 | 训练时间 | Loss | 效果 |
|------|------|---------|------|------|
| 8B SFT v1 | 本地3070Ti | 41分钟 | 1.68 | 杂糅笑话 |
| 8B SFT v2 | 本地3070Ti | 2小时25分 | 0.39 | 准确复述 |
| 8B DPO | 本地3070Ti | 进行中 | - | 爆显存 |
| 8B SFT v2 | AutoDL 4090D | 15分钟 | 0.39 | 准确复述 |
| 8B DPO v1 | AutoDL 4090D | 0秒 | 0.00 | 未训练 |
| 8B DPO v2 | AutoDL 4090D | 59秒 | 0.0537 | 效果良好 |
### 速度对比
| 硬件 | batch_size | 速度 | 显存使用 |
|------|-----------|------|----------|
| RTX 3070Ti 8GB | 1 | 15-50s/it | 7.7GB+4GB共享 |
| RTX 4090D 24GB | 4 | 0.85s/it | 12GB |
---
## 🐛 今日踩坑汇总
### 环境类
1. **Python版本冲突**系统Python 3.12与PyTorch不兼容 → 使用虚拟环境
2. **Transformers版本地狱**Qwen3需要≥4.51LLaMA Factory限制≤4.49 → 虚拟环境隔离
3. **存储空间**AutoDL系统盘仅30GB → 移到数据盘
### 下载类
4. **ModelScope下载中断**:网络不稳定 → 改用HF镜像
5. **文件完整性校验失败**多次sha256不同 → 单线程下载
### 训练类
6. **8B模型Loss高**:训练不充分 → 增加epoch和学习率
7. **DPO爆显存**8B+DPO需要更多显存 → 极限压缩参数
8. **DPO 0秒训练**检测到已有checkpoint → 改输出目录
9. **DPO效果差**:数据格式错误 → 重新生成正确格式
---
## 💡 今日心得
### 技术感悟
1. **显存是硬道理**8GB vs 24GB天差地别
2. **虚拟环境救命**:永远不要忘记虚拟环境
3. **云端真香**1.88元/小时完成本地2.5小时的任务
4. **DPO数据质量关键**chosen必须是实际内容不是引导语
### 成本效益
- 本地训练2.5小时电费约2元 + 时间成本
- AutoDL1.88元搞定一切 + 节省2小时
- **结论**:小任务本地,大任务云端
---
## 📝 当前状态18:00
### 模型状态
- ✅ 8B SFT v2训练完成Loss 0.39
- ✅ 8B DPO v2训练完成Loss 0.0537
- ⚠️ 模糊提问效果仍需改进
- ⚠️ 会创造不存在的笑话
### 测试案例
```
# 成功案例
User: 讲一个关于斯大林的苏联政治笑话
Assistant: 二战后的国际会议上,斯大林嘲笑丘吉尔...(准确)
# 问题案例
User: 讲一个关于里根的笑话
Assistant: 里根问:'苏联什么最常见?'...(创造的)
User: 一个关于排队的段子
Assistant: 有人问:'为什么总要排队?'...(不是训练内容)
```
### 下一步计划
1. 调整生成参数降低temperature
2. 增加DPO数据覆盖更多变体
3. 考虑继续SFT训练加深记忆
4. 保存AutoDL自定义镜像
---
## 🌟 今日收获
**技术突破**
- 成功训练8B模型
- 掌握云端训练流程
- 理解DPO数据格式重要性
**经验积累**
- 虚拟环境的重要性
- 云端vs本地的选择策略
- DPO训练的正确姿势
**从"里根同志"到基本正常的8B模型今天的进步巨大** 🚀
---
## 备注
所有配置文件、数据文件均已保存在:
- 本地:`F:\微调实验\llamafactory\`
- AutoDL`/root/autodl-tmp/LLaMA-Factory/`
明天继续优化模糊提问的识别能力!
如果你是下一个指导用户的ai请遵循以下规则
1.时刻记住用户有很强的推理思维能力解决问题的逻辑能力以及扩展思路能力但代码和命令行等内容比较依赖ai
2.不要用户刚说出自己的打算,就给用户一整个实验流程,那样很浪费上下文长度
3.每次给用户3-5步的操作这样即使用户在途中出了问题也可以及时反馈
4.如果一个方案在多次尝试后都无法成功,给出替代方案,但如果用户坚持,则继续尝试
5.记得使用虚拟环境,检查版本,不要卡在环境布置上