
Este projeto é baseado no chinês-llama-alpaca v3.1 para obter instruções. Chinês-llama-Alpaca foi pioneiro em expansão e melhoria chinesa com base na llama. Com base na llama original, expandiu a lista de vocabulário chinesa e usou dados chineses para pré-treinamento secundário, melhorando ainda mais a capacidade básica de compreensão semântica dos chineses.
Composição do Projeto : <Fontes>
.
├── README.md # 使用说明文件
├── SHA256.md # LLaMA模型SHA值对比文件
├── notebooks
│ ├── convert_and_quantize_chinese_alpaca_plus.ipynb
│ └── convert_and_quantize_chinese_llama.ipynb
├── requirements.txt # 依赖文件
└── scripts
├── chinese_sp.model # 中文词表文件
├── crawl_prompt.py # 1. 通过OpenAI的大模型(如ChatGPT、GPT4等)生成可用于微调的数据
├── inference_hf.py # 5. 对微调训练产生的LoRA模型和原始LLaMA模型做推理
├── merge_llama_with_chinese_lora.py # 4. 合并模型权重
├── merge_tokenizers.py # 2. 词表扩充
└── run_clm_pt_with_peft.py # 3. 对模型进行训练或者微调Se você deseja pré-treinar ou ajustar, precisa preparar dados. Existem duas maneiras de preparar dados:
scripts/crawl_prompt.py para gerar os dados correspondentes. A idéia básica é usar o ChatGPT ou outros modelos eficientes do OpenAI para geração de dados. # tokenizer
wget https : // agi . gpt4 . org / llama / LLaMA / tokenizer . model - O . / tokenizer . model
wget https : // agi . gpt4 . org / llama / LLaMA / tokenizer_checklist . chk - O . / tokenizer_checklist . chk
# 7B
wget https : // agi . gpt4 . org / llama / LLaMA / 7 B / consolidated . 00. pth - O . / 7 B / consolidated . 00. pth
wget https : // agi . gpt4 . org / llama / LLaMA / 7 B / params . json - O . / 7 B / params . json
wget https : // agi . gpt4 . org / llama / LLaMA / 7 B / checklist . chk - O . / 7 B / checklist . chk
# 13B
wget https : // agi . gpt4 . org / llama / LLaMA / 13 B / consolidated . 00. pth - O . / 13 B / consolidated . 00. pth
wget https : // agi . gpt4 . org / llama / LLaMA / 13 B / consolidated . 01. pth - O . / 13 B / consolidated . 01. pth
wget https : // agi . gpt4 . org / llama / LLaMA / 13 B / params . json - O . / 13 B / params . json
wget https : // agi . gpt4 . org / llama / LLaMA / 13 B / checklist . chk - O . / 13 B / checklist . chk
# 30B
wget https : // agi . gpt4 . org / llama / LLaMA / 30 B / consolidated . 00. pth - O . / 30 B / consolidated . 00. pth
wget https : // agi . gpt4 . org / llama / LLaMA / 30 B / consolidated . 01. pth - O . / 30 B / consolidated . 01. pth
wget https : // agi . gpt4 . org / llama / LLaMA / 30 B / consolidated . 02. pth - O . / 30 B / consolidated . 02. pth
wget https : // agi . gpt4 . org / llama / LLaMA / 30 B / consolidated . 03. pth - O . / 30 B / consolidated . 03. pth
wget https : // agi . gpt4 . org / llama / LLaMA / 30 B / params . json - O . / 30 B / params . json
wget https : // agi . gpt4 . org / llama / LLaMA / 30 B / checklist . chk - O . / 30 B / checklist . chk
# 65B
wget https : // agi . gpt4 . org / llama / LLaMA / 65 B / consolidated . 00. pth - O . / 65 B / consolidated . 00. pth
wget https : // agi . gpt4 . org / llama / LLaMA / 65 B / consolidated . 01. pth - O . / 65 B / consolidated . 01. pth
wget https : // agi . gpt4 . org / llama / LLaMA / 65 B / consolidated . 02. pth - O . / 65 B / consolidated . 02. pth
wget https : // agi . gpt4 . org / llama / LLaMA / 65 B / consolidated . 03. pth - O . / 65 B / consolidated . 03. pth
wget https : // agi . gpt4 . org / llama / LLaMA / 65 B / consolidated . 04. pth - O . / 65 B / consolidated . 04. pth
wget https : // agi . gpt4 . org / llama / LLaMA / 65 B / consolidated . 05. pth - O . / 65 B / consolidated . 05. pth
wget https : // agi . gpt4 . org / llama / LLaMA / 65 B / consolidated . 06. pth - O . / 65 B / consolidated . 06. pth
wget https : // agi . gpt4 . org / llama / LLaMA / 65 B / consolidated . 07. pth - O . / 65 B / consolidated . 07. pth
wget https : // agi . gpt4 . org / llama / LLaMA / 65 B / params . json - O . / 65 B / params . json
wget https : // agi . gpt4 . org / llama / LLaMA / 65 B / checklist . chk - O . / 65 B / checklist . chkVocê precisa baixar os pesos do modelo de lhama de diferentes parâmetros de tamanho. Quanto maiores os parâmetros, maior o peso, maior o peso, melhor a precisão e o tempo de ajuste fino e treinamento também são relativamente longos. De um modo geral, o modelo 7B ou 13B será a escolha da maioria das pessoas.
Certifique -se de confirmar a integridade do modelo de base da llama e verifique se é consistente com o valor mostrado no sha256.md, caso contrário, a operação de mesclagem não poderá ser executada.
# 安装依赖库
pip install git + https : // github . com / huggingface / transformers
# 转化HF权重
python - m transformers . models . llama . convert_llama_weights_to_hf
- - input_dir llama - weights
- - model_size 7 B
- - output_dir llama - hf - weights
> python - m transformers . models . llama . convert_llama_weights_to_hf - - input_dir . / - - model_size 7 B - - output_dir . / output / 7 B - hf Se você não deseja se converter manualmente, também pode usar o modelo LLAMA-HF que outros convertem. Pinkmanlove tem o peso da llama-hf convertida em Huggingface. Se falhar, você pode procurar outras pessoas para converter bem em HuggingFace-Models .
Todo o processo de treinamento e ajuste fino consiste em três etapas:
python scripts / merge_tokenizers . py
- - llama_tokenizer_dir llama_tokenizer_dir
- - chinese_sp_model_file chinese_sp_model_file
> python scripts / merge_tokenizers . py - - llama_tokenizer_dir output / 7 B - hf - - chinese_sp_model_file scripts / chinese_sp . modelDescrição do parâmetro:
llama_tokenizer_dir : aponte para o diretório em que o tokenizador de llama original é armazenado;chinese_sp_model_file : aponte para o arquivo de vocabulário chinês (chinês_sp.model) treinado com a frase de sentença;Observação
Existem dois métodos principais para expandir a lista de vocabulário: (1) mesclar e expandir a lista de vocabulário; (2) encontre uma grande lista de vocabulário e exclua palavras inúteis para obter uma lista de vocabulário;
Durante a fase de pré-treinamento, o corpus chinês em geral é usado para pré-treinar com base nos pesos originais do lhama. O processo é dividido em dois estágios:
O modelo converge lentamente no primeiro estágio de pré-treinamento. Se não houver tempo e recursos de computação particularmente abundantes, é recomendável pular esta fase. A segunda etapa do treinamento pré-treinamento é a seguinte (cartão único para um jogador):
########参数设置########
lr = 2e-4
lora_rank = 8
lora_alpha = 32
lora_trainable = "q_proj,v_proj,k_proj,o_proj,gate_proj,down_proj,up_proj"
modules_to_save = "embed_tokens,lm_head"
lora_dropout = 0.05
pretrained_model = path / to / hf / llama / dir
chinese_tokenizer_path = path / to / chinese / llama / tokenizer / dir
dataset_dir = path / to / pt / data / dir
data_cache = temp_data_cache_dir
per_device_train_batch_size = 1
per_device_eval_batch_size = 1
training_steps = 100
gradient_accumulation_steps = 1
output_dir = output_dir
deepspeed_config_file = ds_zero2_no_offload . json
########启动命令########
torchrun - - nnodes 1 - - nproc_per_node 1 run_clm_pt_with_peft . py
- - deepspeed ${ deepspeed_config_file }
- - model_name_or_path ${ pretrained_model }
- - tokenizer_name_or_path ${ chinese_tokenizer_path }
- - dataset_dir ${ dataset_dir }
- - data_cache_dir ${ data_cache }
- - validation_split_percentage 0.001
- - per_device_train_batch_size ${ per_device_train_batch_size }
- - per_device_eval_batch_size ${ per_device_eval_batch_size }
- - do_train
- - seed $ RANDOM
- - fp16
- - max_steps ${ training_steps }
- - lr_scheduler_type cosine
- - learning_rate ${ lr }
- - warmup_ratio 0.05
- - weight_decay 0.01
- - logging_strategy steps
- - logging_steps 10
- - save_strategy steps
- - save_total_limit 3
- - save_steps 500
- - gradient_accumulation_steps ${ gradient_accumulation_steps }
- - preprocessing_num_workers 8
- - block_size 512
- - output_dir ${ output_dir }
- - overwrite_output_dir
- - ddp_timeout 30000
- - logging_first_step True
- - lora_rank ${ lora_rank }
- - lora_alpha ${ lora_alpha }
- - trainable ${ lora_trainable }
- - modules_to_save ${ modules_to_save }
- - lora_dropout ${ lora_dropout }
- - torch_dtype float16
- - gradient_checkpointing
- - ddp_find_unused_parameters FalseDescrição do parâmetro:
--model_name_or_path : o diretório em que o modelo de llama de formato HF original está localizado;--tokenizer_name_or_path : o diretório em que o tokenizador chinês-lama está localizado (resultado da síntese Merge_tokenizers.py);--dataset_dir : um diretório de dados pré-treinados, que podem conter vários arquivos de texto simples que terminam no txt;--data_cache_dir : especifique um diretório em que os arquivos de cache de dados são armazenados;Várias máquinas e vários cartões:
torchrun
- - nnodes ${ num_nodes }
- - nproc_per_node ${ num_gpu_per_node }
- - node_rank ${ node_rank }
- - master_addr ${ master_addr }
- - master_port ${ master_port }
run_clm_pt_with_peft . py
...O modelo chinês de lhama expandiu a lista de vocabulário chinês com base na versão original e usou dados gerais de texto em geral chineses para pré-treinamento secundário. Aqui, o autor fornece duas maneiras de baixar esses pesos pré-treinamento sem exigir que gastássemos recursos para nos treinar:
| Nome do modelo | Dados de treinamento | Refatorando o modelo | tamanho | Lora Download |
|---|---|---|---|---|
| Chinês-llama-7b | Geral 20G | Llama-7b original | 770m | [Baidu Netdisk] [Google Drive] |
| Chinês-llama-plus-7b ️ | Objetivo geral 120g | Llama-7b original | 790m | [Baidu Netdisk] [Google Drive] |
| Chinês-llama-13b | Geral 20G | Llama-13b original | 1g | [Baidu Netdisk] [Google Drive] |
| Chinês-llama-plus-13b ️ | Objetivo geral 120g | Llama-13b original | 1g | [Baidu Netdisk] [Google Drive] |
.from_pretrained() .| Nome do modelo | Nome da chamada do modelo | Link |
|---|---|---|
| Chinês-llama-7b | Ziqingyang/chinês-llama-lora-7b | Modelo Link do hub |
| Chinês-llama-plus-7b | Ziqingyang/chinês-lama-plus-lora-7b | Modelo Link do hub |
| Chinês-llama-13b | Ziqingyang/chinês-llama-lora-13b | Modelo Link do hub |
| Chinês-llama-plus-13b | Ziqingyang/chinês-lama-plus-lora-13b | Modelo Link do hub |
O esquema de treinamento também usa o LORA para um ajuste fino eficiente e aumenta ainda mais o número de parâmetros treináveis.
Cartão único para um jogador:
########参数部分########
lr = 1e-4
lora_rank = 8
lora_alpha = 32
lora_trainable = "q_proj,v_proj,k_proj,o_proj,gate_proj,down_proj,up_proj"
modules_to_save = "embed_tokens,lm_head"
lora_dropout = 0.05
pretrained_model = path / to / hf / llama / or / merged / llama / dir / or / model_id
chinese_tokenizer_path = path / to / chinese / llama / tokenizer / dir
dataset_dir = path / to / sft / data / dir
per_device_train_batch_size = 1
per_device_eval_batch_size = 1
training_steps = 100
gradient_accumulation_steps = 1
output_dir = output_dir
peft_model = path / to / peft / model / dir
validation_file = validation_file_name
deepspeed_config_file = ds_zero2_no_offload . json
########启动命令########
torchrun - - nnodes 1 - - nproc_per_node 1 run_clm_sft_with_peft . py
- - deepspeed ${ deepspeed_config_file }
- - model_name_or_path ${ pretrained_model }
- - tokenizer_name_or_path ${ chinese_tokenizer_path }
- - dataset_dir ${ dataset_dir }
- - validation_split_percentage 0.001
- - per_device_train_batch_size ${ per_device_train_batch_size }
- - per_device_eval_batch_size ${ per_device_eval_batch_size }
- - do_train
- - do_eval
- - seed $ RANDOM
- - fp16
- - max_steps ${ training_steps }
- - lr_scheduler_type cosine
- - learning_rate ${ lr }
- - warmup_ratio 0.03
- - weight_decay 0
- - logging_strategy steps
- - logging_steps 10
- - save_strategy steps
- - save_total_limit 3
- - evaluation_strategy steps
- - eval_steps 250
- - save_steps 500
- - gradient_accumulation_steps ${ gradient_accumulation_steps }
- - preprocessing_num_workers 8
- - max_seq_length 512
- - output_dir ${ output_dir }
- - overwrite_output_dir
- - ddp_timeout 30000
- - logging_first_step True
- - lora_rank ${ lora_rank }
- - lora_alpha ${ lora_alpha }
- - trainable ${ lora_trainable }
- - modules_to_save ${ modules_to_save }
- - lora_dropout ${ lora_dropout }
- - torch_dtype float16
- - validation_file ${ validation_file }
- - peft_path ${ peft_model }
- - gradient_checkpointing
- - ddp_find_unused_parameters FalseDescrição do parâmetro:
--tokenizer_name_or_path : o diretório em que o tokenizador chinês-alpaca está localizado (resultado da síntese Merge_tokenizers.py);--dataset_dir : um diretório para dados de ajuste fino, contendo uma ou mais arquivos de dados de ajuste fino de instrução no formato Stanford Alpaca terminando em JSON;--validation_file : um único arquivo de ajuste fino de instrução usado como um conjunto de validação, terminando em JSON, também segue o formato Stanford Alpaca;O chamado formato Stanford Alpaca é:
[
{ "instruction" : ...,
"input" : ...,
"output" : ... },
...
]Os dados aqui também podem ser gerados usando o método de geração de dados chinês-lama-alpaca-uso/# de preparação.
Instruções de configuração:
Se você quiser continuar treinando os pesos da Lora do modelo chinês-alpaca:
--model_name_or_path : o modelo de llama de formato HF original (se você continuar treinando modelos não-plus alpaca) ou mesclando chinês-lama-plus-lora (se você continuar treinando modelos mais);--peft_path : Diretório de peso LORA da China-Alpaca; Não há necessidade de especificar --lora_rank , --lora_alpha , --lora_dropout , --trainable e --modules_to_save Parâmetros.
Se você deseja ajustar os pesos da Lora com base no treinamento chinês-llama:
--model_name_or_path : mescle o modelo de formato hf chinês-llama após chinês-llama-lora (independentemente de ser um modelo plus ou não);--peft_path : não forneça este parâmetro e exclua --peft_path do script; --lora_rank , --lora_alpha , --lora_dropout , --trainable e --modules_to_save precisam ser especificados.
Várias máquinas e vários cartões:
torchrun
- - nnodes ${ num_nodes }
- - nproc_per_node ${ num_gpu_per_node }
- - node_rank ${ node_rank }
- - master_addr ${ master_addr }
- - master_port ${ master_port }
run_clm_sft_with_peft . py
...Adequado para chinês-lama, chinês-lama-plus, chinês-alpaca
python scripts / merge_llama_with_chinese_lora . py
- - base_model path_to_original_llama_hf_dir
- - lora_model path_to_chinese_llama_or_alpaca_lora
- - output_type [ pth | huggingface ]
- - output_dir path_to_output_dir Descrição do parâmetro:
--base_model : o diretório em que os pesos e arquivos de configuração do modelo llama são armazenados no formato HF;--lora_model : o diretório em que o arquivo é descomprimido na llama/alpaca chinês, você também pode usar o nome do modelo de chamada de modelo de modelo de hub;--output_type : especifica o formato de saída, que pode ser pth ou huggingface . Se não for especificado, o padrão é pth ;--output_dir : especifica o diretório que salva os pesos do modelo completo, o padrão é ./ ;--offload_dir : Para usuários de baixa memória, você precisa especificar um caminho de cache de descarga; Explicação adicional em output_type :
.pth podem ser usados para quantização e implantação de: ferramentas llama.cpp;.bin podem ser usados para: Transformers para raciocínio; GENERAÇÃO DE TEXTO-WEBUI para construir interfaces;A fusão única de peso da Lora é realizada on -line e a quantifica simultaneamente:
A mesclagem chinesa-alpaca-plus requer dois pesos de Lora, a saber, chinês-lama-plus-lora e chinês-alpaca-plus-lora.
python scripts / merge_llama_with_chinese_lora . py
- - base_model path_to_original_llama_hf_dir
- - lora_model path_to_chinese_llama_plus_lora , path_to_chinese_alpaca_plus_lora
- - output_type [ pth | huggingface ]
- - output_dir path_to_output_dir A fusão de peso multi-lora é realizada on-line e a quantifica simultaneamente:
CUDA_VISIBLE_DEVICES = 0 python scripts / inference_hf . py
- - base_model path_to_original_llama_hf_dir
- - lora_model path_to_chinese_llama_or_alpaca_lora
- - with_prompt
- - interactive Se o script merge_llama_with_chinese_lora_to_hf.py tiver sido executado antes para mesclar pesos da Lora, não há necessidade de especificar --lora_model , e o método de inicialização for mais simples:
CUDA_VISIBLE_DEVICES = 0 python scripts / inference_hf . py
- - base_model path_to_merged_llama_or_alpaca_hf_dir
- - with_prompt
- - interactive Se CUDA_VISIBLE_DEVICES=0 for excluído, é o modo de raciocínio da CPU. Obviamente, você também pode executá -lo e implantá -lo no Webui. <Fontes>
Os modelos deste projeto suportam principalmente os seguintes métodos de quantificação, raciocínio e implantação.
| Métodos de raciocínio e implantação | Características | plataforma | CPU | GPU | Carregamento quantitativo | Interface gráfica | Tutorial |
|---|---|---|---|---|---|---|---|
| llama.cpp | Ricas opções quantitativas e raciocínio local eficiente | Em geral | ✅ | ✅ | ✅ | Link | |
| ? Transformadores | Interface de inferência dos transformadores nativos | Em geral | ✅ | ✅ | ✅ | ✅ | Link |
| GENERAÇÃO DE TEXTO-WEBUI | Como implantar a interface da interface do usuário do front-end | Em geral | ✅ | ✅ | ✅ | ✅ | Link |
| Llamachat | Interface de interação gráfica em MacOS (precisa ser comparado com o modelo llama.cpp) | Macos | ✅ | ✅ | ✅ | Link |