指示を使用して、大きなモデルを微調整します。メインランニングコードは、中国のラマアルパカからコピーされており、いくつかの変更を加えました。
注:まだ問題があります。
関連情報を後で確認し、 loss.requires_grad_(True)をmodeling_chatglm.pyに追加して、正常に実行してください。のために
ChatGlmを除くことはサポートされておらず、中国 - ラマアルパカの同じモデルの同じモデルには依然としてこの問題があります。あなたがそれが修正されていると言っても
その後、それでも正常に実行できます。
プロセス全体に問題はありませんが、モデルは効果的に訓練されることはできないようです。損失は4時頃でしたが、異なる学習率とトレーニングをより長く試した後も同じ問題が存在します。
プロジェクトは主に次のとおりです。
事前に訓練されたモデルの3番目の部分は微調整されています。主な目的は、プロセス全体を説明することです。詳細な紹介については、Zhihu:https://zhuanlan.zhihu.com/p/640086409を確認できます。実際に使用したい場合は、他の公開されているプロジェクトを参照できます。[Taishan1994(xiximamayo)(github.com)]
mpi4py
transformers == 4.28 . 1
peft == 0.3 . 0
icetk
deepspeed == 0.9 . 2
accelerate
cpm_kernels
sentencepiece == 0.1 . 99
peft = 0.3 . 0
torch = 2.0 . 0
datasets最新のパッケージバージョンは大丈夫です。
1。ChatGlm-6Bモデルをmodel_hub/chatglm-6bにダウンロードします
2。データ/MSRA/Train.txtのデータの形式などのデータを1つの動作に1つのサンプルで準備し、サンプルは類似しています。
{ "instruct" : "你现在是一个实体识别模型,你需要提取文本里面的人名、地名、机构名,如果存在结果,返回'实体_实体类型',不同实体间用n分隔。如果没有结果,回答'没有'。" , "query" : "文本:一位郑州学人说,越秀学术讲座对郑州学界而言堪称功德之举。" , "answer" : "郑州_地名n越秀_机构名" }3。データを準備した後、指示を使用してトレーニングできます。
torchrun - - nnodes 1 - - nproc_per_node 1 run_clm_sft_with_peft . py
- - deepspeed ds_zero2_no_offoad . json
- - model_name_or_path model_hub / chatglm - 6 b
- - tokenizer_name_or_path model_hub / chatglm - 6 b
- - dataset_dir data / msra /
- - per_device_train_batch_size 8
- - per_device_eval_batch_size 8
- - do_train
- - seed $ RANDOM
- - fp16
- - num_train_epochs 3
- - learning_rate 3e-5
- - warmup_ratio 0.01
- - weight_decay 0
- - logging_strategy steps
- - logging_steps 10
- - save_strategy steps
- - save_total_limit 3
- - save_steps 200
- - gradient_accumulation_steps 1
- - preprocessing_num_workers 8
- - max_seq_length 256
- - output_dir output_dir
- - overwrite_output_dir
- - ddp_timeout 30000
- - logging_first_step True
- - lora_rank 8
- - lora_alpha 32
- - trainable query_key_value
- - lora_dropout 0.05
- - torch_dtype float16
- - gradient_checkpointing
- - ddp_find_unused_parameters False4。トレーニングが完了したら、test_sft_model.pyを使用して次のことを予測できます。
import os
import torch
from transformers import AutoTokenizer , AutoModel
from peft import PeftModel
tokenizer = AutoTokenizer . from_pretrained ( "model_hub/chatglm-6b" , trust_remote_code = True )
model = AutoModel . from_pretrained ( "model_hub/chatglm-6b" , trust_remote_code = True ). half ()
model_vocab_size = model . get_output_embeddings (). weight . size ( 0 )
model . resize_token_embeddings ( len ( tokenizer ))
model = PeftModel . from_pretrained ( model , os . path . join ( "output_dir" , "adapter_model" ))
model . cuda ()
model . eval ()
response , history = model . chat ( tokenizer , "你好" , history = [])
print ( response )
response , history = model . chat ( tokenizer , "晚上睡不着应该怎么办" , history = [])
print ( response )
response , history = model . chat ( tokenizer , "你现在是一个实体识别模型,你需要提取文本里面的人名、地名、机构名,如果存在结果,返回'实体_实体类型',不同实体间用n分隔。如果没有结果,回答'没有'。文本:我们是受到郑振铎先生、阿英先生著作的启示,从个人条件出发,瞄准现代出版史研究的空白,重点集藏解放区、国民党毁禁出版物。" , history = [])
print ( response )5.ロラのトレーニング可能な層を定義する方法など、その他は、fin_lora_names.pyを使用して表示できます。 test_datset.pyを使用してデータをテストできます。 test_toEnizer.pyを使用して単語セグメントターをテストします。 test_model.pyで元のモデルをテストします。
YMCUI/中国 - ラマ - アルパカ:中国のllama&alpaca大手言語モデル +ローカルCPU/GPUトレーニング展開(中国Llama&Alpaca LLMS)(github.com)