Este projeto tem como objetivo instruir o ajuste fino de modelos de base de várias classes para realizar o LORA + DeepSpeed + Card único/ajuste fino de vários cartões. Os modelos atualmente testados são mostrados na tabela abaixo:
| Teste o modelo | linguagem | Pesos de teste |
|---|---|---|
| Chinês-llama-alpaca | chinês | Chinês-alpaca-plus-lora-13b |
| Open-llama | Inglês | open_llama_13b |
| open_llama_7b | ||
| Belle | chinês | Belle-Llama-EXT-13B |
| Belle-Llama-EXT-7B | ||
| FLORESCER | Inglês | Bloomz-1B7 |
| Bloomz-7b1 | ||
| Chatglm-6b | chinês | Chatglm-6b |
| Chatglm2-6b | ||
| Baichuan | chinês | Baichuan-7b |
| chinês | Baichuan-13b-Chat | |
| Tigerbot | chinês | tigerbot-7b-sft |
| Tigerbot-7b-Base | ||
| Python | Inglês | Pythia-1b-Deseded |
| Pythia-12b-Desedped |
PENDÊNCIA:
Aqui, usamos o modelo médico chinês CCKS2023-PROMPTCBLUE para avaliar o conjunto de dados na competição de referência como exemplo. Esse conjunto de dados transforma o conjunto de dados "Chinese Medical Information Processing Challenge" CBLUE ", transformando todos os 16 cenários médicos diferentes, tarefas de NLP em tarefas de geração de idiomas rápidas, formando a primeira referência de avaliação de LLM para cenários médicos chineses.
O PromptCBlue usa 94 Modelos de ajuste fino de instrução para executar várias tarefas no benchmark CBLUE. Após a transformação, todos os conjuntos de dados de PNL de texto médico serão convertidos no formato a seguir. A sequência do campo de entrada é a entrada para o modelo LLM, e o campo de destino também é uma string, que é a sequência de texto que o modelo LLM precisa gerar.
{
"input" : str,
"target" : str,
"type" : str,
"answer_choices" : str,
"sample_id" : str,
} Para facilitar a verificação rápida, extraímos o subdataSet CHIP-CTC , incluindo 6000 conjuntos de treinamento, 1100 conjuntos de verificação e 1060 conjuntos de testes. Endereço para download
O modelo pode ser baixado localmente. Durante o treinamento, model_name_or_path é passado para o caminho do modelo, ou você só pode passar o nome do modelo na face abraça, como THUDM/chatglm-6b , e o código baixará automaticamente o modelo.
Alguns modelos de classe de llama requerem conversão de modelos, e os modelos envolvidos incluem: Chinês-alpaca-plus-lora-13b, consulte o método de conversão aqui.
conda create -n llms_train python=3.9
conda activate llms_train
pip install -r requirements.txt Existem arquivos de configuração do LORA para vários modelos no arquivo config.py , que podem ser personalizados e modificados. O conteúdo do arquivo de configuração é o seguinte:
' 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 "
},Descrição do campo:
lora_r : a classificação de Lora lora_alpha : lora_dropout : a probabilidade de abandono da camada Lora;lora_target_modules : quais módulos lora se agarram;modules_to_save : Além da camada Lora, cujos módulos são definidos como treináveis e serão salvos no último ponto de verificação. A configuração zero2 é usada aqui:
{
" 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
}Para estratégias para treinamento paralelo de vários cartões, consulte aqui.
config.py possui várias outras configurações: MODEL_MAP , TOKENIZER_MAP , SPECIAL_IDS , selecione diferentes modelos calss e classe Tokenizer de acordo com model_type e selecione ID de token especial de acordo com model_name_or_path . model_type e o modelo correspondente são os seguintes:
llama : Você pode ligar para modelos do tipo llama, como chinês-alpaca-plus-lora-13b, open_llama_13b, open_llama_7b, belle-llama-ext-13b, belle-llama-ext-7b, tigerbot-7b-sft, tigerbot-7b-base, etc.glm : ChatGlm-6b e ChatGlm2-6b podem ser chamados.bloom : modelos do tipo Bloom, como Bloomz-1B7, Bloomz-7B1, etc. podem ser chamados.pythia : você pode chamar Python-1b-Deedused, Pythia-12b-Deedused e outros modelos Python. Execute scripts/train.sh . O conteúdo do arquivo é o seguinte:
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 Os parâmetros são os seguintes:
deepspeed : o caminho do arquivo de configuração do DeepSpeeddo_train : bool, seja para ativar o treinamentodo_eval : bool, se deve verificar no conjunto de verificação, se evaluation_strategy não for igual a "não", ele será definido como Truemodel_name_or_path : o nome do modelo no rosto abraçado, ou o caminho que já existe localmentemodel_type : o tipo de modelo, opções opcionais incluem llama , glm , bloom , pythia , baichuan , otheruse_lora : use Lora Tuneing finering, o padrão é True , caso contrário, é um ajuste fino completofp16 : se deve usar a precisão FP16 (mista) para treinartrain_file : arquivo de dados do conjunto de treinamentovalidation_file : arquivo de dados do conjunto de verificaçãopreprocessing_num_workers : número de trabalhadores quando os dados do particípio em lotecache_dir : caminho do cache para o modelo HFprompt_column : o nome do campo inserido na amostraresponse_column : o nome do campo Saída na amostraoutput_dir : o caminho para salvar o resultado do treinamentooverwrite_output_dir : se definido como True , substitua a pasta de saídamax_source_length : o comprimento máximo do texto de entradamax_target_length : comprimento máximo do texto de saídapre_device_train_batch_size : tamanho do lote em cada cartão durante o treinamentopre_device_eval_batch_size : tamanho do lote em cada cartão durante a verificação/testegradient_accumulation_steps : rodadas de acumulação de gradientemax_steps : o número de rodadas de treinamento, uma rodada contém o número de amostras: GPU数量* pre_device_train_batch_size * gradient_accumulation_stepslogging_steps : Quantas rodadas de impressão de logsave_strategy : Durante o processo de treinamento, os resultados intermediários são salvos de acordo com o número de etapas ou números de epígios. Os valores opcionais são no , steps e epochsave_steps : salve o ponto de verificação a cada passoevaluation_strategy : Execute o conjunto de verificação de acordo com o número de etapas ou números de época. Os valores opcionais são no , steps e epocheval_steps : Verificação de cada número de etapaslearning_rate : Taxa de aprendizagem Se for um treinamento com vários cartões, modifique o correspondente em sh: CUDA_VISIBLE_DEVICES=0 torchrun --nproc_per_node 1 . Por exemplo, o treinamento em 4 cartões pode ser alterado para: CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --nproc_per_node 4 .
Perceber:
model_name_or_path deve corresponder corretamente ao model_type .bos_id , eos_id e pad_id de alguns modelos não são completamente consistentes. SPECIAL_IDS in config.py especifica o ID do token especial de cada modelo. Além dos modelos que foram testados, ele precisa ser adicionado manualmente sozinho.Execute o script de inferência:
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_loraRegistro de problemas:
/work não tiver permissão, adicione variáveis de ambiente: export HF_MODULES_CACHE=~/.cache/huggingfacechmod u+x xxx.sh Atualização contínua ...
Agradecemos à comunidade por seus excelentes modelos de código aberto: ChatGlm-6b (Chatglm2), Chinês-Llama-Alpaca, Openllama, Bloom, Belle, Python, Gptneox, Baichuan.
Este projeto também se refere aos seguintes excelentes projetos de código aberto:
PromptCBlue
sentençapiece_chinese_bpe
Chatglm_lora_multi-gpu
Tuneamento de bate-papo-eficiente
zero_nlp
Este projeto é apenas para estudo e pesquisa . Os resultados do treinamento do modelo são afetados por fatores como a própria estrutura do modelo, aleatoriedade, parâmetros de treinamento, conjuntos de dados etc. Este projeto não é responsável pelos resultados do treinamento do modelo, nem é responsável pelo conteúdo da geração do modelo, nem é responsável por quaisquer perdas causadas pelo uso deste projeto. Este projeto é desenvolvido e mantido por indivíduos em seu tempo livre. Devido ao tempo limitado e ao nível limitado do autor, a pontualidade de responder a perguntas relacionadas não pode ser garantida. No entanto, um grupo de comunicação será estabelecido no futuro. Todos são convidados a aprender e ajudar uns aos outros.
Se este projeto for útil para você, consulte -o no seguinte formato:
@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},
}