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