从零到一:基于LLaMA-Factory的微调实战与核心参数精讲
1. 环境准备与LLaMA-Factory初探第一次接触LLaMA-Factory时我对着官方文档发呆了半小时——这个工具链实在太强大了但新手很容易被各种依赖项劝退。这里分享我的踩坑经验不要一上来就追求最新版本。去年12月我在RTX 3090上折腾v0.4.0时光是CUDA版本冲突就浪费了两天。建议先用稳定版当前推荐v0.3.2等核心流程跑通再升级。安装过程最关键的三个依赖是PyTorch版本要严格匹配CUDA驱动用nvidia-smi查驱动版本bitsandbytes需要单独编译安装官方仓库的预编译版本经常出问题FlashAttention的安装要加--no-build-ext参数实测在Ubuntu 22.04下的完整安装命令conda create -n llamafactory python3.10 conda activate llamafactory pip install torch2.1.2cu121 --index-url https://download.pytorch.org/whl/cu121 git clone https://github.com/TimDettmers/bitsandbytes cd bitsandbytes CUDA_HOME/usr/local/cuda-12.1 make cuda12x pip install -e . pip install flash-attn --no-build-ext遇到显存不足报错时先检查nvidia-smi里的进程占用。有次我发现居然有个僵尸进程占着20G显存kill掉之后立马就能训练了。另外推荐用gpustat工具实时监控显存比nvidia-smi更直观。2. 数据准备的黄金法则去年给某电商客户做客服机器人微调时我们犯了个典型错误——直接拿原始对话日志训练。结果模型学会了所有客服和用户的脏话...后来我们制定了数据清洗三板斧质量过滤用规则模型双保险删除含敏感词的样本正则匹配用预训练分类器过滤低质量对话准确率0.9才保留格式标准化JSON字段要严格对齐{ instruction: 如何处理退货申请, input: 用户说我收到的衣服有污渍, output: 1.致歉 2.提供退货标签 3.告知处理时限 }长度控制用tiktoken统计token数import tiktoken enc tiktoken.get_encoding(cl100k_base) assert len(enc.encode(sample[output])) 512 # 确保不超cutoff_len实战中发现数据多样性比数量更重要。我们曾用10万条相似客服数据训练效果反而不如1万条覆盖20种场景的数据。建议每个意图至少准备50-100个表达变体。3. 核心参数调优实战3.1 学习率与批次大小的平衡术在A100上测试Qwen-7B模型时我们发现当batch_size32配合lr5e-5会出现梯度爆炸而batch_size8时相同的学习率却收敛良好。这引出了动态学习率调整公式effective_lr base_lr * sqrt(batch_size / reference_batch)其中reference_batch通常取8或16。例如当base_lr5e-5batch_size从8增加到32时adjusted_lr 5e-5 * sqrt(8/32) ≈ 2.5e-5下表是我在不同硬件配置下的实测推荐值显卡类型最大batch_size推荐学习率梯度累积步数RTX 309083e-54A100 40G165e-52H100 80G327e-513.2 LoRA参数的黑箱破解lora_rank这个参数最让人困惑——设8和设64到底差在哪我们做了组对照实验rank8训练速度快比全参数微调快3倍在简单任务如文本分类上表现良好显存占用仅增加15%rank64训练速度下降30%在复杂生成任务如代码补全上效果提升明显显存占用增加40%关键发现是当LoRA矩阵的rank超过原矩阵1/4秩时效果提升会趋于平缓。比如Qwen-7B的q_proj层原始维度是4096这时rank设置1024以上就意义不大了。4. 训练监控与问题排查看到loss曲线震荡别急着调参有次我误把波动当发散调低学习率后模型反而停滞了。后来养成了三个诊断习惯看梯度范数在训练脚本里加这段代码from torch.nn.utils import clip_grad_norm_ total_norm clip_grad_norm_(model.parameters(), max_norm1.0, error_if_nonfiniteTrue) print(fGradient norm: {total_norm:.2f})健康值通常在0.5-2.0之间超过5.0可能预示梯度爆炸验样本预测每500步抽样查看模型输出随机选5条训练数据对比微调前后的生成差异突然的退化往往意味着参数配置有问题查显存碎片PyTorch的显存管理有时会出问题watch -n 1 nvidia-smi --query-gpumemory.used --formatcsv发现显存只增不减时尝试在训练循环里加torch.cuda.empty_cache()有次遇到验证集loss下降但实际效果变差后来发现是数据泄露——验证集里混入了相似样本。现在我们的标准流程是先用simhash去重再按业务场景分层抽样。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2452740.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!