unsloth的使用方式

1. 先把 Unsloth 放到正确的位置上 Unsloth 本质上是一个 本地运行与微调开源模型的框架。官方现在有两条主线:一条是 Unsloth Studio,也就是 Web UI;另一条是 Unsloth Core,也就是代码方式。Studio 更适合快速上手和低代码训练,Core 更适合你自己控制脚本、数据流…

作者:lh

1. 先把 Unsloth 放到正确的位置上

Unsloth 本质上是一个 本地运行与微调开源模型的框架。官方现在有两条主线:
一条是 Unsloth Studio,也就是 Web UI;另一条是 Unsloth Core,也就是代码方式。Studio 更适合快速上手和低代码训练,Core 更适合你自己控制脚本、数据流程、导出与部署。官方 README 也明确把这两种方式作为标准入口。


2. 部署前先选路线:Studio 还是 Core

2.1 Studio:最适合新手和快速验证

官方说明里,Unsloth Studio 支持 Windows、Linux、WSL 和 macOS;训练当前主要在 NVIDIA GPU 上可用,CPU 和 Mac 目前更偏向聊天与数据流程,完整训练支持仍在扩展。Studio 还能直接做模型搜索、运行、训练、导出。

官方给的启动方式很直接:

Linux / macOS / WSL:

curl -fsSL https://unsloth.ai/install.sh | sh
unsloth studio -H 0.0.0.0 -p 8888

Windows:

irm https://unsloth.ai/install.ps1 | iex
unsloth studio -H 0.0.0.0 -p 8888

Docker 也支持,官方镜像就是 unsloth/unsloth。这条路线适合:

  • 先验证数据集是否可用
  • 先做一版 SFT
  • 想少写环境脚本
  • 想顺便做导出和本地推理。

2.2 Core:最适合你要长期做实验或自己控流程

如果你要自己写训练脚本、做数据映射、改 target modules、试不同学习率或多种导出格式,Core 更合适。官方当前推荐用 uv 建环境,再安装 unsloth --torch-backend=auto

Linux / WSL:

curl -LsSf https://astral.sh/uv/install.sh | sh
uv venv unsloth_env --python 3.13
source unsloth_env/bin/activate
uv pip install unsloth --torch-backend=auto

Windows:

winget install -e --id Python.Python.3.13
winget install --id=astral-sh.uv -e
uv venv unsloth_env --python 3.13
.\unsloth_env\Scripts\activate
uv pip install unsloth --torch-backend=auto

官方要求里也写得很清楚:训练一般要求 Python 3.11–3.13;Windows 训练需 NVIDIA 驱动、Git、编译环境等。


3. 硬件与系统怎么判断够不够

官方要求页把支持环境拆得比较明确:Studio 当前训练主要面向 NVIDIA;CPU/Mac 更偏聊天和数据;AMD/Intel/MLX 的支持在不同路径上进度不同。Core 在某些场景下比 Studio 更灵活。

实际判断时,你不用先纠结“能不能训 70B”,而要先问:

第一,你是做实验还是做产品。
如果只是做领域适配,7B/8B/14B instruct 模型通常已经够用。

第二,你是显存优先还是效果优先。
官方 LoRA 超参数指南明确写到:

  • LoRA 是 16-bit,稍快、略准,但显存更高
  • QLoRA 是 4-bit,略慢、略弱,但显存约少 4 倍。

所以一般经验是:

  • 24GB 左右显存:优先 QLoRA,做 7B~14B 是主力路线
  • 48GB 及以上:LoRA 16-bit 会更从容
  • 更大模型或更长上下文:要么多卡,要么接受更重的量化与更慢的保存/导出。这个判断和官方对 LoRA/QLoRA 的定位是一致的。

4. 微调前最关键的一步:不要先调参数,先选对模型

这一步很多人会做反。

4.1 优先选 instruct,而不是 base

官方 fine-tuning guide 明确建议优先用 instruct 模型 起步,因为对大多数问答、助手、行业任务来说,它更容易学到你要的交互格式,数据量要求通常也更友好。

你的目标如果是:

  • 中文问答助手
  • 法律/论文助手
  • 企业知识库答疑
  • 客服风格定制

那就优先选:

  • Qwen instruct
  • Llama instruct
  • Gemma instruct
  • Mistral instruct。

4.2 不是所有模型都适合 QLoRA

