用 Unsloth 在单卡 4090 上微调 Llama-3 的全流程避坑指南
很多新手在安装时死磕 torch 版本,其实最稳的路径是直接用 Unsloth 提供的 Conda 环境依赖。千万别在基础环境里乱装,建议直接执行:
pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
pip install --no-deps "xformers<0.0.27" "trl<0.9.0" peft accelerate bitsandbytes核心配置避坑点:
1. 显存爆炸问题:
如果你发现 24G 显存还是 OOM,重点检查 max_seq_length。不要盲目设 4096,对于大多数指令微调任务,2048 足够。另外,一定要开启 load_in_4bit=True,这是 4090 能跑起来的前提。
2. 数据格式陷阱:
Unsloth 对数据格式极其敏感。如果你的 JSONL 格式不对,模型训练出来的结果全是胡言乱语。必须严格遵循 Llama-3 的 ChatML 格式,推荐用以下方式构建 Prompt:
from unsloth import FastLanguageModel
# 配置加载
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/llama-3-8b-bnb-4bit",
max_seq_length = 2048,
load_in_4bit = True,
)
# 必须手动添加 EOS token,否则模型会没完没了地生成
tokenizer.padding_side = "right"3. 学习率与 Epoch 的博弈:
在 4090 上微调,学习率建议设在 2e-4 左右。如果发现 Loss 掉得太快(比如瞬间降到 0.1),大概率是过拟合了,赶紧把 epochs 降到 1,或者调低学习率。
效率提升技巧:
想快速验证效果,不要等全量训练完。利用 SFTTrainer 的 logging_steps=10,实时盯着 Loss 曲线。如果 Loss 在 0.8-1.2 之间波动且趋于平缓,基本就可以停止了。
最后关于导出,千万别直接保存成权重文件,建议导出为 GGUF 格式,这样可以直接扔进 Ollama 里测试,验证速度比在 Python 脚本里 model.generate 快得多:
model.save_pretrained_gguf("model_output", tokenizer, quantization_method = "q4_k_m")最容易踩的坑是 bitsandbytes 版本不兼容导致无法加载 4bit 权重,如果报错 CUDA setup failed,直接卸载重装 pip install bitsandbytes --upgrade 即可。
全部回复 (0)
还没有回复,来发第一条吧!
