0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用LoRA和Hugging Face高效訓(xùn)練大語言模型

深度學(xué)習(xí)自然語言處理 ? 來源:Hugging Face ? 2023-04-14 17:37 ? 次閱讀

在本文中,我們將展示如何使用 大語言模型低秩適配 (Low-Rank Adaptation of Large Language Models,LoRA) 技術(shù)在單 GPU 上微調(diào) 110 億參數(shù)的 FLAN-T5 XXL 模型。在此過程中,我們會(huì)使用到 Hugging Face 的 Transformers、Accelerate 和 PEFT 庫。

快速入門: 輕量化微調(diào) (Parameter Efficient Fine-Tuning,PEFT)

PEFT 是 Hugging Face 的一個(gè)新的開源庫。使用 PEFT 庫,無需微調(diào)模型的全部參數(shù),即可高效地將預(yù)訓(xùn)練語言模型 (Pre-trained Language Model,PLM) 適配到各種下游應(yīng)用。

注意: 本教程是在 g5.2xlarge AWS EC2 實(shí)例上創(chuàng)建和運(yùn)行的,該實(shí)例包含 1 個(gè) NVIDIA A10G

1. 搭建開發(fā)環(huán)境

在本例中,我們使用 AWS 預(yù)置的 PyTorch 深度學(xué)習(xí) AMI,其已安裝了正確的 CUDA 驅(qū)動(dòng)程序和 PyTorch。在此基礎(chǔ)上,我們還需要安裝一些 Hugging Face 庫,包括 transformers 和 datasets。運(yùn)行下面的代碼就可安裝所有需要的包。

#installHuggingFaceLibraries
!pipinstallgit+https://github.com/huggingface/peft.git
!pipinstall"transformers==4.27.1""datasets==2.9.0""accelerate==0.17.1""evaluate==0.4.0""bitsandbytes==0.37.1"loralib--upgrade--quiet
#installadditionaldependenciesneededfortraining
!pipinstallrouge-scoretensorboardpy7zr

2. 加載并準(zhǔn)備數(shù)據(jù)集

這里,我們使用 samsum 數(shù)據(jù)集,該數(shù)據(jù)集包含大約 16k 個(gè)含摘要的聊天類對(duì)話數(shù)據(jù)。這些對(duì)話由精通英語的語言學(xué)家制作。

{
"id":"13818513",
"summary":"AmandabakedcookiesandwillbringJerrysometomorrow.",
"dialogue":"Amanda:Ibakedcookies.Doyouwantsome?
Jerry:Sure!
Amanda:I'llbringyoutomorrow:-)"
}

我們使用 Datasets 庫中的 load_dataset() 方法來加載 samsum 數(shù)據(jù)集。

fromdatasetsimportload_dataset

#Loaddatasetfromthehub
dataset=load_dataset("samsum")

print(f"Traindatasetsize:{len(dataset['train'])}")
print(f"Testdatasetsize:{len(dataset['test'])}")

#Traindatasetsize:14732
#Testdatasetsize:819

為了訓(xùn)練模型,我們要用 Transformers Tokenizer 將輸入文本轉(zhuǎn)換為詞元 ID。

fromtransformersimportAutoTokenizer,AutoModelForSeq2SeqLM

model_id="google/flan-t5-xxl"

#LoadtokenizerofFLAN-t5-XL
tokenizer=AutoTokenizer.from_pretrained(model_id)

在開始訓(xùn)練之前,我們還需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理。生成式文本摘要屬于文本生成任務(wù)。我們將文本輸入給模型,模型會(huì)輸出摘要。我們需要了解輸入和輸出文本的長(zhǎng)度信息,以利于我們高效地批量處理這些數(shù)據(jù)。