这是非常关键的“高效微调”知识点。官方在 Qwen3.5 fine-tune guide 里明确写了:不推荐对 Qwen3.5 模型做 QLoRA 4-bit 训练,无论是 dense 还是 MoE,原因是它的量化偏差更高。官方同时提醒:Qwen3.5 需要 transformers v5,旧版本不行。

这意味着“高效”不能机械理解成“全都 4bit”。
对某些模型,高效应该理解成:选更稳定的 bf16/16-bit LoRA,而不是盲目追求最低显存


5. 数据怎么准备,决定你后面 70% 的效果

真正让模型学会行业能力的,通常不是训练框架,而是 数据设计

5.1 先区分三种任务

你要先分清自己是哪类:

A. 风格/助手微调

目标是让模型说话方式、结构、语气更稳定。
数据核心是:

  • instruction
  • optional input
  • output

B. 领域知识微调

目标是让模型回答某类问题更专业。
数据核心不是“把 PDF 全喂进去”,而是把知识重构成:

  • 标准问答
  • 错误问答对比
  • 术语解释
  • 步骤说明
  • 案例化问法

C. 对话微调

目标是多轮聊天一致性。
数据最好整理成 messages 结构,并固定 system 提示风格。

官方 notebooks 和 fine-tuning 文档都围绕这些标准 SFT 结构来组织。

5.2 数据格式尽量统一

最容易出问题的不是模型,而是训练样本风格混乱。
比如一部分数据像百科问答,一部分像口语聊天,一部分又像“命令 + 长报告”,模型会学到冲突分布,最后表现成:

  • 输出忽长忽短
  • 风格飘
  • 开头模板混乱
  • 指令遵循不稳定

所以一个高效做法是:
先确定一个训练模板,再让所有样本向这个模板靠。

例如最稳的 instruction 格式:

{"instruction":"解释什么是迁移学习","input":"","output":"迁移学习是将一个任务上获得的知识迁移到相关任务中,以减少数据需求并提升学习效率。"}

或者对话格式:

{"messages":[
{"role":"system","content":"你是一个严谨、简洁的学术助手。"},
{"role":"user","content":"什么是迁移学习?"},
{"role":"assistant","content":"迁移学习是将已有任务中的知识迁移到新任务中,以提升训练效率和泛化能力。"}
]}

6. 训练方式怎么选:LoRA、QLoRA、全参数

6.1 大多数人先别碰全参数微调

官方 README 里虽然支持 full fine-tuning,但对绝大多数行业适配任务,LoRA/QLoRA 是更合理的第一选择。README 同时强调 Unsloth 支持 4-bit、16-bit、全参数等多种方式,但这不代表全参数就是默认优选。

因为从投入产出比看:

  • 数据量不大时,全参数更容易过拟合
  • 显存和训练成本明显更高
  • 导出、保存、恢复训练都更重

6.2 LoRA 和 QLoRA 怎么选

官方 LoRA guide 给得很明确:
LoRA 16-bit 稍快、略准;QLoRA 4-bit 更省显存。

所以实践上可以这样选:

选 QLoRA 的场景

  • 单卡显存有限
  • 你要快速验证多版数据
  • 模型本身对 4-bit 没有官方禁忌
  • 你当前优先级是“先跑起来”

选 LoRA 16-bit 的场景

  • 你更在意稳定性
  • 你显存够
  • 该模型官方不建议 QLoRA
  • 你已经验证数据没问题,准备冲更高效果。

7. 一套标准的 Unsloth Core 微调骨架

下面这套思路是最稳的:

from unsloth import FastLanguageModel
from datasets import load_dataset
from trl import SFTTrainer
from transformers import TrainingArguments

max_seq_length = 2048
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/llama-3.1-8b-unsloth-bnb-4bit",
max_seq_length = max_seq_length,
load_in_4bit = True,
)

model = FastLanguageModel.get_peft_model(
model,
r = 16,
target_modules = [
"q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj",
],
lora_alpha = 16,
lora_dropout = 0,
bias = "none",
use_gradient_checkpointing = "unsloth",
)

dataset = load_dataset("json", data_files="train.jsonl", split="train")

