10 KiB
10 KiB
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"
排查过程:
- 尝试安装VC++ Redistributable
- 重装PyTorch
- 发现是Python 3.12兼容性问题
- 解决:回到虚拟环境
cd F:\微调实验\llamafactory
venv\Scripts\activate
python -c "import torch; print(torch.__version__)"
# 输出:2.5.1+cu121
4. ModelScope下载踩坑
时间:01:30-03:30
第一次尝试:
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镜像:
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
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
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训练爆显存
配置调整历程:
# 第一次:爆显存
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
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空着
解决:
mv /root/LLaMA-Factory /root/autodl-tmp/
ln -s /root/autodl-tmp/LLaMA-Factory /root/LLaMA-Factory
10. 虚拟环境解决版本问题
创建虚拟环境:
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显存):
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
排查过程:
- 检查数据文件 → 存在
- 检查dataset_info.json → 没有v3配置!
- 添加配置但还是0秒
- 发现:已有checkpoint,跳过了训练
Will skip the first 5 epochs
解决:改output_dir为v2
问题2:DPO效果差
- Loss: 0.0448(极低)
- 但模型答非所问
- 发现问题:DPO数据的chosen是引导语不是笑话!
// 错误的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 |
🐛 今日踩坑汇总
环境类
- Python版本冲突:系统Python 3.12与PyTorch不兼容 → 使用虚拟环境
- Transformers版本地狱:Qwen3需要≥4.51,LLaMA Factory限制≤4.49 → 虚拟环境隔离
- 存储空间:AutoDL系统盘仅30GB → 移到数据盘
下载类
- ModelScope下载中断:网络不稳定 → 改用HF镜像
- 文件完整性校验失败:多次sha256不同 → 单线程下载
训练类
- 8B模型Loss高:训练不充分 → 增加epoch和学习率
- DPO爆显存:8B+DPO需要更多显存 → 极限压缩参数
- DPO 0秒训练:检测到已有checkpoint → 改输出目录
- DPO效果差:数据格式错误 → 重新生成正确格式
💡 今日心得
技术感悟
- 显存是硬道理:8GB vs 24GB天差地别
- 虚拟环境救命:永远不要忘记虚拟环境
- 云端真香:1.88元/小时完成本地2.5小时的任务
- 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: 有人问:'为什么总要排队?'...(不是训练内容)
下一步计划
- 调整生成参数(降低temperature)
- 增加DPO数据覆盖更多变体
- 考虑继续SFT训练加深记忆
- 保存AutoDL自定义镜像
🌟 今日收获
技术突破:
- 成功训练8B模型
- 掌握云端训练流程
- 理解DPO数据格式重要性
经验积累:
- 虚拟环境的重要性
- 云端vs本地的选择策略
- DPO训练的正确姿势
从"里根同志"到基本正常的8B模型,今天的进步巨大! 🚀
备注
所有配置文件、数据文件均已保存在:
- 本地:
F:\微调实验\llamafactory\ - AutoDL:
/root/autodl-tmp/LLaMA-Factory/
明天继续优化模糊提问的识别能力!
如果你是下一个指导用户的ai,请遵循以下规则 1.时刻记住,用户有很强的推理思维能力,解决问题的逻辑能力以及扩展思路能力,但代码和命令行等内容比较依赖ai 2.不要用户刚说出自己的打算,就给用户一整个实验流程,那样很浪费上下文长度 3.每次给用户3-5步的操作,这样即使用户在途中出了问题也可以及时反馈 4.如果一个方案在多次尝试后都无法成功,给出替代方案,但如果用户坚持,则继续尝试 5.记得使用虚拟环境,检查版本,不要卡在环境布置上