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