trainer = SFTTrainer(
model = model,
tokenizer = tokenizer,
train_dataset = dataset,
dataset_text_field = "text",
max_seq_length = max_seq_length,
packing = False,
args = TrainingArguments(
per_device_train_batch_size = 2,
gradient_accumulation_steps = 4,
warmup_steps = 10,
learning_rate = 2e-4,
max_steps = 60,
weight_decay = 0.01,
logging_steps = 1,
output_dir = "outputs",
report_to = "none",
),
)

trainer.train()

这不是官方逐字模板,但参数逻辑与官方建议是一致的:

  • 先从 max_seq_length=2048
  • batch_size=2
  • gradient_accumulation_steps=4
  • learning_rate2e-4 开始试
  • 先用少量 steps 验证流程。

8. 怎样“高效微调”:真正重要的是这 10 点

8.1 先用小步试跑,而不是一上来全量训练

官方建议里,很多入门设置都是先用较小 step 检查训练是否正常。这样做的意义是:

  • 先排除模板错误
  • 先排除 tokenizer/chat template 错误
  • 先排除 loss 不降
  • 先排除显存炸裂

这个阶段不是为了训练完成,而是为了快速排错。

8.2 epochs 不要贪多

官方 LoRA guide 写得很直接:1–3 epochs 是推荐范围;超过 3 往往收益递减,且更易过拟合。

很多人“效果不好”就继续堆 epochs,结果模型只是在背训练集。

8.3 LoRA rank 不要盲目拉高

官方推荐的常见 rank 是 8/16/32/64/128,并特别提示通常选 16 或 32

经验上:

  • r=8:非常省,但容量偏小
  • r=16:多数任务的默认甜点位
  • r=32:适合稍复杂的领域风格或结构任务
  • 更高 rank:只有在数据复杂、显存允许、且你已验证低 rank 不够时才考虑

“高效”不是 rank 越高越好,而是 在最小足够容量下达到目标

8.4 LoRA Alpha 通常跟 rank 走

官方建议 lora_alpha = r,或常见启发式 r * 2

所以:

  • r=16 时,用 alpha=1632
  • r=32 时,用 alpha=3264

8.5 dropout 通常先设 0

官方写得很明确:LoRA dropout 往往没那么有用,默认 0。

这点很适合新手:不要一开始就用很多 regularization,把变量搞多。

8.6 warmup 要有,但别太长

官方推荐 warmup steps 约为总步数的 5%–10%

warmup 太短,初期梯度容易不稳;太长,又浪费有效学习阶段。

8.7 weight decay 别设太大

官方推荐大致是 0.01 起。

你要是把 weight decay 开太大,模型可能学不进去。

8.8 context length 先保守

官方 fine-tuning guide 用 2048 作为常见起点。

高效的逻辑是:

  • 先用较短上下文验证训练方向
  • 再决定是否真的需要 8K、16K、32K
  • 因为上下文越长,显存和训练时间越高

除非你的任务明确依赖长文输入,否则别一开始就拉满上下文。

8.9 target modules 不要乱加

标准注意力 + MLP 模块通常就够:
q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj

这类配置兼顾容量与稳定性,也是社区与官方文档示例体系中最常见的路线。

8.10 选择动态 4-bit,而不是普通 4-bit

官方文档明确区分了:

  • 名称里带 unsloth-bnb-4bit 的,是 Unsloth dynamic 4-bit
  • bnb-4bit 的,是标准 BitsAndBytes 4-bit

官方说明前者会略多吃一点显存,但精度显著更高。

这就是“高效微调”的一个典型例子:
不是绝对追求最省显存,而是追求 精度/显存比最优


9. 推理阶段别漏掉这一句

官方 fine-tuning guide 明确提醒:推理前要调用

FastLanguageModel.for_inference(model)

官方说这样可以启用 Unsloth 更快的推理路径。

这是一个很典型的“小操作,大收益”。很多人训练完直接 generate(),结果速度不理想。


10. 导出与部署:你到底该走 GGUF 还是 vLLM

10.1 单机、本地、桌面应用:优先 GGUF

官方 deployment guide 明确写到:
如果你是在单设备上运行,比如笔记本、本地 PC、Mac,推荐用 llama.cpp / GGUF,再去 Ollama、LM Studio 等环境里跑。

这类路径适合:

  • 本地助手
  • 单人使用
  • 离线推理
  • CPU/GPU 混合本地运行

常见导出思路就是:

model.save_pretrained_gguf("my_model_gguf", tokenizer, quantization_method="q4_k_m")

