微調類型簡介
1. SFT監(jiān)督微調:適用于在源任務中具有較高性能的模型進行微調,學習率較小。常見任務包括中文實體識別、語言模型訓練、UIE模型微調。優(yōu)點是可以快速適應目標任務,但缺點是可能需要較長的訓練時間和大量數(shù)據(jù)。
2. LoRA微調:通過高階矩陣秩的分解減少微調參數(shù)量,不改變預訓練模型參數(shù),新增參數(shù)。優(yōu)點是減少了微調的參數(shù)量和成本,同時能達到與全模型微調相近的效果。
3. P-tuning v2微調:引入了prefix-tuning的思想,每一層都加入了prefix,并采用了多任務學習。解決了P-tuning v1中序列標注任務效果不佳和普遍性差的問題。其參數(shù)對象是各層的prefix。優(yōu)點是適用于多任務學習,但在自然語言理解任務上表現(xiàn)可能不佳。
4. Freeze微調:主要用于大語言模型的微調,后幾層網絡提取語義特征,前幾層提取文本表層特征。優(yōu)點是參數(shù)高效,適用于提取特定層次的特征。
綜上所述,各種微調方法適用于不同的場景和任務。SFT監(jiān)督微調適用于快速適應目標任務,LoRA適用于減少參數(shù)量和成本,P-tuning v2適用于多任務學習,而Freeze適用于提取特定層次的特征。
1.下載glm2訓練腳本
git clone https://github.com/THUDM/ChatGLM2-6B.git
2.然后使用 pip 安裝依賴
pip install -r requirements.txt -i https://pypi.douban.com/simple/
運行行微調除 ChatGLM2-6B 的依賴之外,還需要安裝以下依賴
pip install rouge_chinese nltk jieba datasets transformers[torch] -i https://pypi.douban.com/simple/
3.下載樣例數(shù)據(jù)或者自己構建樣例
{"content": "類型#裙_材質#網紗_顏色#粉紅色_圖案#線條_圖案#刺繡_裙腰型#高腰_裙長#連衣裙_裙袖長#短袖_裙領型#圓領", "summary": "這款連衣裙,由上到下都透出女性魅力,經典圓領型,開口度恰好,露出修長的脖頸線條,很是優(yōu)雅氣質,短袖設計,這款對身材有很好的修飾作用,穿起來很女神;裙身粉紅色花枝重工刺繡,讓人一眼難忘!而且在這種網紗面料上做繁復圖案的繡花,是很考驗工藝的,對機器的要求會更高,更加凸顯我們的高品質做工;"}
可以根據(jù)以上格式,構建自己的訓練樣本,我們可以用一些行業(yè)生產數(shù)據(jù),如會話記錄對模型進行訓練,
官方示例數(shù)據(jù)下載:
https%3A//cloud.tsinghua.edu.cn/f/b3f119a008264b1cabd1/%3Fdl%3D1
4.根據(jù)自己的環(huán)境修改訓練腳本中對應的文件地址
PRE_SEQ_LEN=128 #序列的預設長度為128
LR=2e-2 #學習率為0.02
NUM_GPUS=4 #用幾顆GPU進行訓練
torchrun --standalone --nnodes=1 --nproc_per_node=$NUM_GPUS main.py \
--do_train \
--train_file /export/data/train.json \ #設置訓練數(shù)據(jù)文件的目錄
--validation_file /export/data/validation.json \ #設置驗證文件的目錄
--preprocessing_num_workers 10 \
--prompt_column content \
--response_column summary \
--overwrite_cache \
--model_name_or_path /opt/tritonserver/python_backend/models/chatglm2-6b \ #模型目錄
--output_dir /export/models/trained-chatglm2-6b-pt-$PRE_SEQ_LEN-$LR \ #訓練后的模型目錄
--overwrite_output_dir \
--max_source_length 64 \
--max_target_length 128 \
--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
5.開始訓練吧
sh train.sh
訓練中
快要訓練完成
6.訓練完成
Training completed. Do not forget to share your model on huggingface.co/models =)
{'train_runtime': 4598.3849, 'train_samples_per_second': 41.754, 'train_steps_per_second': 0.652, 'train_loss': 0.1287700497706731, 'epoch': 2400.0}
100%|██████████| 3000/3000 [1:16:37<00:00, 1.53s/it]
***** train metrics *****
epoch = 2400.0
train_loss = 0.1288
train_runtime = 1:16:38.38
train_samples = 24
train_samples_per_second = 41.754
train_steps_per_second = 0.652
7.部署訓練后的模型
在 P-tuning v2 訓練時模型只保存 PrefixEncoder 部分的參數(shù),所以在推理時需要同時加載原 ChatGLM-6B 模型以及 PrefixEncoder 的權重
model_path = "/opt/tritonserver/python_backend/models/chatglm2-6b"
model = AutoModel.from_pretrained(model_path, config=config, trust_remote_code=True)
prefix_state_dict = torch.load(os.path.join('/opt/train/trained-chatglm2-6b-pt-128-1e-4/checkpoint-3000', "pytorch_model.bin"))
new_prefix_state_dict = {}
for k, v in prefix_state_dict.items():
if k.startswith("transformer.prefix_encoder."):
new_prefix_state_dict[k[len("transformer.prefix_encoder."):]] = v
model.transformer.prefix_encoder.load_state_dict(new_prefix_state_dict)
8.過程中遇到的問題
8.1 微調后無法應答
PRE_SEQ_LEN=128
LR=2e-2
NUM_GPUS=1
torchrun --standalone --nnodes=1 --nproc_per_node=$NUM_GPUS main.py \
--do_train \
--train_file train.json \
--validation_file dev.json \
--preprocessing_num_workers 10 \
--prompt_column content \
--response_column summary \
--overwrite_cache \
--model_name_or_path /opt/tritonserver/python_backend/models/chatglm2-6b \
--output_dir trained-chatglm2-6b-pt-$PRE_SEQ_LEN-$LR \
--overwrite_output_dir \
--max_source_length 64 \
--max_target_length 64 \
--per_device_train_batch_size 16 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 1 \
--predict_with_generate \
--max_steps 3000 \
--logging_steps 10 \
--save_steps 1000 \
--learning_rate $LR \
--pre_seq_len $PRE_SEQ_LEN \
使用官方腳本中的學習率設置 LR=2e-2 (0.02)
模型出現(xiàn)無法應答,災難性遺忘,基本上原有的知識都遺忘了,無法應答普通提問 , 比如"你好.."
于是嘗試使用 LR=1e-4 (0.0001) 進行訓練
"1e-4" 表示 1 乘以 10 的 -4 次方,即等于 0.0001,"2e-2" 表示 2 乘以 10 的 -2 次方,即等于 0.02。
模型最終可以應答.
鏡像問題:
https://github.com/THUDM/ChatGLM-6B/issues/1148
8.2 關于學習率:
我理解是,學習率大小像看書看的粗細,看的太粗就學的快(收斂快)但啥也學不到,
學習率是影響模型訓練效果的重要參數(shù)。過大的學習率可能導致模型不穩(wěn)定,過小的學習率則可能導致訓練速度變慢。因此,需要反復試驗,找到合適的學習率。
學習率(lr)表示每次更新權重參數(shù)的尺度(步長),ΔΘ=Θ0?(lr)(loss′)。
學習率與batch_size在權重更新中的關系
學習率(lr)直觀可以看出lr越大,權重更新的跨度越大,模型參數(shù)調整變化越快。
batch_size對模型的影響,在于模型每次更新時,計算梯度是計算整個Batch的平均梯度,
即權重更新公式中的loss′=1batchsize(lossbatch)′, 整合就是 ΔΘ=Θ0?(lr)1batchsize(lossbatch)′ 。即lr與batch_size共同影響模型更新。
作者:京東科技 楊建文章來源:http://www.zghlxwxcb.cn/news/detail-711545.html
來源:京東云開發(fā)者社區(qū) 轉發(fā)請注明來源文章來源地址http://www.zghlxwxcb.cn/news/detail-711545.html
到了這里,關于基于 P-Tuning v2 進行 ChatGLM2-6B 微調實踐的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!