fromdatasetsimportconcatenate_datasets
importnumpyasnp
#Themaximumtotalinputsequencelengthaftertokenization.
#Sequenceslongerthanthiswillbetruncated,sequencesshorterwillbepadded.
tokenized_inputs=concatenate_datasets([dataset["train"],dataset["test"]]).map(lambdax:tokenizer(x["dialogue"],truncation=True),batched=True,remove_columns=["dialogue","summary"])
input_lenghts=[len(x)forxintokenized_inputs["input_ids"]]
#take85percentileofmaxlengthforbetterutilization
max_source_length=int(np.percentile(input_lenghts,85))
print(f"Maxsourcelength:{max_source_length}")

#Themaximumtotalsequencelengthfortargettextaftertokenization.
#Sequenceslongerthanthiswillbetruncated,sequencesshorterwillbepadded."
tokenized_targets=concatenate_datasets([dataset["train"],dataset["test"]]).map(lambdax:tokenizer(x["summary"],truncation=True),batched=True,remove_columns=["dialogue","summary"])
target_lenghts=[len(x)forxintokenized_targets["input_ids"]]
#take90percentileofmaxlengthforbetterutilization
max_target_length=int(np.percentile(target_lenghts,90))
print(f"Maxtargetlength:{max_target_length}")

我們將在訓(xùn)練前統(tǒng)一對(duì)數(shù)據(jù)集進(jìn)行預(yù)處理并將預(yù)處理后的數(shù)據(jù)集保存到磁盤。你可以在本地機(jī)器或 CPU 上運(yùn)行此步驟并將其上傳到 Hugging Face Hub。

defpreprocess_function(sample,padding="max_length"):
#addprefixtotheinputfort5
inputs=["summarize:"+itemforiteminsample["dialogue"]]

#tokenizeinputs
model_inputs=tokenizer(inputs,max_length=max_source_length,padding=padding,truncation=True)

#Tokenizetargetswiththe`text_target`keywordargument
labels=tokenizer(text_target=sample["summary"],max_length=max_target_length,padding=padding,truncation=True)

#Ifwearepaddinghere,replacealltokenizer.pad_token_idinthelabelsby-100whenwewanttoignore
#paddingintheloss.
ifpadding=="max_length":
labels["input_ids"]=[
[(lifl!=tokenizer.pad_token_idelse-100)forlinlabel]forlabelinlabels["input_ids"]
]

model_inputs["labels"]=labels["input_ids"]
returnmodel_inputs

tokenized_dataset=dataset.map(preprocess_function,batched=True,remove_columns=["dialogue","summary","id"])
print(f"Keysoftokenizeddataset:{list(tokenized_dataset['train'].features)}")

#savedatasetstodiskforlatereasyloading
tokenized_dataset["train"].save_to_disk("data/train")
tokenized_dataset["test"].save_to_disk("data/eval")

3. 使用 LoRA 和 bnb int-8 微調(diào) T5

除了 LoRA 技術(shù),我們還使用 bitsanbytes LLM.int8() 把凍結(jié)的 LLM 量化為 int8。這使我們能夠?qū)?FLAN-T5 XXL 所需的內(nèi)存降低到約四分之一。

訓(xùn)練的第一步是加載模型。我們使用 philschmid/flan-t5-xxl-sharded-fp16 模型,它是 google/flan-t5-xxl 的分片版。分片可以讓我們?cè)诩虞d模型時(shí)不耗盡內(nèi)存。

fromtransformersimportAutoModelForSeq2SeqLM

#huggingfacehubmodelid
model_id="philschmid/flan-t5-xxl-sharded-fp16"

#loadmodelfromthehub
model=AutoModelForSeq2SeqLM.from_pretrained(model_id,load_in_8bit=True,device_map="auto")

現(xiàn)在,我們可以使用 peft 為 LoRA int-8 訓(xùn)練作準(zhǔn)備了。

frompeftimportLoraConfig,get_peft_model,prepare_model_for_int8_training,TaskType

#DefineLoRAConfig
lora_config=LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q","v"],
lora_dropout=0.05,
bias="none",
task_type=TaskType.SEQ_2_SEQ_LM
)
#prepareint-8modelfortraining
model=prepare_model_for_int8_training(model)

#addLoRAadaptor
model=get_peft_model(model,lora_config)
model.print_trainable_parameters()

