本文首先分析微調腳本trainer.sh的內容,再剖析ChatGLM是如何與Huggingface平臺對接,實現transformers庫的API直接調用ChatGLM模型,最後定位到了ChatGLM模型的源碼文件。
腳本分析
微調腳本:
PRE_SEQ_LEN=128
LR=2e-2
CUDA_VISIBLE_DEVICES=0 python3 main.py \
--do_train \
--train_file AdvertiseGen/train.json \
--validation_file AdvertiseGen/dev.json \
--prompt_column content \
--response_column summary \
--overwrite_cache \
--model_name_or_path THUDM/chatglm-6b \
--output_dir output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR \
--overwrite_output_dir \
--max_source_length 64 \
--max_target_length 64 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 16 \
--predict_with_generate \
--max_steps 3000 \
--logging_steps 10 \
--save_steps 1000 \
--learning_rate $LR \
--pre_seq_len $PRE_SEQ_LEN \
--quantization_bit 4
腳本配置項分析:
PRE_SEQ_LEN=128
: 定義了序列長度爲128。這個參數通常用於設置輸入序列的最大長度。LR=2e-2
: 定義了學習率爲0.02。學習率是模型訓練中的一個重要超參數,它決定了模型參數更新的幅度。CUDA_VISIBLE_DEVICES=0
: 這個環境變量用於設置哪些GPU將被TensorFlow框架使用。在這個腳本中,只使用了第一個GPU(索引爲0)。python3 main.py
: 這一行開始執行主訓練腳本main.py。--do_train
: 這個標誌告訴腳本執行訓練過程。--prompt_column content
: 這個標誌指定了輸入列的名稱,這裏稱爲content。這是模型接收的輸入列的名稱。--response_column summary
: 這個標誌指定了輸出列的名稱,這裏稱爲summary。這是模型需要生成的輸出列的名稱。--model_name_or_path THUDM/ChatGLM-6b
: 這個標誌指定了預訓練模型的名稱或路徑。這裏使用的是名爲THUDM/ChatGLM-6b的預訓練模型。--output_dir output/adgen-ChatGLM-6b-pt-$PRE_SEQ_LEN-$LR
: 這個標誌指定了輸出目錄。目錄名爲output/adgen-ChatGLM-6b-pt-128-0.02,其中128和0.02分別由$PRE_SEQ_LEN和$LR變量替換。--per_device_train_batch_size 1
: 這個標誌設置了每個設備上的訓練批次大小爲1。--per_device_eval_batch_size 1
: 這個標誌設置了每個設備上的評估批次大小爲1。--gradient_accumulation_steps 16
: 這個標誌設置了梯度累積的步數爲16。這意味着在每個更新步驟中,會將最近16個步驟的梯度相加。--max_steps 3000
: 這個標誌設置了訓練過程中的最大步數爲3000。--save_steps 1000
: 這個標誌設置了保存模型檢查點的步數爲1000。這意味着每1000個步驟後,將保存一次模型的狀態。--learning_rate $LR
: 這個標誌設置了學習率爲之前定義的LR變量(0.02)。--pre_seq_len $PRE_SEQ_LEN
: 這個標誌設置了序列長度爲之前定義的PRE_SEQ_LEN變量(128)。
在官方的微調文檔中,用的是ADGEN數據集,其格式也就是上述的--prompt_column content
和--response_column summary
配置項決定的。而最終保存在output_dir
配置項指定的目錄下有多個checkpoint文件,其生成頻率就是由save_steps
配置項決定。
main.py
main文件中,依賴了trainer_seq2seq.py,而這又依賴了trainer.py文件。trainer.py文件則是直接copy自transformers庫的同名文件。
transformers庫的
目前的大模型都會對接到transformers庫中,通過transformers庫簡化調用開發。AI模型的對接,遵循HuggingFace平臺的要求。整個ChatGLM系列的推理、訓練、微調都可以直接調用transformers庫的API。常用的是如下三句:
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
huggingface平臺與ChatGLM
在ChatGLM的部署過程中,需要在huggingface平臺上下載模型參數以及配置初始化文件。而這些配置文件,transformers庫的API能夠調用的原因。
比較重要的,就是圈出來的三個。config.json文件中,配置了模型的基本信息以及transformers API的調用關係:
{
"_name_or_path": "THUDM/chatglm-6b",
"architectures": [
"ChatGLMModel"
],
"auto_map": {
"AutoConfig": "configuration_chatglm.ChatGLMConfig",
"AutoModel": "modeling_chatglm.ChatGLMForConditionalGeneration",
"AutoModelForSeq2SeqLM": "modeling_chatglm.ChatGLMForConditionalGeneration"
},
"bos_token_id": 130004,
"eos_token_id": 130005,
"mask_token_id": 130000,
"gmask_token_id": 130001,
"pad_token_id": 3,
"hidden_size": 4096,
"inner_hidden_size": 16384,
"layernorm_epsilon": 1e-05,
"max_sequence_length": 2048,
"model_type": "chatglm",
"num_attention_heads": 32,
"num_layers": 28,
"position_encoding_2d": true,
"torch_dtype": "float16",
"transformers_version": "4.23.1",
"use_cache": true,
"vocab_size": 130528
}
如上的auto_map配置項。configuration_chatglm文件是該config文件的類表現形式。
modeling_chatglm.py文件是源碼文件,ChatGLM對話模型的所有源碼細節都在該文件中。我之前一直沒找到ChatGLM的源碼,就是神經網絡的相關代碼,經過一波的分析,終於是定位到了。所以在config文件中會配置AutoModel API直接取調用modeling_chatglm.ChatGLMForConditionalGeneration
。