本項目旨在指令微調多類基座大模型,實現LORA + DeepSpeed + 單卡/多卡微調,目前已測試的模型見下表:
| 測試模型 | 語言 | 測試權重 |
|---|---|---|
| Chinese-LLaMA-Alpaca | 中文 | chinese-alpaca-plus-lora-13b |
| Open-LLaMA | 英文 | open_llama_13b |
| open_llama_7b | ||
| BELLE | 中文 | BELLE-LLaMA-EXT-13B |
| BELLE-LLaMA-EXT-7B | ||
| BLOOM | 英文 | bloomz-1b7 |
| bloomz-7b1 | ||
| ChatGLM-6B | 中文 | ChatGLM-6B |
| ChatGLM2-6B | ||
| 百川 | 中文 | baichuan-7B |
| 中文 | baichuan-13B-Chat | |
| TigerBot | 中文 | tigerbot-7b-sft |
| tigerbot-7b-base | ||
| Pythia | 英文 | pythia-1b-deduped |
| pythia-12b-deduped |
TODO:
這裡我們使用CCKS2023-PromptCBLUE中文醫療大模型評測基準比賽中的數據集為例。此數據集將“中文醫療信息處理挑戰榜CBLUE”數據集進行了改造,將16種不同的醫療場景NLP任務全部轉化為基於提示的語言生成任務,形成首個中文醫療場景的LLM評測基準。
PromptCBLUE 採用94個指令微調模板,對CBLUE 基準中的各個任務進行。經過改造後,醫療文本NLP 數據集都將轉化為如下格式。 input 字段字符串是LLM 模型的輸入,target 字段也是一個字符串,則是LLM 模型需要生成的文本序列。
{
"input" : str,
"target" : str,
"type" : str,
"answer_choices" : str,
"sample_id" : str,
}為了方便快速驗證,我們抽取了其中的CHIP-CTC子數據集,包括訓練集6000 條,驗證集1100 條,測試集1060 條。下載地址
模型可以下載到本地,訓練時給model_name_or_path參數傳入模型所在的路徑,也可以只傳模型在Hugging Face 上的名字,例如THUDM/chatglm-6b ,代碼會自動下載模型。
部分LLaMA 類的模型需要進行模型轉換,涉及到的模型有:chinese-alpaca-plus-lora-13b,轉換方法參考這裡。
conda create -n llms_train python=3.9
conda activate llms_train
pip install -r requirements.txt在config.py文件裡有各類模型的LoRA 配置文件,可以自定義修改。配置文件內容舉例如下:
' glm ' : {
" lora_r " : 8,
" lora_alpha " : 32,
" lora_dropout " : 0.05,
" lora_target_modules " : " query_key_value,dense,dense_h_to_4h,dense_4h_to_h " ,
" modules_to_save " : " null "
},字段說明:
lora_r :LoRA 的秩lora_alpha : lora_dropout :LoRA 層的dropout 概率;lora_target_modules :LoRA 掛在哪些modules 上;modules_to_save :除了LoRA 層外,還有哪些modules 被設為可訓練的,並且會被保存在最後的checkpoint 中。 這裡採用ZeRO2 配置:
{
" fp16 " : {
" enabled " : " auto " ,
" loss_scale " : 0,
" loss_scale_window " : 100,
" initial_scale_power " : 16,
" hysteresis " : 2,
" min_loss_scale " : 1e-10
},
" bf16 " : {
" enabled " : " auto "
},
" zero_optimization " : {
" stage " : 2,
" allgather_partitions " : true,
" allgather_bucket_size " : 5e8,
" overlap_comm " : true,
" reduce_scatter " : true,
" reduce_bucket_size " : 5e8,
" contiguous_gradients " : true
},
" gradient_accumulation_steps " : " auto " ,
" gradient_clipping " : " auto " ,
" steps_per_print " : 2000,
" train_batch_size " : " auto " ,
" train_micro_batch_size_per_gpu " : " auto " ,
" wall_clock_breakdown " : false
}關於多卡並行訓練的策略,可參考這裡。
config.py還有幾個其他配置: MODEL_MAP 、 TOKENIZER_MAP 、 SPECIAL_IDS ,根據model_type參數選取不同的Model calss、Tokenizer Class,根據model_name_or_path選取特殊的token id。 model_type取值及對應的模型如下:
llama :可調用chinese-alpaca-plus-lora-13b、open_llama_13b、open_llama_7b、BELLE-LLaMA-EXT-13B、BELLE-LLaMA-EXT-7B、tigerbot-7b-sft、tigerbot-7b-base 等LLaMA 類模型。glm :可調用ChatGLM-6B、ChatGLM2-6B。bloom :可調用bloomz-1b7、bloomz-7b1 等BLOOM 類模型。pythia :可調用pythia-1b-deduped、pythia-12b-deduped 等Pythia 類模型。運行scripts/train.sh 。其文件內容如下:
LR=2e-4
model_name_or_path= " ../models/pythia-12b-deduped " # LLM底座模型路径,或者是huggingface hub上的模型名称
model_type= ' pythia '
your_data_path= " ./datasets/PromptCBLUE " # 填入数据集所在的文件夹路径
your_checkpopint_path= " ./experiments/outputs " # 填入用来存储模型的路径
max_steps=100
max_source_length=256
max_target_length=16
peft_path= " " # 如果之前训练过,且存储了peft权重,则设置为peft权重的文件夹路径
CUDA_VISIBLE_DEVICES=0 torchrun --nproc_per_node 1 train.py
--deepspeed configs/ds_zero2_no_offload.json
--do_train
--do_eval
--model_name_or_path $model_name_or_path
--model_type $model_type
--use_lora True
--fp16
--train_file $your_data_path /train_CHIP-CTC.json
--validation_file $your_data_path /dev_CHIP-CTC.json
--preprocessing_num_workers 8
--cache_dir $your_data_path
--prompt_column input
--response_column target
--output_dir $your_checkpopint_path /test-pythia-12b-deduped-lora- $LR
--overwrite_output_dir
--max_source_length $max_source_length
--max_target_length $max_target_length
--per_device_train_batch_size 4
--per_device_eval_batch_size 4
--gradient_accumulation_steps 16
--max_steps $max_steps
--logging_steps 10
--save_strategy steps
--save_steps 50
--save_total_limit 3
--evaluation_strategy steps
--eval_steps 50
--learning_rate $LR 參數含義如下:
deepspeed :deepspeed 的配置文件路徑do_train :bool,是否開啟訓練do_eval :bool,是否在驗證集上驗證,如果evaluation_strategy不等於"no" ,則會設為Truemodel_name_or_path :模型在hugging face 上的名字,或者是已經存在本地的路徑model_type :model 的類型,可選項包括llama 、 glm 、 bloom 、 pythia 、 baichuan 、 otheruse_lora :使用lora 微調,默認為True ,否則是全量微調fp16 :是否使用fp16 (混合)精度來訓練train_file :訓練集數據文件validation_file :驗證集數據文件preprocessing_num_workers :在對數據進行批量分詞時的worker 數cache_dir :HF 模型的緩存路徑prompt_column :樣本里輸入的字段名response_column :樣本里輸出的字段名output_dir :訓練結果保存路徑overwrite_output_dir :如果設為True ,則覆蓋output 文件夾max_source_length :輸入文本的最大長度max_target_length :輸出文本的最大長度pre_device_train_batch_size :訓練時每張卡上的batch sizepre_device_eval_batch_size :驗證/測試時每張卡上的batch sizegradient_accumulation_steps :梯度累積輪數max_steps :訓練輪數,一輪包含樣本數: GPU数量* pre_device_train_batch_size * gradient_accumulation_stepslogging_steps :每多少輪打印logsave_strategy :訓過程中按照steps 數還是epoch 數來保存中間結果,可選值為no 、 steps 、 epochsave_steps :每多少steps 保存checkpointevaluation_strategy :按照steps 數還是epoch 數來跑驗證集,可選值為no 、 steps 、 epocheval_steps :每多少steps 跑一次驗證learning_rate :學習率如果是多卡訓練,請對應修改sh 中的: CUDA_VISIBLE_DEVICES=0 torchrun --nproc_per_node 1 。例如4 卡訓練可以改為: CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --nproc_per_node 4 。
注意:
model_name_or_path要和model_type正確對應。bos_id 、 eos_id 、 pad_id並不是完全一致的,在config.py裡的SPECIAL_IDS指定了各個模型的special token id,除了已經測試過的模型外,需要自己手動添加。運行推理腳本:
CUDA_VISIBLE_DEVICES=0 python inference.py
--model_name_or_path experiments/outputs/PromptCBLUE-chatglm-6b-lora-2e-4
--ckpt_path experiments/outputs/PromptCBLUE-chatglm-6b-lora-2e-4/checkpoint-9690
--model_type glm
--data_file ./datasets/PromptCBLUE/test.json
--cache_dir ./datasets/PromptCBLUE
--use_lora問題記錄:
/work目錄沒有權限,要加環境變量: export HF_MODULES_CACHE=~/.cache/huggingfacechmod u+x xxx.sh 持續更新……
感謝社區優秀的開源大模型:ChatGLM-6B (ChatGLM2)、Chinese-LLaMA-Alpaca、openllama、BLOOM、BELLE、Pythia、GPTNeoX、百川。
此項目還參考了以下優秀的開源項目:
PromptCBLUE
sentencepiece_chinese_bpe
Chatglm_lora_multi-gpu
ChatGLM-Efficient-Tuning
zero_nlp
本項目僅供學習研究使用。模型的訓練結果受模型本身結構、隨機性、訓練參數、數據集等因素影響,本項目不對模型訓練的結果負責,也不對模型的生成內容負責,也不對使用本項目造成的任何損失承擔責任。本項目由個人在業餘時間開發並維護,因投入時間有限、作者水平有限,無法保證相關問題回复的時效性,不過後續會建立交流群,到時歡迎大家一起學習、互幫互助。
如果此項目對你有幫助,請按下面格式引用:
@software{LLMs_train,
title = {{LLMs_train: A Set of Code to Fine-Tune Large Language Models}},
author = {Xudong Li},
year = {2023},
url = {https://www.github.com/5663015/LLMs_train},
}