#trainableparams:18874368||allparams:11154206720||trainable%:0.16921300163961817

如你所見,這里我們只訓(xùn)練了模型參數(shù)的 0.16%!這個(gè)巨大的內(nèi)存增益讓我們安心地微調(diào)模型,而不用擔(dān)心內(nèi)存問題。

接下來需要?jiǎng)?chuàng)建一個(gè) DataCollator,負(fù)責(zé)對(duì)輸入和標(biāo)簽進(jìn)行填充,我們使用 Transformers 庫中的 DataCollatorForSeq2Seq 來完成這一環(huán)節(jié)。

fromtransformersimportDataCollatorForSeq2Seq

#wewanttoignoretokenizerpadtokenintheloss
label_pad_token_id=-100
#Datacollator
data_collator=DataCollatorForSeq2Seq(
tokenizer,
model=model,
label_pad_token_id=label_pad_token_id,
pad_to_multiple_of=8
)

最后一步是定義訓(xùn)練超參 ( TrainingArguments)。

fromtransformersimportSeq2SeqTrainer,Seq2SeqTrainingArguments

output_dir="lora-flan-t5-xxl"

#Definetrainingargs
training_args=Seq2SeqTrainingArguments(
output_dir=output_dir,
auto_find_batch_size=True,
learning_rate=1e-3,#higherlearningrate
num_train_epochs=5,
logging_dir=f"{output_dir}/logs",
logging_strategy="steps",
logging_steps=500,
save_strategy="no",
report_to="tensorboard",
)

#CreateTrainerinstance
trainer=Seq2SeqTrainer(
model=model,
args=training_args,
data_collator=data_collator,
train_dataset=tokenized_dataset["train"],
)
model.config.use_cache=False#silencethewarnings.Pleasere-enableforinference!

運(yùn)行下面的代碼,開始訓(xùn)練模型。請(qǐng)注意,對(duì)于 T5,出于收斂穩(wěn)定性考量,某些層我們?nèi)员3?float32 精度。

#trainmodel
trainer.train()

訓(xùn)練耗時(shí)約 10 小時(shí) 36 分鐘,訓(xùn)練 10 小時(shí)的成本約為 13.22 美元。相比之下,如果 在 FLAN-T5-XXL 上進(jìn)行全模型微調(diào) 10 個(gè)小時(shí),我們需要 8 個(gè) A100 40GB,成本約為 322 美元。

我們可以將模型保存下來以用于后面的推理和評(píng)估。我們暫時(shí)將其保存到磁盤,但你也可以使用 model.push_to_hub 方法將其上傳到 Hugging Face Hub。

#SaveourLoRAmodel&tokenizerresults
peft_model_id="results"
trainer.model.save_pretrained(peft_model_id)
tokenizer.save_pretrained(peft_model_id)
#ifyouwanttosavethebasemodeltocall
#trainer.model.base_model.save_pretrained(peft_model_id)

最后生成的 LoRA checkpoint 文件很小,僅需 84MB 就包含了從 samsum 數(shù)據(jù)集上學(xué)到的所有知識(shí)。

4. 使用 LoRA FLAN-T5 進(jìn)行評(píng)估和推理

我們將使用 evaluate 庫來評(píng)估 rogue 分?jǐn)?shù)。我們可以使用 PEFT 和 transformers 來對(duì) FLAN-T5 XXL 模型進(jìn)行推理。對(duì) FLAN-T5 XXL 模型,我們至少需要 18GB 的 GPU 顯存。

importtorch
frompeftimportPeftModel,PeftConfig
fromtransformersimportAutoModelForSeq2SeqLM,AutoTokenizer

#Loadpeftconfigforpre-trainedcheckpointetc.
peft_model_id="results"
config=PeftConfig.from_pretrained(peft_model_id)

#loadbaseLLMmodelandtokenizer
model=AutoModelForSeq2SeqLM.from_pretrained(config.base_model_name_or_path,load_in_8bit=True,device_map={"":0})
tokenizer=AutoTokenizer.from_pretrained(config.base_model_name_or_path)

