1.1 微调为什么慢、为什么费显存
微调(Fine-tuning)就是在预训练好的大模型上,用你自己的数据继续训练,让它学会特定任务或风格。看似只是"再训练一会儿",但代价很高,原因主要有两个。
显存爆炸。一次训练要在显存里同时放下:模型权重、梯度、优化器状态(Adam 每个参数要存两份动量)、以及前向传播的激活值。以 7B 模型全参微调为例,光是权重 + 梯度 + Adam 状态就要约 7B × (2 + 2 + 8) = 84GB(fp16 权重 2 字节、梯度 2 字节、Adam 状态 8 字节),远超单张消费级显卡。
计算冗余。PyTorch 的自动求导(autograd)会为每个算子保存中间张量以便反向传播,attention 的 softmax、RoPE 旋转、交叉熵等热点算子反复读写显存,带宽成为瓶颈,GPU 算力吃不满。
- 预训练(Pre-training)
- 在海量无标注语料上从零训练一个基础模型,成本极高(百万美元级),普通人不做,只用它的产出。
- 微调(Fine-tuning)
- 在预训练模型基础上用少量领域数据继续训练,让模型学会特定任务。本教程的主线。
- 全参微调(Full Fine-tuning)
- 更新模型的全部参数,效果最好但显存与算力代价最大,7B 模型往往需 80GB+ 显存。
- PEFT(Parameter-Efficient Fine-Tuning)
- 参数高效微调,只训练一小部分新增参数(如 LoRA),冻结原权重,显存骤降。Unsloth 主要加速这类。
- 显存(VRAM)
- GPU 上的内存。微调能不能跑,第一关卡就是显存够不够。省显存 = 能上更大模型或更长序列。
- Triton
- OpenAI 出品的 Python DSL,用来写自定义 GPU kernel(算子),比手写 CUDA 简单,是 Unsloth 加速的底层武器。
- autograd(自动求导)
- PyTorch 自动记录前向计算图、反向算梯度的机制。方便但有额外显存/计算开销,Unsloth 对热点算子手写反向以省开销。
- kernel(内核/算子)
- 在 GPU 上执行一次具体计算的程序单元。把多个算子"融合"成一个 kernel 能减少显存读写,是提速关键。
1.2 Unsloth 到底做了什么
Unsloth 不是"降低精度换速度"的近似方案,它的核心是工程重写:把 Transformer 中最耗时的算子用 Triton 手写、把反向传播手动推导实现,从而在数学上完全等价原生实现的前提下,减少显存读写与冗余计算。
- 手写 Triton kernel:对 RoPE、RMSNorm、交叉熵、MLP 的 SwiGLU 等热点重写并融合,减少 kernel 启动与中间张量。
- 手动 autograd:热点算子自己写 forward/backward,绕开 PyTorch 通用求导的显存冗余。
- 优化的 QLoRA 路径:4bit 量化加载 + LoRA,配合融合内核,把显存压到消费级显卡可承受的范围。
- 零精度损失:loss 曲线与 HuggingFace 原生实现逐点对齐,不牺牲效果。
同样微调 Llama-3-8B、同样超参:原生 HF + PEFT 可能需要 24GB 显存、训练 1 小时;用 Unsloth 大约 12GB 显存、20 分钟左右——一张免费的 Colab T4 就能跑通。
1.3 支持的模型
| 模型家族 | 代表型号 | 说明 |
|---|---|---|
| Llama | Llama 3 / 3.1 / 3.2 | 支持最完整,社区 notebook 最多 |
| Mistral | Mistral 7B / Mixtral | 含 MoE 变体 |
| Gemma | Gemma 2 / 3 | Google 开源系列 |
| Qwen | Qwen2.5 / Qwen3 | 中文能力强,本教程实战首选 |
| Phi | Phi-3 / Phi-4 | 小体积高质量 |
| DeepSeek | DeepSeek-V / R 系列 | 含蒸馏版 |
| 视觉多模态 | Llama 3.2 Vision / Qwen-VL | 见第 9 章 |
1.4 安装:Colab(推荐入门)
Colab 是零成本上手的最快路径——免费提供 T4 GPU,Unsloth 官方也维护了大量现成 notebook。在 Colab 里只需一行安装:
# Colab 中安装(自动匹配 CUDA / torch 版本)
!pip install unsloth
# 若要最新特性,可从 GitHub 主分支安装
!pip install --upgrade --no-cache-dir "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
1.5 安装:本地环境
本地需要 NVIDIA GPU(支持 CUDA)。推荐用 conda 或 uv 建独立环境,先装好匹配的 PyTorch,再装 Unsloth。
# 1. 建环境(Python 3.10/3.11 均可)
$ conda create -n unsloth python=3.11 -y
$ conda activate unsloth
# 2. 安装 unsloth(会带上 torch、triton、bitsandbytes、trl、peft 等)
$ pip install unsloth
# 3. 验证 CUDA 与 GPU 是否可见
$ python -c "import torch; print(torch.cuda.get_device_name(0))"
Unsloth 对 torch、CUDA、triton 版本较敏感。安装报错时优先看官方文档给出的当前推荐组合,不要盲目升级 torch。Windows 用户建议走 WSL2。
1.6 30 秒验证环境
装完后跑这段最小代码,能加载模型即说明环境 OK(下一章起会逐行讲解):
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/Qwen2.5-3B-Instruct",
max_seq_length = 2048,
load_in_4bit = True, # 4bit 量化加载,省显存
)
print("环境就绪,模型已加载 ✅")
形如 unsloth/Qwen2.5-3B-Instruct 是 Unsloth 在 HuggingFace 上预量化好的镜像仓库,下载更小、加载更快。你也可以直接用官方原始名如 Qwen/Qwen2.5-3B-Instruct。
1.7 小结与下一步
- 微调慢/费显存的根源是显存占用(权重+梯度+优化器+激活)与计算冗余。
- Unsloth 靠手写 Triton kernel + 手动 autograd,在零精度损失下做到 2-5x 加速、省 70% 显存。
- 支持 Llama/Mistral/Gemma/Qwen/Phi/DeepSeek 及视觉模型,一行
pip install unsloth即可上手。 - 下一章拆解 LoRA 与 QLoRA 原理——搞懂它,才知道为什么只训练一小撮参数就够了。