作者:1050Ti全量微調(diào).,東北大學(xué)軟件工程
微調(diào)實(shí)戰(zhàn)經(jīng)歷
本次微調(diào)經(jīng)驗(yàn)分享依據(jù)于我們?cè)?023年參加的“第2屆·百度搜索創(chuàng)新大賽——搜索答案組織”整個(gè)比賽過(guò)程。
我們團(tuán)隊(duì)選擇的基座模型是ChatGLM3-6B-Base模型,訓(xùn)練數(shù)據(jù)集為官方提供的數(shù)據(jù)集(9000條),訓(xùn)練方法為LORA sft 監(jiān)督微調(diào)。
最終結(jié)果:score 36.12--ROUGE-L 41.03--BLEU-4 31.22,東三省排名第1名,全國(guó)最終排名為44/220.
開(kāi)始微調(diào)(SFT)
準(zhǔn)備微調(diào)框架
微調(diào)框架選擇的是github上面的llama-factory開(kāi)源項(xiàng)目
gitclonehttps://github.com/hiyouga/LLaMA-Factory.git
cdLLaMA-Factory
pipinstall-rrequirements.txt
推薦python=3.10,如果要在 Windows 平臺(tái)上開(kāi)啟量化 LoRA(QLoRA),需要安裝預(yù)編譯的 bitsandbytes 庫(kù), 支持 CUDA 11.1 到 12.1
pipinstallhttps://github.com/jllllll/bitsandbytes-windows-webui/releases/download/wheels/bitsandbytes-0.39.1-py3-none-win_amd64.whl
加載數(shù)據(jù)集
在data文件夾下面創(chuàng)建xxx.json命名格式的數(shù)據(jù)集json文件,本人設(shè)置的是baidutrain.json
json文件格式如下
[ { "query":"王者榮耀鉆石奪寶幸運(yùn)值滿是多少", "refs":[ "積分奪寶幸運(yùn)值滿值為360點(diǎn),鉆石奪寶幸運(yùn)值滿值為200點(diǎn),但是奪寶幸運(yùn)值滿了之后還需要一抽才能獲得水晶,所以積分奪寶361抽必定獲得水晶,鉆石奪寶201抽必定獲得水晶。", "王者鉆石奪寶幸運(yùn)值滿是200。", "1、最高的幸運(yùn)值上限是200,每抽一次會(huì)獲得1點(diǎn)幸運(yùn)值。王者榮耀里面的鉆石奪寶幸運(yùn)值達(dá)到200就滿了,也就是說(shuō)當(dāng)幸運(yùn)值滿200時(shí),再奪寶一次是必出一個(gè)王者水晶的,擁有王者水晶可以到水晶商店里面去兌換物品了,兌換的物品都是永久的。", "幸運(yùn)值滿值是360,玩家在抽361的時(shí)候是保底必出水晶,這個(gè)保底是人人都能抽出水晶的,也就是100%可以讓玩家得到水晶,榮耀水晶的概率是0.8%,但是玩家們?nèi)绻诓粩嘣黾映楠?jiǎng)的次數(shù),那么抽出水晶的概率也會(huì)增加,想要抽出水晶的玩家可以將361次當(dāng)做保底的次數(shù)。", "玩家獲取王者水晶之后,可以使用該道具兌換王者商店中的獎(jiǎng)勵(lì),包含了回城特效、英雄、中級(jí)品質(zhì)的皮膚等獎(jiǎng)勵(lì)。" ], "answer":"《王者榮耀》鉆石奪寶幸運(yùn)值滿值為200點(diǎn)。 鉆石奪寶幸運(yùn)值滿200后再抽一次必出一個(gè)王者水晶,玩家獲取王者水晶之后,可以使用該道具兌換王者商店中的獎(jiǎng)勵(lì),其中包含了回城特效、英雄、中級(jí)品質(zhì)的皮膚等,兌換的物品永久有效。" }, { "query":"王手是什么意思", "refs":[ "一、原神王手。王手這個(gè)詞出現(xiàn)在PV短片《雪姬逢椿》中。王手是小神里說(shuō)的,小神里很可愛(ài),說(shuō)王手二字的聲音也不錯(cuò)。所以玩家說(shuō)王手二字讓我氪了648。二、王手原意。王手是日本將棋的說(shuō)法,與中國(guó)象棋將軍的用法相似。意思是將軍(棋步),將軍。", "一、原神王手在PV短片——「雪霽逢椿」中出現(xiàn)了王手這個(gè)詞。王手是由小神里說(shuō)出的,小神里十分可愛(ài),說(shuō)王手二字時(shí)聲音也好聽(tīng)。所以玩家就表示王手二字讓我氪了648。二、王手原本意思王手是日本將棋的說(shuō)法,和中國(guó)象棋將軍的用法差不多。是將軍(的棋步),將一軍的意思。", "王手是日本將棋的說(shuō)法,與中國(guó)象棋將軍的用法相似。意思是將軍(棋步),將軍。", "其中的王手是指,如能下了能擒拿對(duì)方王將的一手,類似于象棋里的將軍。稱之為王手。", "王手,男,浙江溫州市人。1981年開(kāi)始發(fā)表小說(shuō)。近年小說(shuō)散見(jiàn)于《收獲》《人民文學(xué)》《當(dāng)代》《鐘山》《花城》《作家》《山花》等刊,出版中短篇小說(shuō)集《火藥槍》《柯依娜一個(gè)人》《獅身人面》" ], "answer":"王手是指下了這步棋能擒拿對(duì)方王將的一手,類似于象棋里的將軍,是日本將棋中的一種說(shuō)法。 此外,王手還是中國(guó)作家協(xié)會(huì)會(huì)員,一級(jí)作家,出版中短篇小說(shuō)集《火藥槍》《柯依娜一個(gè)人》等。" } ]
一定要將數(shù)據(jù)集所在的json文件加載到dataset_info.json中!!!!!!!!
"baidu_train":{ "file_name":"baidutrain.json", "columns":{ "prompt":"",#系統(tǒng)prompt "query":"refs"+"query",#輸入 "response":"answer",#輸出 "history":""#歷史對(duì)話 } }
啟動(dòng)微調(diào)
使用sft進(jìn)行微調(diào)
CUDA_VISIBLE_DEVICES=0pythonwork/jwx/ChatGLM-Efficient-Tuning-main/src/train_bash.py --stagesft#微調(diào)方式 --model_name_or_pathwork/jwx/ChatGLM3-main/model#模型路徑 --do_train --dataset_dirwork/jwx/ChatGLM-Efficient-Tuning-main/data#數(shù)據(jù)集文件夾 --datasetbaidu_dev,baidu_train#數(shù)據(jù)集 --finetuning_typelora#微調(diào)方法 --max_source_length2048#最大長(zhǎng)度 --max_target_length512 --learning_rate3e-05#學(xué)習(xí)率 --num_train_epochs3.0#學(xué)習(xí)輪數(shù) --max_samples10000 --lora_rank8#lora訓(xùn)練的秩 --lora_dropout0.1 --lora_targetq_proj,v_proj#lora作用層 --resume_lora_trainingTrue --output_dirsaves/output#輸出微調(diào)的文件夾 --fp16True#開(kāi)啟fp16微調(diào) --per_device_train_batch_size4 --gradient_accumulation_steps4 --lr_scheduler_typecosine --max_grad_norm1.0 --logging_steps5 --save_steps1000
對(duì)于所有“基座”(Base)模型,–template 參數(shù)可以是 default, alpaca, vicuna 等任意值。但“對(duì)話”(Chat)模型請(qǐng)務(wù)必使用對(duì)應(yīng)的模板。
更多參數(shù)信息:
https://github.com/hiyouga/ChatGLM-Efficient-Tuning/wiki/%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95
合并模型并導(dǎo)出
pythonsrc/export_model.py --model_name_or_pathwork/jwx/ChatGLM3-main/model --adapter_name_or_pathsaves/output --templatedefault --finetuning_typelora --export_dirpath_to_export --export_size7 --export_legacy_formatFalse
RW
獎(jiǎng)勵(lì)模型訓(xùn)練
數(shù)據(jù)準(zhǔn)備
獎(jiǎng)勵(lì)模型,作為RL中的critic,應(yīng)該讓模型知道什么是正確的答案和什么是錯(cuò)誤的答案,因此需要在數(shù)據(jù)集上進(jìn)行對(duì)于不同答案的一個(gè)打分情況,來(lái)讓機(jī)器進(jìn)行學(xué)習(xí)。格式如下: [ 0:{ input:"", instruction:"Whatarethethreeprimarycolors?", output:[ 0:"Thethreeprimarycolorsarered,blue,andyellow.Thesecolorsarecalledprimarybecausetheycannotbecreatedbymixingothercolorsandallothercolorscanbemadebycombiningtheminvariousproportions.Intheadditivecolorsystem,usedforlight,theprimarycolorsarered,green,andblue(RGB).", 1:"Red,Yellow,andGreen." ] }, 1:{ input:"4/16", instruction:"Explainwhythefollowingfractionisequivalentto1/4", output:[ 0:"Thefraction4/16isequivalentto1/4becausebothnumeratorsanddenominatorsaredivisibleby4.Dividingboththetopandbottomnumbersby4yieldsthefraction1/4.", 1:"1/4isthesameas1/4." ] } ]
運(yùn)行微調(diào)
微調(diào)之后的獎(jiǎng)勵(lì)模型不可以直接進(jìn)行使用,因?yàn)閞w模型的輸出是一個(gè)打分,相當(dāng)于RL中的critic。
CUDA_VISIBLE_DEVICES=0pythonsrc/train_bash.py --stagerm --do_train --model_name_or_pathpath_to_llama_model --adapter_name_or_pathpath_to_sft_checkpoint#sft模型微調(diào)的權(quán)重文件,可加可不加 --create_new_adapter --datasetcomparison_gpt4_zh --templatedefault --finetuning_typelora --lora_targetq_proj,v_proj --output_dirpath_to_rm_checkpoint --per_device_train_batch_size2 --gradient_accumulation_steps4 --lr_scheduler_typecosine --logging_steps10 --save_steps1000 --learning_rate1e-6 --num_train_epochs1.0 --plot_loss --fp16
RLHF
準(zhǔn)備actor和critic
actor:對(duì)應(yīng)的是sft輸出的權(quán)重文件
critic:對(duì)應(yīng)的是RW輸出的權(quán)重文件
運(yùn)行RLHF
CUDA_VISIBLE_DEVICES=0pythonsrc/train_bash.py --stageppo --do_trainTrue --model_name_or_pathbaichuan-inc/baichuan-7B --adapter_name_or_pathsaves/Baichuan-7B-Base/lora/sft#sft輸出的權(quán)重文件 --finetuning_typelora --templatedefault --dataset_dirdata --datasetalpaca_gpt4_en --cutoff_len1024 --learning_rate5e-05 --num_train_epochs3.0 --max_samples100000 --per_device_train_batch_size4 --gradient_accumulation_steps4 --lr_scheduler_typecosine --max_grad_norm1.0 --logging_steps5 --save_steps100 --warmup_steps0 --lora_rank8 --lora_dropout0.1 --lora_targetW_pack --create_new_adapterTrue --output_dirsaves/Baichuan-7B-Base/lora/train_2024-03-01-09-49-43 --fp16True --reward_modelsaves/Baichuan-7B-Base/lora/rw#rw輸出的權(quán)重文件 --reward_model_typelora --plot_lossTrue
多卡訓(xùn)練
使用accelerate進(jìn)行訓(xùn)練
accelerateconfig#首先配置分布式環(huán)境 acceleratelaunchsrc/train_bash.py --stagesft#微調(diào)方式 --model_name_or_pathwork/jwx/ChatGLM3-main/model#模型路徑 --do_train --dataset_dirwork/jwx/ChatGLM-Efficient-Tuning-main/data#數(shù)據(jù)集文件夾 --datasetbaidu_dev,baidu_train#數(shù)據(jù)集 --finetuning_typelora#微調(diào)方法 --max_source_length2048#最大長(zhǎng)度 --max_target_length512 --learning_rate3e-05#學(xué)習(xí)率 --num_train_epochs3.0#學(xué)習(xí)輪數(shù) --max_samples10000 --lora_rank8#lora訓(xùn)練的秩 --lora_dropout0.1 --lora_targetq_proj,v_proj#lora作用層 --resume_lora_trainingTrue --output_dirsaves/output#輸出微調(diào)的文件夾 --fp16True#開(kāi)啟fp16微調(diào) --per_device_train_batch_size4 --gradient_accumulation_steps4 --lr_scheduler_typecosine --max_grad_norm1.0 --logging_steps5 --save_steps1000#參數(shù)同上
使用deepspeed進(jìn)行訓(xùn)練
deepspeed--num_gpus8--master_port=9901src/train_bash.py --deepspeedds_config.json --stagesft#微調(diào)方式 --model_name_or_pathwork/jwx/ChatGLM3-main/model#模型路徑 --do_train --dataset_dirwork/jwx/ChatGLM-Efficient-Tuning-main/data#數(shù)據(jù)集文件夾 --datasetbaidu_dev,baidu_train#數(shù)據(jù)集 --finetuning_typelora#微調(diào)方法 --max_source_length2048#最大長(zhǎng)度 --max_target_length512 --learning_rate3e-05#學(xué)習(xí)率 --num_train_epochs3.0#學(xué)習(xí)輪數(shù) --max_samples10000 --lora_rank8#lora訓(xùn)練的秩 --lora_dropout0.1 --lora_targetq_proj,v_proj#lora作用層 --resume_lora_trainingTrue --output_dirsaves/output#輸出微調(diào)的文件夾 --fp16True#開(kāi)啟fp16微調(diào) --per_device_train_batch_size4 --gradient_accumulation_steps4 --lr_scheduler_typecosine --max_grad_norm1.0 --logging_steps5 --save_steps1000
心得分享
下面我將本次比賽微調(diào)訓(xùn)練的得分的過(guò)程分享給大家
審核編輯:黃飛
-
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8418瀏覽量
132655 -
大模型
+關(guān)注
關(guān)注
2文章
2451瀏覽量
2718
原文標(biāo)題:詳解大模型微調(diào)全流程
文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語(yǔ)言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論