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=2gradient_accumulation_steps=4learning_rate从2e-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=16或32r=32时,用alpha=32或64
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也会直接影响显存。
所以部署侧的高效优化,往往就是两件事:
- 不要把上下文开到不必要的大
- 不要把 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