Utilisez des instructions à affinir pour affiner le gros modèle. Le code en cours d'exécution est copié à partir de chinois-llama-alpaca et a apporté quelques modifications:
Remarque : il y a encore des problèmes.
Veuillez vérifier les informations pertinentes ultérieurement et ajouter loss.requires_grad_(True) à modélisation_chatglm.py pour exécuter avec succès. pour
L'exclusion de chatglm n'est pas prise en charge, et le même modèle dans le même modèle dans le chinois-llama-alpaca a toujours ce problème. Peu importe comment vous dites qu'il est modifié
Il peut toujours fonctionner avec succès après.
Bien qu'il n'y ait aucun problème avec l'ensemble du processus, le modèle ne semble pas pouvoir être formé efficacement. La perte s'est déroulée vers 4 heures, et le même problème existe toujours après avoir essayé différents taux d'apprentissage et s'entraîner plus longtemps.
Le projet est principalement:
La troisième partie du modèle pré-formé est affinée. Le but principal est d'expliquer l'ensemble du processus. Pour une introduction détaillée, vous pouvez vérifier Zhihu: https://zhuanlan.zhihu.com/p/640086409. Si vous souhaitez l'utiliser dans la pratique, vous pouvez vous référer à d'autres projets publiés: [Taishan1994 (xiximamayo) (github.com)] (https://github.com/taishan1994).
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
datasetsLa dernière version du package devrait être OK.
1. Téléchargez le modèle chatGLM-6B sur Model_Hub / ChatGlm-6B
2. Préparez les données, telles que le format des données dans Data / MSRA / Train.txt, avec un échantillon en un comportement, et l'échantillon est similaire:
{ "instruct" : "你现在是一个实体识别模型,你需要提取文本里面的人名、地名、机构名,如果存在结果,返回'实体_实体类型',不同实体间用n分隔。如果没有结果,回答'没有'。" , "query" : "文本:一位郑州学人说,越秀学术讲座对郑州学界而言堪称功德之举。" , "answer" : "郑州_地名n越秀_机构名" }3. Après avoir préparé les données, vous pouvez utiliser des instructions pour vous entraîner:
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. Une fois la formation terminée, vous pouvez utiliser Test_Sft_Model.py pour prédire:
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. D'autres, comme comment définir la couche formable de Lora, peuvent être visualisées à l'aide de Fin_lora_names.py. Vous pouvez utiliser test_datset.py pour tester les données. Test Word Segmenter à l'aide de test_toenizer.py. Testez le modèle d'origine avec test_model.py.
YMCUI / Chinese-Llama-Alpaca: Chinese Llama & Alpaca Modèle de grande langue + Déploiement de formation CPU / GPU local (LLAMA CHINISE & ALPACA LLMS) (github.com)