1f45bd1e8577af66a05f5e3fadb0b29 通過ORPO對llama進(jìn)行微調(diào) 前言 ORPO是一種新穎的微調(diào)技術(shù),它將傳統(tǒng)的監(jiān)督微調(diào)和偏好對齊階段整合到一個(gè)過程中。這減少了訓(xùn)練所需的計(jì)算資源和時(shí)間。此外,經(jīng)驗(yàn)結(jié)果表明,ORPO在各種模型大小和基準(zhǔn)測試中都超過了其他對齊方法。 在本
ORPO是一種新穎的微調(diào)技術(shù),它將傳統(tǒng)的監(jiān)督微調(diào)和偏好對齊階段整合到一個(gè)過程中。這減少了訓(xùn)練所需的計(jì)算資源和時(shí)間。此外,經(jīng)驗(yàn)結(jié)果表明,ORPO在各種模型大小和基準(zhǔn)測試中都超過了其他對齊方法。 在本文中,我們將使用ORPO和TRL庫來微調(diào)新的Llama 3 8B模型。代碼可以在Google Colab(https://colab.research.google.com/drive/1eHNWg9gnaXErdAa8_mcvjMupbSS6rDvi?usp=sharing)和GitHub上的LLM(https://github.com/mlabonne/llm-course)課程中找到。
指令調(diào)整和偏好對齊是將大型語言模型(LLMs)適應(yīng)特定任務(wù)的關(guān)鍵技術(shù)。傳統(tǒng)上,這涉及到一個(gè)多階段的過程:
然而,研究人員發(fā)現(xiàn)這種方法的一個(gè)局限性。就是監(jiān)督微調(diào)(SFT)可以有效地讓模型適應(yīng)特定領(lǐng)域,這也就是為什么需要偏好對齊階段RLHF,擴(kuò)大受歡迎輸出和不受歡迎輸出之間概率的差距。
imageSFT過程中,不受歡迎概率增加實(shí)證 from ORPO論文
2024年Hong和Lee提出的ORPO通過將SFT和RLHF統(tǒng)一為一個(gè)完整訓(xùn)練過程,為這個(gè)問題提供了一個(gè)優(yōu)雅的解決方案。ORPO修改了標(biāo)準(zhǔn)language model的訓(xùn)練目標(biāo),將負(fù)對數(shù)似然損失與odds ratio(OR)項(xiàng)結(jié)合起來。這種OR損失對不受歡迎的輸出施加了輕微的懲罰,同時(shí)加大獎勵受歡迎的輸出,允許模型同時(shí)學(xué)習(xí)目標(biāo)任務(wù)并與人類偏好對齊。
91e1091deacae95fb17f1b6995b94c2ORPO已經(jīng)在主要的微調(diào)庫中得到實(shí)現(xiàn),比如TRL、Axolotl和LLaMA-Factory。在下一節(jié)中,我們將看到如何使用TRL進(jìn)行操作。
Llama3是Meta開發(fā)的最新一代大型語言模型(LLM)。這些模型是在15萬億token的廣泛數(shù)據(jù)集上訓(xùn)練的(相比之下,Llama2的訓(xùn)練數(shù)據(jù)集為2萬億token)。發(fā)布了兩種模型尺寸:一個(gè)700億參數(shù)的模型和一個(gè)更小的80億參數(shù)的模型。700億參數(shù)的模型已經(jīng)展示了令人印象深刻的性能,在MMLU基準(zhǔn)測試中得分為82,在HumanEval基準(zhǔn)測試中得分為81.7。
Llama3模型還增加了上下文長度,最多可達(dá)8192個(gè)token(Llama2為4096個(gè)token),并且可能通過RoPE擴(kuò)展到32k。此外,這些模型使用了一個(gè)帶有128K-token詞匯表的新分詞器,減少了編碼文本所需token數(shù)量的15%。這個(gè)詞匯表也解釋了從70億到80億參數(shù)的增長。
imageORPO需要一個(gè)偏好數(shù)據(jù)集,包括一個(gè)提示、一個(gè)被選擇的答案和一個(gè)被拒絕的答案。在這個(gè)例子中,我們將使用mlabonne/orpo-dpo- mix-40k,這是一個(gè)由以下高質(zhì)量DPO數(shù)據(jù)集組合而成的數(shù)據(jù)集:
argilla/distilabel-capybara-dpo-7k-binarized
: 高分選擇的答案 >=5(2,882個(gè)樣本) https://huggingface.co/datasets/argilla/distilabel-capybara-dpo-7k-binarized
argilla/distilabel-intel-orca-dpo-pairs
: 高分選擇的答案 >=9,不在GSM8K中(2,299個(gè)樣本) https://huggingface.co/datasets/argilla/distilabel-intel-orca-dpo-pairs
argilla/ultrafeedback-binarized-preferences-cleaned
: 高分選擇的答案 >=5(22,799個(gè)樣本) https://huggingface.co/datasets/argilla/ultrafeedback-binarized-preferences-cleaned
argilla/distilabel-math-preference-dpo
: 高分選擇的答案 >=9(2,181個(gè)樣本) https://huggingface.co/datasets/argilla/distilabel-math-preference-dpo
unalignment/toxic-dpo-v0.2
(541個(gè)樣本) https://huggingface.co/datasets/unalignment/toxic-dpo-v0.2
M4-ai/prm_dpo_pairs_cleaned
(7,958個(gè)樣本) https://huggingface.co/datasets/M4-ai/prm_dpo_pairs_cleaned
jondurbin/truthy-dpo-v0.1
(1,016個(gè)樣本) https://huggingface.co/datasets/jondurbin/truthy-dpo-v0.1 感謝argilla、unalignment、M4-ai和jondurbin提供了源數(shù)據(jù)集。
開始安裝所需的庫:
??pip?install?-U?transformers?datasets?accelerate?peft?trl?bitsandbytes?wandb??
一旦安裝完成,我們可以導(dǎo)入必要的庫,并登錄到W&B(可選):
????import?gc??
????import?os??
??????
????import?torch??
????import?wandb??
????from?datasets?import?load_dataset??
????from?google.colab?import?userdata??
????from?peft?import?LoraConfig,?PeftModel,?prepare_model_for_kbit_training??
????from?transformers?import?(??
????????AutoModelForCausalLM,??
????????AutoTokenizer,??
????????BitsAndBytesConfig,??
????????TrainingArguments,??
????????pipeline,??
????)??
????from?trl?import?ORPOConfig,?ORPOTrainer,?setup_chat_format??
??????
????wb_token?=?userdata.get('wandb')??
????wandb.login(key=wb_token)??
如果你有一塊較新的GPU,你還應(yīng)該能夠使用Flash Attention庫來替換默認(rèn)的熱切關(guān)注實(shí)現(xiàn),以一個(gè)更有效的方式來實(shí)現(xiàn)。
????if?torch.cuda.get_device_capability()[0]?>=?8:??
????????!pip?install?-qqq?flash-attn??
????????attn_implementation?=?"flash_attention_2"??
????????torch_dtype?=?torch.bfloat16??
????else:??
????????attn_implementation?=?"eager"??
????????torch_dtype?=?torch.float16??
接下來,我們將使用bitsandbytes以4位精度加載Llama 3 8B模型。然后,我們使用PEFT為QLoRA設(shè)置LoRA配置。我還使用了方便的setup_chat_format()函數(shù)來修改模型和為ChatML支持的分詞器。它會自動應(yīng)用這個(gè)聊天模板,添加特殊的令牌,并調(diào)整模型的嵌入層的大小以匹配新的詞匯表大小。 請注意,你需要提交請求才能訪問meta-llama/Meta-Llama-3-8B,并且要登錄到你的Hugging Face賬戶;蛘,你可以加載未封閉的模型副本,如NousResearch/Meta--Llama-3-8B。
????#?Model??
????base_model?=?"meta-llama/Meta-Llama-3-8B"??
????new_model?=?"OrpoLlama-3-8B"??
??????
????#?QLoRA?config??
????bnb_config?=?BitsAndBytesConfig(??
????????load_in_4bit=True,??
????????bnb_4bit_quant_type="nf4",??
????????bnb_4bit_compute_dtype=torch_dtype,??
????????bnb_4bit_use_double_quant=True,??
????)??
??????
????#?LoRA?config??
????peft_config?=?LoraConfig(??
????????r=16,??
????????lora_alpha=32,??
????????lora_dropout=0.05,??
????????bias="none",??
????????task_type="CAUSAL_LM",??
????????target_modules=['up_proj',?'down_proj',?'gate_proj',?'k_proj',?'q_proj',?'v_proj',?'o_proj']??
????)??
??????
????#?Load?tokenizer??
????tokenizer?=?AutoTokenizer.from_pretrained(base_model)??
??????
????#?Load?model??
????model?=?AutoModelForCausalLM.from_pretrained(??
????????base_model,??
????????quantization_config=bnb_config,??
????????device_map="auto",??
????????attn_implementation=attn_implementation??
????)??
????model,?tokenizer?=?setup_chat_format(model,?tokenizer)??
????model?=?prepare_model_for_kbit_training(model)??
現(xiàn)在模型已經(jīng)準(zhǔn)備好進(jìn)行訓(xùn)練,我們可以處理數(shù)據(jù)集。我們加載mlabonne/orpo-dpo-mix-40k,并使用apply_chat_template()函數(shù)將“chosen”和“rejected”列轉(zhuǎn)換為ChatML格式。請注意,我只使用了1,000個(gè)樣本,而不是整個(gè)數(shù)據(jù)集,因?yàn)檫\(yùn)行起來會花費(fèi)太長時(shí)間。
????dataset_name?=?"mlabonne/orpo-dpo-mix-40k"??
????dataset?=?load_dataset(dataset_name,?split="all")??
????dataset?=?dataset.shuffle(seed=42).select(range(10))??
??????
????def?format_chat_template(row):??
????????row["chosen"]?=?tokenizer.apply_chat_template(row["chosen"],?tokenize=False)??
????????row["rejected"]?=?tokenizer.apply_chat_template(row["rejected"],?tokenize=False)??
????????return?row??
??????
????dataset?=?dataset.map(??
????????format_chat_template,??
????????num_proc=?os.cpu_count(),??
????)??
????dataset?=?dataset.train_test_split(test_size=0.01)??
首先,我們需要設(shè)置一些超參數(shù): 學(xué)習(xí)率:與傳統(tǒng)的SFT或者DPO相比,ORPO使用的學(xué)習(xí)率非常低。這個(gè)值8e-6來自原始論文,大致對應(yīng)于SFT的學(xué)習(xí)率1e-5和DPO的學(xué)習(xí)率5e-6。我建議在真正的微調(diào)中將其增加到大約1e-6。 beta:它是論文中的參數(shù),其默認(rèn)值為0.1。來自原始論文的一個(gè)附錄顯示了如何通過消融研究選擇它。 其他參數(shù),如最大長度和批量大小,都設(shè)置為盡可能多地使用VRAM(在此配置中約為20 GB)。理想情況下,我們將對模型進(jìn)行3-5個(gè)周期的訓(xùn)練,但這里我們將堅(jiān)持1個(gè)周期。 最后,我們可以使用ORPOTrainer來訓(xùn)練模型,它充當(dāng)一個(gè)包裝器。
????orpo_args?=?ORPOConfig(??
????????learning_rate=8e-6,??
????????beta=0.1,??
????????lr_scheduler_type="linear",??
????????max_length=1024,??
????????max_prompt_length=512,??
????????per_device_train_batch_size=2,??
????????per_device_eval_batch_size=2,??
????????gradient_accumulation_steps=4,??
????????optim="paged_adamw_8bit",??
????????num_train_epochs=1,??
????????evaluation_strategy="steps",??
????????eval_steps=0.2,??
????????logging_steps=1,??
????????warmup_steps=10,??
????????report_to="wandb",??
????????output_dir="./results/",??
????)??
??????
????trainer?=?ORPOTrainer(??
????????model=model,??
????????args=orpo_args,??
????????train_dataset=dataset["train"],??
????????eval_dataset=dataset["test"],??
????????peft_config=peft_config,??
????????tokenizer=tokenizer,??
????)??
????trainer.train()??
????trainer.save_model(new_model)??
在L4 GPU上對這1000個(gè)樣本進(jìn)行模型訓(xùn)練大約需要2個(gè)小時(shí)。讓我們查看W&B的圖:
image當(dāng)loss降低時(shí),受歡迎輸出和不受歡迎輸出之間的差異并不明顯:平均邊界和準(zhǔn)確度分別僅略高于0和0.5。
在原始論文中,作者們在
Anthropic/hh-rlhf
數(shù)據(jù)集(161k個(gè)樣本)上訓(xùn)練模型進(jìn)行了10個(gè)epochs,這比我們現(xiàn)在運(yùn)行的時(shí)間要長得多。他們還對Llama3進(jìn)行了實(shí)驗(yàn),并且友好地與我分享了他們的日志(感謝Jiwoo Hong)。
在本教程的結(jié)尾,讓我們將QLoRA適配器與基礎(chǔ)模型合并,并將其推送到Hugging Face Hub。
????#?Flush?memory??
????del?trainer,?model??
????gc.collect()??
????torch.cuda.empty_cache()??
??????
????#?Reload?tokenizer?and?model??
????tokenizer?=?AutoTokenizer.from_pretrained(base_model)??
????model?=?AutoModelForCausalLM.from_pretrained(??
????????base_model,??
????????low_cpu_mem_usage=True,??
????????return_dict=True,??
????????torch_dtype=torch.float16,??
????????device_map="auto",??
????)??
????model,?tokenizer?=?setup_chat_format(model,?tokenizer)??
??????
????#?Merge?adapter?with?base?model??
????model?=?PeftModel.from_pretrained(model,?new_model)??
????model?=?model.merge_and_unload()??
??????
????model.push_to_hub(new_model,?use_temp_dir=False)??
????tokenizer.push_to_hub(new_model,?use_temp_dir=False)??
恭喜,我們完成了Llama3:mlabonne/OrpoLlama-3-8B的快速微調(diào)。你可以使用這個(gè)Hugging Face Space(這里有一個(gè)notebook,讓你自己來實(shí)踐)來使用它。盡管模型訓(xùn)練不足,正如W&B曲線所強(qiáng)調(diào)的那樣,我還是使用LLM AutoEval在Nous的基準(zhǔn)測試套件上進(jìn)行了一些評估。
image我們的ORPO微調(diào)實(shí)際上相當(dāng)不錯,并且提高了基礎(chǔ)模型在每個(gè)基準(zhǔn)測試上的性能。這是令人鼓舞的,并且很可能意味著在整個(gè)40k樣本上進(jìn)行微調(diào)將帶來很好的結(jié)果。
對于開源社區(qū)來說,這是一個(gè)激動人心的時(shí)刻,越來越多的高質(zhì)量開放權(quán)重模型被發(fā)布。閉源和開放權(quán)重模型之間的差距正在逐漸縮小,而微調(diào)是獲取您用例最佳性能的重要工具。
image在這篇教程中,我們介紹了ORPO算法,并解釋了它如何將SFT(監(jiān)督式微調(diào))和RLHF統(tǒng)一為單一的過程。然后,我們使用TRL(Transformer Reinforcement Learning)對一個(gè)定制的偏好數(shù)據(jù)集上的Llama3-8B進(jìn)行微調(diào)。最終模型展示了令人鼓舞的結(jié)果,并突顯了ORPO作為新的微調(diào)范式的潛力。
我希望這很有幫助,并推薦你運(yùn)行Colab筆記本來微調(diào)你自己的Llama3模型。在將來的文章中,我們將看到如何創(chuàng)建高質(zhì)量的數(shù)據(jù)集——這是一個(gè)經(jīng)常被忽視的點(diǎn)。
機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)構(gòu)建(下)
閱讀華為Mate品牌盛典:HarmonyOS NEXT加持下游戲性能得到充分釋放
閱讀實(shí)現(xiàn)對象集合與DataTable的相互轉(zhuǎn)換
閱讀鴻蒙NEXT元服務(wù):論如何免費(fèi)快速上架作品
閱讀算法與數(shù)據(jù)結(jié)構(gòu) 1 - 模擬
閱讀5. Spring Cloud OpenFeign 聲明式 WebService 客戶端的超詳細(xì)使用
閱讀Java代理模式:靜態(tài)代理和動態(tài)代理的對比分析
閱讀Win11筆記本“自動管理應(yīng)用的顏色”顯示規(guī)則
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請發(fā)郵件[email protected]
湘ICP備2022002427號-10 湘公網(wǎng)安備:43070202000427號© 2013~2025 haote.com 好特網(wǎng)