#LoadtheLoramodel
model=PeftModel.from_pretrained(model,peft_model_id,device_map={"":0})
model.eval()

print("Peftmodelloaded")

我們用測(cè)試數(shù)據(jù)集中的一個(gè)隨機(jī)樣本來試試摘要效果。

fromdatasetsimportload_dataset
fromrandomimportrandrange

#Loaddatasetfromthehubandgetasample
dataset=load_dataset("samsum")
sample=dataset['test'][randrange(len(dataset["test"]))]

input_ids=tokenizer(sample["dialogue"],return_tensors="pt",truncation=True).input_ids.cuda()
#withtorch.inference_mode():
outputs=model.generate(input_ids=input_ids,max_new_tokens=10,do_sample=True,top_p=0.9)
print(f"inputsentence:{sample['dialogue']}
{'---'*20}")

print(f"summary:
{tokenizer.batch_decode(outputs.detach().cpu().numpy(),skip_special_tokens=True)[0]}")

不錯(cuò)!我們的模型有效!現(xiàn)在,讓我們仔細(xì)看看,并使用 test 集中的全部數(shù)據(jù)對(duì)其進(jìn)行評(píng)估。為此,我們需要實(shí)現(xiàn)一些工具函數(shù)來幫助生成摘要并將其與相應(yīng)的參考摘要組合到一起。評(píng)估摘要任務(wù)最常用的指標(biāo)是 rogue_score,它的全稱是 Recall-Oriented Understudy for Gisting Evaluation。與常用的準(zhǔn)確率指標(biāo)不同,它將生成的摘要與一組參考摘要進(jìn)行比較。

importevaluate
importnumpyasnp
fromdatasetsimportload_from_disk
fromtqdmimporttqdm

#Metric
metric=evaluate.load("rouge")

defevaluate_peft_model(sample,max_target_length=50):
#generatesummary
outputs=model.generate(input_ids=sample["input_ids"].unsqueeze(0).cuda(),do_sample=True,top_p=0.9,max_new_tokens=max_target_length)
prediction=tokenizer.decode(outputs[0].detach().cpu().numpy(),skip_special_tokens=True)
#decodeevalsample
#Replace-100inthelabelsaswecan'tdecodethem.
labels=np.where(sample['labels']!=-100,sample['labels'],tokenizer.pad_token_id)
labels=tokenizer.decode(labels,skip_special_tokens=True)

#Somesimplepost-processing
returnprediction,labels

#loadtestdatasetfromdistk
test_dataset=load_from_disk("data/eval/").with_format("torch")

#runpredictions
#thiscantake~45minutes
predictions,references=[],[]
forsampleintqdm(test_dataset):
p,l=evaluate_peft_model(sample)
predictions.append(p)
references.append(l)

#computemetric
rogue=metric.compute(predictions=predictions,references=references,use_stemmer=True)

#printresults
print(f"Rogue1:{rogue['rouge1']*100:2f}%")
print(f"rouge2:{rogue['rouge2']*100:2f}%")
print(f"rougeL:{rogue['rougeL']*100:2f}%")
print(f"rougeLsum:{rogue['rougeLsum']*100:2f}%")

#Rogue1:50.386161%
#rouge2:24.842412%
#rougeL:41.370130%
#rougeLsum:41.394230%

我們 PEFT 微調(diào)后的 FLAN-T5-XXL 在測(cè)試集上取得了 50.38% 的 rogue1 分?jǐn)?shù)。相比之下,flan-t5-base 的全模型微調(diào)獲得了 47.23 的 rouge1 分?jǐn)?shù)。rouge1 分?jǐn)?shù)提高了 3%。

令人難以置信的是,我們的 LoRA checkpoint 只有 84MB,而且性能比對(duì)更小的模型進(jìn)行全模型微調(diào)后的 checkpoint 更好。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • PLM
    PLM
    +關(guān)注

    關(guān)注

    2

    文章

    91

    瀏覽量

    20781
  • AWS
    AWS
    +關(guān)注

    關(guān)注

    0

    文章

    418

    瀏覽量

    24182
  • LoRa模塊
    +關(guān)注

    關(guān)注

    5

    文章

    114

    瀏覽量

    13790
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    794

    瀏覽量

    13010

