# 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.记得使用虚拟环境,检查版本,不要卡在环境布置上