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

10 KiB
Raw Blame History

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. 解决:回到虚拟环境
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被租完
  • 最终选择4090D1.88元/小时)

镜像选择

  • 社区镜像LLaMA Factory v24月1日版
  • PyTorch 2.1.0 + CUDA 12.1

9. 环境配置踩坑

踩坑1找不到LLaMA Factory

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空着

解决

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

训练速度对比

  • 本地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是引导语不是笑话
// 错误的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 → 移到数据盘

下载类

  1. ModelScope下载中断:网络不稳定 → 改用HF镜像
  2. 文件完整性校验失败多次sha256不同 → 单线程下载

训练类

  1. 8B模型Loss高:训练不充分 → 增加epoch和学习率
  2. DPO爆显存8B+DPO需要更多显存 → 极限压缩参数
  3. DPO 0秒训练检测到已有checkpoint → 改输出目录
  4. 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.记得使用虚拟环境,检查版本,不要卡在环境布置上