官方还有 Studio 的导出流程,支持导出 GGUF、Safetensors、LoRA 等格式。

10.2 多用户、服务化、生产环境:优先 vLLM

官方 fine-tuning guide 和 deployment 文档都写得很清楚:
如果是 企业/多用户推理,尤其是 FP8/AWQ 等服务场景,优先考虑 vLLM

vLLM 更适合:

  • API 服务
  • 多并发
  • 在线推理
  • 统一服务治理

而且官方还单独列了 vLLM engine 参数说明,例如:

  • --gpu-memory-utilization
  • --max-model-len
  • --quantization
    其中 --gpu-memory-utilization 默认 0.9,显存不够时应下调;--max-model-len 也会直接影响显存。

所以部署侧的高效优化,往往就是两件事:

  1. 不要把上下文开到不必要的大
  2. 不要把 GPU 利用率设到一碰就 OOM。

11. 最常见的坑:不是训练坏了,而是模板错了

这是 Unsloth 官方 GGUF 文档里强调得非常重的一点:
最常见的问题是 chat template 不一致。
也就是说,你训练时用的模板,和导出后在 llama.cpp / Ollama / 其他框架推理时用的模板,必须保持一致。否则就会出现:

  • 输出乱码
  • 回答莫名其妙
  • 长输出崩坏
  • 对话格式异常。

官方还特别提醒:

  • eos token 必须正确
  • 有些引擎会额外加起始 token,也可能导致异常。

这意味着,很多人以为“模型训废了”,其实只是:

  • 模板错了
  • 结束符错了
  • 推理框架预处理不一致

12. 保存时 OOM 怎么办

官方 FAQ 直接给了解法:
如果保存 GGUF 或 16-bit 合并模型时崩显存,可以把 maximum_memory_usage 从默认约 0.75 往下调,比如调到 0.5。这会减少保存时的峰值显存占用,从而降低 OOM 风险。

这个建议非常实用,因为很多人训练能跑,保存却炸。


13. 一个推荐的“高效微调工作流”

如果你要的是一套稳的流程,我建议你按下面做:

第一步:先选目标

明确你到底要优化什么:

  • 风格一致性
  • 行业知识
  • 长文结构回答
  • 工具调用
  • 代码
  • 多轮对话

因为不同目标决定数据形式,而不是先决定模型。

第二步:先选 instruct 模型

先别上 base。
多数问答/助手任务,先选 instruct。

第三步:根据模型特性决定 LoRA 还是 QLoRA

大多数模型先试 QLoRA。
但如果官方明确不建议,比如 Qwen3.5,就用 bf16 / 16-bit LoRA。

第四步:只做一小批样本的试跑

用 100~500 条高质量样本先跑几十步:

  • 看 loss 是否下降
  • 看输出格式是否对
  • 看有没有模板问题
  • 看显存是否稳定

第五步:扩展到完整训练

这时候再决定:

  • 1 epoch 够不够
  • 是否到 2–3 epochs
  • 是否从 r=16 升到 r=32
  • 学习率是否需要降。

第六步:先用 Unsloth 原生推理验证

记得 FastLanguageModel.for_inference(model)

第七步:根据用途导出

  • 本地:GGUF / Ollama / LM Studio
  • 服务:vLLM。

14. 给你一个参数起步表

这是按官方建议整理后的“默认安全起点”:

项目 起步建议
模型 instruct 模型
量化 unsloth-bnb-4bit 优先
训练方式 QLoRA;若模型不适合 4-bit,则 16-bit LoRA
max_seq_length 2048
LoRA rank 16
LoRA alpha 16 或 32
dropout 0
batch size 2
grad accumulation 4
warmup 总步数 5%–10%
epochs 1–3
weight decay 0.01
初始学习率 2e-4,必要时降到 1e-4 / 5e-5。

这些建议都与 Unsloth 官方超参数指南、fine-tuning guide 的方向一致。


15. 最后给你一个结论:什么叫“高效微调”

真正高效,不是“最省显存”,也不是“最快开始训练”,而是下面这套组合:

选对模型 + 用对数据格式 + 用最小足够的 LoRA 容量 + 避免无意义长上下文 + 保持训练与推理模板一致 + 按用途选择部署引擎。 

官网地址:https://unsloth.ai/?ref=producthunt