一文帶你了解【SFT微調】與【Unsloth】
在當下流行的幾種大模型微調方法中,大家經常會看到談論SFP與Unsloth的文章,那我們應該如何了解它們?它們的技術特點又有哪些?各自應用在哪些模型微調的場景呢?本篇我們帶著這些問題,一起來了解一下。
一、SFT微調技術介紹
監督微調(Supervised Fine-tuning, SFT)是一種遷移學習(Transfer Learning)技術,指的是在已經預訓練好的模型(例如大語言模型中的 GPT、BERT 等)基礎上,使用帶有人工標注標簽的監督數據,對模型進行進一步的訓練,使其能更好地適應特定任務或領域。
1. 核心目的
- 任務適配:將模型的通用知識聚焦到特定目標(如生成符合人類指令的回答)。
- 性能提升:通過優化任務相關的損失函數(如交叉熵),提升模型在目標任務的準確率。
- 控制輸出:約束模型生成格式(如JSON)、風格(如客服禮貌用語)或內容安全性。
2. SFT微調的關鍵要素
預訓練模型:指的是一個大規模、通用的基礎模型,如 GPT、BERT、T5 等。
監督數據:包含輸入和對應的目標輸出(標簽)的數據集,如問答對、分類標簽、翻譯對等。
損失函數:常見的有交叉熵損失(Cross-Entropy Loss),用于衡量預測輸出與真實標簽之間的差距。
優化器:如 Adam、AdamW,用于更新模型參數最小化損失函數。
微調策略:決定哪些層可以更新、學習率設置、訓練輪數等。
3. 典型流程
(1)加載預訓練模型
加載一個已經訓練好的基礎模型(如 GPT-3、BERT、LLama 等)。
(2)準備監督數據集
數據格式通常為 `(input, output)` 對,例如:
{
"input": "請將這段話翻譯成英文:我喜歡人工智能。",
"output": "I like artificial intelligence."
}
(3)定義任務和損失函數
如文本生成使用語言建模損失,文本分類使用交叉熵損失等。
(4)微調模型
使用監督數據對模型進行微調,使其在該任務上表現更好。
(5)驗證與測試
使用驗證集評估模型效果,調整參數,避免過擬合。
大模型微調是NLP 應用開發工程師必須掌握的核心技術之一,它是實現模型“落地應用”的關鍵步驟。
二、Unsloth微調模型
Unsloth 是一個專注于加速并優化大語言模型(LLM)微調和推理的開源項目。它的目標是讓開發者能夠更高效、更低成本地在本地或云端微調和部署如 LLaMA、Mistral 等主流開源大模型。
1. 特點
(1)極致加速的微調(Finetuning)
- Unsloth 使用了一系列優化手段(如 FlashAttention、4bit 量化、LoRA)來讓模型微調速度快上數倍。
- 對比 Hugging Face 的 Transformers 微調方式,Unsloth 能實現最高5倍以上訓練加速。
- 支持 QLoRA(量化的LoRA),大幅減少所需顯存。
(2) 低內存占用(Low Memory Usage)
通過整合 bitsandbytes、Flash Attention、Paged Optimizers 等技術,可以在8GB 或更少顯存上訓練 7B 甚至 13B 模型。
(3)一行代碼加載優化模型
Unsloth 提供了類似 Huggingface 的接口,只需一行代碼即可加載優化好的模型:
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/llama-3-8b-Instruct-bnb-4bit",
max_seq_length = 2048,
dtype = torch.float16,
load_in_4bit = True,
)
(4)支持主流開源模型
Unsloth 支持加載和微調多個熱門開源 LLM,包括:
- Meta 的 LLaMA 2 / LLaMA 3
- Mistral / Mixtral
- OpenHermes、Zephyr、Code LLaMA 等
(5)兼容 Hugging Face
- 完全兼容 Hugging Face 的 Transformers 和 Datasets。
- 可將微調后的模型上傳至 Hugging Face Hub。
(6)推理優化
推理部分也進行了優化,支持 FlashAttention 和量化模型的高效推理。
2. 性能對比示例
根據官方數據,Unsloth的微調效率能夠大幅提升,并且適用于個人開發者進行低成本的模型開發。
框架 | 模型 | 顯存占用 | 微調速度 | 加速比 |
Huggingface | LLaMA 2 7B | 24GB | 40 tokens/s | 1x |
Unsloth | LLaMA 2 7B (4bit) | 8GB | 180 tokens/s | 4.5x |
3. 小結
Unsloth 是一個面向開發者和研究人員的高效 LLM 微調工具,具有以下亮點:
- 快速、高效、資源占用低
- 支持主流開源模型
- 接口友好,易于上手
- 支持 4bit QLoRA + FlashAttention
如果你正在尋找一種方式在本地或低成本環境中微調開源大語言模型,Unsloth 是非常值得一試的工具。
三、SFT與Unsloth的聯系
Unsloth 是一種工具 / 框架,SFT 是一種微調方法。它們并不矛盾,而是可以結合使用的。
1. 技術實現的差異
(1)傳統SFT的瓶頸
- 計算冗余:PyTorch默認算子(如矩陣乘、LayerNorm)未針對微調任務優化,存在冗余內存拷貝。
- 顯存浪費:中間激活值(如注意力矩陣)全精度存儲,限制batch size和模型規模。
- 硬件利用率低:GPU計算單元空閑等待數據加載或內核啟動。
(2)Unsloth的優化
A. 內核融合(Kernel Fusion)
- 將多個連續操作(如QKV投影 → RoPE位置編碼 → 注意力計算)合并為單一GPU內核,減少內存I/O和內核啟動開銷。
- 例如:將PyTorch默認的20幾個算子融合為5個定制Triton內核。
B . 4-bit量化訓練
- 權重和梯度以4-bit存儲(非對稱量化),通過QLoRA機制反量化計算,顯存占用降低至1/3。
- 量化誤差通過微調過程動態補償,幾乎不影響最終精度。
C. 動態內存復用
- 預先分配顯存池,避免頻繁申請/釋放顯存(減少CUDA同步開銷)。
- 中間變量復用(如梯度計算后立即釋放激活值內存)。
2、 兩者結合使用
我們可以使用Unsloth 框架來進行 SFT 微調,代碼如下:
from unsloth import FastLanguageModel
from trl import SFTTrainer # Hugging Face 的 SFT Trainer
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/llama-3-8b-Instruct-bnb-4bit",
max_seq_length = 2048,
dtype = torch.float16,
load_in_4bit = True,
)
trainer = SFTTrainer(
model=model,
tokenizer=tokenizer,
train_dataset=train_dataset,
dataset_text_field="text",
max_seq_length=2048,
)
trainer.train()
這段代碼中就是使用了SFT 方式進行監督微調,而微調的加速和模型加載部分則是由Unsloth 提供支持。
四、總結
Unsloth微調是傳統SFT在工程效率維度上的優化延伸,二者本質上是互補關系而非替代關系。通過底層計算優化,Unsloth讓SFT在資源受限場景下變得可行,使開發者能夠更專注于數據質量和模型設計,而非被硬件瓶頸束縛。選擇時需權衡任務需求、硬件條件和對新技術的接受度。
本文轉載自??碼農隨心筆記??,作者:碼農隨心筆記
