用 Unsloth 在单张 4090 上微调 Llama-3 显存优化实战分享

摄影爱好者Tom 初级 2026/4/25 426 浏览 10 点赞 约 1 分钟

4090 的 24G 显存跑 Llama-3 8B 的全量微调几乎是不可能的,但用 Unsloth 配合 QLoRA 能把显存占用压到 16G 以下,且训练速度快了 2-3 倍。

用 Unsloth 在单张 4090 上微调 Llama-3 显存优化实战分享

最关键的配置在于 FastLanguageModel 的初始化。很多人直接跑 Demo 容易 OOM,是因为没处理好 max_seq_lengthload_in_4bit 的组合。在 4090 上,建议把序列长度严格控制在 2048 或 4096,不要盲目追求长文本。

核心配置代码片段:

from unsloth import FastLanguageModel
import torch

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/llama-3-8b-bnb-4bit", # 必须用预量化的4bit版本,省去本地量化时间
    max_seq_length = 2048,
    load_in_4bit = True,
)

# 关键步骤:只给 LoRA 层添加可训练参数,锁定其余部分
model = FastLanguageModel.get_peft_model(
    model,
    r = 16, # rank 选 16 足够,选 64 会明显增加显存压力且收益递减
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj", 
                      "gate_proj", "up_proj", "down_proj"], 
    lora_alpha = 16, 
    lora_dropout = 0, # Unsloth 优化过,dropout 设为 0 速度最快
    bias = "none",
)

几个实战踩坑点:

1. 梯度累积的陷阱
在 4090 上,per_device_train_batch_size 建议设为 2 或 4。如果想增加等效 Batch Size,必须用 gradient_accumulation_steps。我试过把 Batch Size 强行拉到 8,虽然没崩,但训练速度反而掉下来了,因为触发了频繁的内存交换。

2. 学习率的敏感度
Llama-3 对学习率非常敏感。用 AdamW 时,learning_rate 建议在 2e-4 左右。如果发现 Loss 震荡严重,立刻调低到 5e-5

3. 权重保存的坑
直接用 model.save_pretrained 保存的是 LoRA 适配器。如果要部署到 vLLM,必须用 model.save_pretrained_merged 将其合并回 16bit 或 4bit 格式,否则加载时会非常麻烦。

效率提升方案:
推荐使用 SFTTrainer 配合 packing = True。开启 Packing 后,它会将多条短样本拼接成一个固定长度的序列,避免了大量的 Padding 浪费,在我的测试中,同样的数据集,开启 Packing 后训练时间缩短了约 30%。

运行环境建议:
Ubuntu 22.04 + CUDA 12.1 + PyTorch 2.2+。千万不要在 Windows 原生环境下折腾,哪怕有 WSL2,显存调度依然不如原生 Linux 稳定。

同类方向的延伸案例可以参考AI大模型变现案例库,有不少直接可参考的案例。

全部回复 (0)

还没有回复,来发第一条吧!

发表回复

支持 Markdown 格式