原文標(biāo)題:使用 LoRA 和 Hugging Face 高效訓(xùn)練大語言模型

文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    摩爾線程與羽人科技完成大語言模型訓(xùn)練測(cè)試

    近日,摩爾線程與羽人科技攜手宣布,雙方已成功實(shí)現(xiàn)夸娥(KUAE)千卡智算集群與羽人系列模型解決方案的訓(xùn)練兼容適配。在本次測(cè)試中,羽人科技通過摩爾線程夸娥千卡智算集群,高效完成了70億參數(shù)羽人7B
    的頭像 發(fā)表于 08-27 16:19 ?397次閱讀

    Hugging Face科技公司推出SmolLM系列語言模型

    7月22日最新資訊,Hugging Face科技公司在語言模型領(lǐng)域再創(chuàng)新高,正式推出了SmolLM系列——一款專為適應(yīng)多樣計(jì)算資源而設(shè)計(jì)的緊湊型語言
    的頭像 發(fā)表于 07-23 16:35 ?201次閱讀

    語言模型的預(yù)訓(xùn)練

    能力,逐漸成為NLP領(lǐng)域的研究熱點(diǎn)。大語言模型的預(yù)訓(xùn)練是這一技術(shù)發(fā)展的關(guān)鍵步驟,它通過在海量無標(biāo)簽數(shù)據(jù)上進(jìn)行訓(xùn)練,使模型學(xué)習(xí)到
    的頭像 發(fā)表于 07-11 10:11 ?249次閱讀

    亞馬遜云攜手AI新創(chuàng)企業(yè)Hugging Face,提升AI模型在定制芯片計(jì)算性能

    Hugging Face作為一家估值為45億美元的公司現(xiàn)已成為了眾多AI研究員和開發(fā)者分享Chatbot和相關(guān)軟件的核心平臺(tái),受到亞馬遜、谷歌、英偉達(dá)等巨頭的青睞。
    的頭像 發(fā)表于 05-23 14:24 ?314次閱讀

    Hugging Face提供1000萬美元免費(fèi)共享GPU

    全球最大的開源AI社區(qū)Hugging Face近日宣布,將提供價(jià)值1000萬美元的免費(fèi)共享GPU資源,以支持開發(fā)者創(chuàng)造新的AI技術(shù)。這一舉措旨在幫助小型開發(fā)者、研究人員和初創(chuàng)公司,對(duì)抗大型AI公司的市場(chǎng)壟斷,推動(dòng)AI領(lǐng)域的公平競(jìng)爭(zhēng)。
    的頭像 發(fā)表于 05-20 09:40 ?519次閱讀

    語言模型:原理與工程時(shí)間+小白初識(shí)大語言模型

    解鎖 我理解的是基于深度學(xué)習(xí),需要訓(xùn)練各種數(shù)據(jù)知識(shí)最后生成自己的的語言理解和能力的交互模型。 對(duì)于常說的RNN是處理短序列的數(shù)據(jù)時(shí)表現(xiàn)出色,耳真正厲害的是Transformer,此框架被推出后直接
    發(fā)表于 05-12 23:57

    Hugging Face推出開源機(jī)器人代碼庫LeRobot

    AI領(lǐng)域的佼佼者Hugging Face近日宣布重磅推出并全面開源其機(jī)器人工具包——LeRobot。這一創(chuàng)新工具包基于史上最大規(guī)模的眾包機(jī)器人數(shù)據(jù)集,為開發(fā)者提供了一個(gè)前所未有的平臺(tái)。
    的頭像 發(fā)表于 05-09 10:32 ?449次閱讀

    【大語言模型:原理與工程實(shí)踐】大語言模型的應(yīng)用

    。 關(guān)于大語言模型是否具備與人類“系統(tǒng)2”相似的能力,存在廣泛的爭(zhēng)議。然而,隨著模型參數(shù)量的增加和大規(guī)模預(yù)訓(xùn)練的實(shí)施,大語言
    發(fā)表于 05-07 17:21

    【大語言模型:原理與工程實(shí)踐】大語言模型的預(yù)訓(xùn)練

    語言模型的核心特點(diǎn)在于其龐大的參數(shù)量,這賦予了模型強(qiáng)大的學(xué)習(xí)容量,使其無需依賴微調(diào)即可適應(yīng)各種下游任務(wù),而更傾向于培養(yǎng)通用的處理能力。然而,隨著學(xué)習(xí)容量的增加,對(duì)預(yù)訓(xùn)練數(shù)據(jù)的需求也相
    發(fā)表于 05-07 17:10

    【大語言模型:原理與工程實(shí)踐】大語言模型的基礎(chǔ)技術(shù)

    全面剖析大語言模型的核心技術(shù)與基礎(chǔ)知識(shí)。首先,概述自然語言的基本表示,這是理解大語言模型技術(shù)的前提。接著,詳細(xì)介紹自然
    發(fā)表于 05-05 12:17

    【大語言模型:原理與工程實(shí)踐】揭開大語言模型的面紗

    更好地?cái)M合訓(xùn)練數(shù)據(jù),并在推理和泛化時(shí)表現(xiàn)出色。此外,特征復(fù)用通過共享參數(shù)提高效率和性能,使得大語言模型能夠更有效地利用學(xué)到的特征。最后,優(yōu)化效果則通過使用更復(fù)雜的優(yōu)化算法和更長(zhǎng)的
    發(fā)表于 05-04 23:55

    ServiceNow、Hugging Face 和 NVIDIA 發(fā)布全新開放獲取 LLM,助力開發(fā)者運(yùn)用生成式 AI 構(gòu)建企業(yè)應(yīng)用

    2024 年 2 月 28 日 - ServiceNow(NYSE:NOW)、Hugging Face 和 NVIDIA 于今日發(fā)布 StarCoder2,其為一系列用于代碼生成的開放獲取大語言
    發(fā)表于 02-29 11:12 ?212次閱讀
    ServiceNow、<b class='flag-5'>Hugging</b> <b class='flag-5'>Face</b> 和 NVIDIA 發(fā)布全新開放獲取 LLM,助力開發(fā)者運(yùn)用生成式 AI 構(gòu)建企業(yè)應(yīng)用

    Hugging Face LLM部署大語言模型到亞馬遜云科技Amazon SageMaker推理示例

    ?本篇文章主要介紹如何使用新的Hugging Face LLM推理容器將開源LLMs,比如BLOOM大型語言模型部署到亞馬遜云科技Amazon SageMaker進(jìn)行推理的示例。我們將
    的頭像 發(fā)表于 11-01 17:48 ?771次閱讀
    <b class='flag-5'>Hugging</b> <b class='flag-5'>Face</b> LLM部署大<b class='flag-5'>語言</b><b class='flag-5'>模型</b>到亞馬遜云科技Amazon SageMaker推理示例

    Hugging Face被限制訪問

    目前尚不清楚 Hugging Face 何時(shí)出現(xiàn)訪問限制問題。雅虎的報(bào)道稱,早在今年 5 月起,就已經(jīng)有用戶在 HF 的論壇上抱怨連接問題。另外有報(bào)道稱,至少從 9 月 12 日起,Hugging
    的頭像 發(fā)表于 10-22 15:51 ?1532次閱讀
    <b class='flag-5'>Hugging</b> <b class='flag-5'>Face</b>被限制訪問

    Hugging Face語言模型優(yōu)化技術(shù)

    von Platen 寫道,使用 Flash Attention 是另一相關(guān)鍵的優(yōu)化,它是大語言模型用來理解輸入標(biāo)記上下文關(guān)系的自注意力層的一種算法,有可能打破輸入標(biāo)記數(shù)量的二次增長(zhǎng)。
    的頭像 發(fā)表于 10-09 16:25 ?670次閱讀