409 lines
10 KiB
Markdown
409 lines
10 KiB
Markdown
# LLM微调实验完整记录2 - 从8B到云端的进化
|
||
|
||
## 📅 2025年8月22日 - 征服8B模型与云端加速
|
||
|
||
### 第一阶段:分析1.5B问题,决定升级8B(00: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被租完
|
||
- **最终选择**:4090D(1.88元/小时)
|
||
|
||
**镜像选择**:
|
||
- 社区镜像:LLaMA Factory v2(4月1日版)
|
||
- PyTorch 2.1.0 + CUDA 12.1
|
||
|
||
#### 9. 环境配置踩坑
|
||
|
||
**踩坑1:找不到LLaMA Factory**
|
||
```bash
|
||
find / -name "llamafactory*" 2>/dev/null
|
||
# 找到:/root/LLaMA-Factory
|
||
```
|
||
|
||
**踩坑2:Transformers版本地狱**
|
||
```
|
||
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
|
||
```
|
||
|
||
**训练速度对比**:
|
||
- 本地3070Ti:15-50秒/iteration
|
||
- AutoDL 4090D:0.85秒/iteration(快60倍!)
|
||
- **15分钟完成30个epoch**
|
||
|
||
**结果**:
|
||
```
|
||
train_loss = 0.39(和本地一样好)
|
||
```
|
||
|
||
#### 12. DPO训练问题排查
|
||
|
||
**问题1:0秒训练**
|
||
```
|
||
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
|
||
|
||
**问题2:DPO效果差**
|
||
- 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.51,LLaMA 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元 + 时间成本
|
||
- AutoDL:1.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.记得使用虚拟环境,检查版本,不要卡在环境布置上 |