在文章Firefly(流螢): 中文對(duì)話式大語(yǔ)言模型、中文對(duì)話式大語(yǔ)言模型Firefly-2b6開(kāi)源,使用210萬(wàn)訓(xùn)練數(shù)據(jù)中,我們介紹了關(guān)于Firefly(流螢)模型的工作。對(duì)大模型進(jìn)行全量參數(shù)微調(diào)需要大量GPU資源,所以我們通過(guò)對(duì)Bloom進(jìn)行詞表裁剪,在4*32G的顯卡上,勉強(qiáng)訓(xùn)練起了2.6B的firefly模型。
在本文中,我們將介紹QLoRA,由華盛頓大學(xué)提出的一種高效微調(diào)大模型的方法,可在單張A100上對(duì)LLaMA-65B進(jìn)行微調(diào)。在論文中,作者的實(shí)驗(yàn)表明使用QLoRA微調(diào)的LLaMA-65B,可達(dá)到ChatGPT性能水平的99.3%(由GPT-4進(jìn)行評(píng)價(jià)),并且QLoRA的性能可以逼近全量參數(shù)微調(diào)。作者做了豐富的實(shí)驗(yàn)證明這一結(jié)論。
在本文中我們將對(duì)QLoRA的基本原理進(jìn)行介紹,并且在Firefly項(xiàng)目中進(jìn)行實(shí)踐。我們?cè)?/span>bloom-7b1的基礎(chǔ)上,使用QLoRA進(jìn)行中文指令微調(diào),獲得firefly-7b1-qlora-v0.1模型,具有不錯(cuò)的效果,生成效果見(jiàn)第三章。QLoRA確實(shí)是一種高效訓(xùn)練、效果優(yōu)秀、值得嘗試和深入研究的方法。
論文地址:
https://arxiv.org/pdf/2305.14314.pdf
項(xiàng)目代碼:
https://github.com/yangjianxin1/Firefly
模型權(quán)重:
https://huggingface.co/YeungNLP/firefly-7b1-qlora-v0.1
01
QLoRA簡(jiǎn)介
本章節(jié)主要對(duì)LoRA與QLoRA進(jìn)行介紹,如讀者已了解本章節(jié)的內(nèi)容,可直接跳過(guò),閱讀項(xiàng)目實(shí)踐部分。
LoRA簡(jiǎn)介
在介紹QLoRA之前,簡(jiǎn)單回顧一下LoRA。LoRA的本質(zhì)是在原模型的基礎(chǔ)上插入若干新的參數(shù),稱(chēng)之為adapter。在訓(xùn)練時(shí),凍結(jié)原始模型的參數(shù),只更新adapter的參數(shù)。對(duì)于不同的基座模型,adapter的參數(shù)量一般為幾百萬(wàn)~幾千萬(wàn)。
LoRA的優(yōu)勢(shì)在于能夠使用較少的GPU資源,在下游任務(wù)中對(duì)大模型進(jìn)行微調(diào)。在開(kāi)源社區(qū)中,開(kāi)發(fā)者們使用LoRA對(duì)Stable Diffusion進(jìn)行微調(diào),取得了非常不錯(cuò)的效果。隨著ChatGPT的火爆,也涌現(xiàn)出了許多使用LoRA對(duì)LLM進(jìn)行指令微調(diào)的工作。
此前,我們也實(shí)踐過(guò)使用LoRA對(duì)LLM進(jìn)行指令微調(diào),雖然未進(jìn)行定量分析,但主觀感受LoRA比全量微調(diào)還是有一定的差距。實(shí)踐下來(lái),我們發(fā)現(xiàn)LoRA微調(diào)中存在以下三個(gè)痛點(diǎn):
-
參數(shù)空間小:LoRA中參與訓(xùn)練的參數(shù)量較少,解空間較小,效果相比全量微調(diào)有一定的差距。
-
微調(diào)大模型成本高:對(duì)于上百億參數(shù)量的模型,LoRA微調(diào)的成本還是很高。
-
精度損失:針對(duì)第二點(diǎn),可以采用int8或int4量化,進(jìn)一步對(duì)模型基座的參數(shù)進(jìn)行壓縮。但是又會(huì)引發(fā)精度損失的問(wèn)題,降低模型性能。
QLoRA簡(jiǎn)介
接下來(lái)便引入今天的主角QLoRA。整篇論文讀下來(lái),我們認(rèn)為QLoRA中比較重要的幾個(gè)做法如下:
-
4-bit NormalFloat:提出一種理論最優(yōu)的4-bit的量化數(shù)據(jù)類(lèi)型,優(yōu)于當(dāng)前普遍使用的FP4與Int4。
-
Double Quantization:相比于當(dāng)前的模型量化方法,更加節(jié)省顯存空間。每個(gè)參數(shù)平均節(jié)省0.37bit,對(duì)于65B的LLaMA模型,大約能節(jié)省3GB顯存空間。
-
Paged Optimizers:使用NVIDIA統(tǒng)一內(nèi)存來(lái)避免在處理小批量的長(zhǎng)序列時(shí)出現(xiàn)的梯度檢查點(diǎn)內(nèi)存峰值。
-
增加Adapter:4-bit的NormalFloat與Double Quantization,節(jié)省了很多空間,但帶來(lái)了性能損失,作者通過(guò)插入更多adapter來(lái)彌補(bǔ)這種性能損失。在LoRA中,一般會(huì)選擇在query和value的全連接層處插入adapter。而QLoRA則在所有全連接層處都插入了adapter,增加了訓(xùn)練參數(shù),彌補(bǔ)精度帶來(lái)的性能損失。
通過(guò)上述優(yōu)化,只需要41G顯存即可微調(diào)LLaMA-65B模型。甚至可以直接使用一張1080Ti來(lái)微調(diào)LLaMA-13B,手中的舊卡又可以繼續(xù)發(fā)揮余熱了。
作者使用GPT4對(duì)各個(gè)模型進(jìn)行評(píng)價(jià),結(jié)果顯示,使用QLoRA在OASST1數(shù)據(jù)集上微調(diào)得到的Guanaco-65B模型達(dá)到了ChatGPT的99.3%的性能。
作者進(jìn)一步采用了Elo等級(jí)分制度對(duì)各個(gè)模型進(jìn)行評(píng)價(jià),裁判為人類(lèi)或者GPT-4。結(jié)果顯示Guanaco-65B和Guanaco-33B均優(yōu)于ChatGPT-3.5。
實(shí)驗(yàn)分析
QLoRA方法是否有用,其與全量參數(shù)微調(diào)的差距有多大?作者使用LLaMA-7B和Alpaca數(shù)據(jù)集進(jìn)行了實(shí)驗(yàn)。下圖結(jié)果表明,通過(guò)插入更多的adapter,能夠彌補(bǔ)QLoRA量化帶來(lái)的性能損失,復(fù)現(xiàn)全量參數(shù)微調(diào)的效果。
除此之外,作者還將QLoRA應(yīng)用于RoBERTA和T5,評(píng)測(cè)其在GLUE和Super-NaturalInstructions數(shù)據(jù)集上的表現(xiàn)。從下表中可以看到,QLoRA+NF4+DQ基本上復(fù)現(xiàn)了BF16全量微調(diào)的實(shí)驗(yàn)指標(biāo)。
下表中LoRA+BF16基本上也復(fù)現(xiàn)了BF16全量微調(diào)的實(shí)驗(yàn)指標(biāo),如果作者能加上LoRA+FP4或者LoRA+int4的實(shí)驗(yàn)結(jié)果,則可以更清晰地展現(xiàn)LoRA與QLoRA的性能差異。
在指令微調(diào)階段,數(shù)據(jù)質(zhì)量和數(shù)據(jù)數(shù)量,哪一個(gè)更重要?作者使用三種不同的訓(xùn)練集,每個(gè)數(shù)據(jù)集分別使用5萬(wàn)、10萬(wàn)、15萬(wàn)的數(shù)據(jù)量進(jìn)行訓(xùn)練。對(duì)于下表,縱向來(lái)看,隨著數(shù)據(jù)量的增加,指標(biāo)并沒(méi)有明顯的提升,說(shuō)明數(shù)據(jù)量不是關(guān)鍵因素。橫向來(lái)看,對(duì)于不同的數(shù)據(jù)集,指標(biāo)差距甚大,說(shuō)明數(shù)據(jù)質(zhì)量更關(guān)鍵。
值得一提的是,在論文中,作者僅使用了9千多條OASST1的數(shù)據(jù)訓(xùn)練得到Guanaco-65B,這進(jìn)一步驗(yàn)證了,數(shù)據(jù)質(zhì)量遠(yuǎn)比數(shù)量重要,模型的知識(shí)來(lái)源于預(yù)訓(xùn)練階段。
模型的知識(shí)來(lái)源于預(yù)訓(xùn)練階段,指令微調(diào)目的是和人類(lèi)指令進(jìn)行對(duì)齊。在指令微調(diào)階段,數(shù)據(jù)的質(zhì)量與豐富度,遠(yuǎn)比數(shù)量更重要。這是最近一段時(shí)間,開(kāi)源社區(qū)以及各個(gè)論文強(qiáng)調(diào)的一個(gè)結(jié)論,在我們的實(shí)踐中也深有體會(huì)。
02
項(xiàng)目實(shí)踐
在本項(xiàng)目中,我們使用bloom-7b1作為基座模型。數(shù)據(jù)集為moss-003-sft-no-tools,這是由MOSS項(xiàng)目開(kāi)源的中文指令微調(diào)數(shù)據(jù)集,我們隨機(jī)抽取了29萬(wàn)條作為訓(xùn)練數(shù)據(jù),訓(xùn)練得到firefly-7b1-qlora-v0.1。
訓(xùn)練時(shí),我們將多輪對(duì)話拼接成如下格式,然后進(jìn)行tokenize。
<s>input1s>target1s>input2s>target2s>...
我們?cè)谝粡?2G顯卡上使用QLoRA進(jìn)行訓(xùn)練,在所有全連接層處都插入adapter,最終參與訓(xùn)練的參數(shù)量超過(guò)1億,相當(dāng)于一個(gè)bert-base的參數(shù)量。訓(xùn)練時(shí)只計(jì)算target部分的損失函數(shù)。
訓(xùn)練超參數(shù)如下所示:
max length | 1024 |
lr_scheduler_type | cosine |
batch size | 16 |
lr | 2e-4 |
warmup step | 3000 |
optimizer | paged_adamw_32bit |
training step | 18萬(wàn) |
模型的訓(xùn)練損失的變化趨勢(shì)如下圖所示:
firefly-7b1-qlora-v0.1的使用方式如下:
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer, LlamaTokenizer, BitsAndBytesConfig
import torch
model_name = 'bigscience/bloom-7b1'
adapter_name = 'YeungNLP/firefly-7b1-qlora-v0.1'
device = 'cuda'
input_pattern = '{}'
model = AutoModelForCausalLM.from_pretrained(
model_name,
low_cpu_mem_usage=True,
torch_dtype=torch.float16,
device_map='auto'
)
model = PeftModel.from_pretrained(model, adapter_name)
model.eval()
model = model.to(device)
tokenizer = AutoTokenizer.from_pretrained(model_name)
text = input('User:')
while True:
text = input_pattern.format(text)
input_ids = tokenizer(text, return_tensors="pt").input_ids
input_ids = input_ids.to(device)
outputs = model.generate(input_ids=input_ids, max_new_tokens=250, do_sample=True, top_p=0.75, temperature=0.35,
repetition_penalty=1.2, eos_token_id=tokenizer.eos_token_id)
rets = tokenizer.batch_decode(outputs)
output = rets[0].strip().replace(text, "").replace('', "")
print("Firefly:{}".format(output))
text = input('User:')
03
生成效果
下面的樣例均為firefly-7b1-qlora-v0.1模型所生成,未經(jīng)修改,僅供參考。
多輪對(duì)話
對(duì)話示例1:
對(duì)話示例2:
郵件生成
商品文案生成
醫(yī)療問(wèn)答
創(chuàng)意性寫(xiě)作
其他例子
04
結(jié)語(yǔ)
在本文中,我們介紹了QLoRA的基本原理,以及論文中一些比較重要的實(shí)驗(yàn)結(jié)論。并且使用QLoRA對(duì)bloom-7b1模型進(jìn)行中文指令微調(diào),獲得了非常不錯(cuò)的效果。
從firefly-7b1-qlora-v0.1的生成效果來(lái)看,雖然沒(méi)有做定量的評(píng)測(cè)(對(duì)LLM做評(píng)測(cè)確實(shí)比較困難),但就生成效果來(lái)看,絲毫不遜色于全量微調(diào)的firefly-2b6-v2。
一些碎碎念:
-
論文中表明QLoRA能夠媲美全量參數(shù)微調(diào)的效果,雖然可能需要更豐富、多角度的實(shí)驗(yàn)進(jìn)行驗(yàn)證,但如果【增大基座模型的參數(shù)量+QLoRA】能夠優(yōu)于【全量微調(diào)較小的模型】,也是非常有意義的。
-
對(duì)基座模型進(jìn)行量化壓縮,通過(guò)增加adapter來(lái)彌補(bǔ)量化導(dǎo)致性能損失,是一個(gè)非常不錯(cuò)的idea,論文中的實(shí)驗(yàn)也證實(shí)了這一點(diǎn)。并且從我們的實(shí)踐效果看來(lái),確實(shí)驚艷,效果遠(yuǎn)勝LoRA。
-
最后,如果你手邊的訓(xùn)練資源不足,QLoRA非常值得一試。
-
gpu
+關(guān)注
關(guān)注
28文章
4673瀏覽量
128594 -
開(kāi)源
+關(guān)注
關(guān)注
3文章
3218瀏覽量
42329 -
語(yǔ)言模型
+關(guān)注
關(guān)注
0文章
501瀏覽量
10236
原文標(biāo)題:QLoRA實(shí)戰(zhàn) | 使用單卡高效微調(diào)bloom-7b1,效果驚艷
文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語(yǔ)言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論