
Este proyecto se basa en chino-llama-alpaca v3.1 para instrucciones. China-Llama-Alpaca ha sido pionera en la expansión y mejora china basadas en la llama. Basado en la llama original, amplió la lista de vocabulario chino y utilizó datos chinos para la pre-entrenamiento secundario, mejorando aún más la capacidad de comprensión semántica básica de los chinos.
Composición del proyecto : <guebres>
.
├── 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. 对模型进行训练或者微调Ya sea que desee pre-entrenar o ajustar, debe preparar datos. Hay dos formas de preparar datos:
scripts/crawl_prompt.py para generar los datos correspondientes. La idea básica es usar ChatGPT u otros modelos eficientes de OpenAI para la generación de datos. # 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 . chkDebe descargar los pesos del modelo de LLAMA de parámetros de diferentes tamaños. Cuanto más grandes son los parámetros, mayor será el peso, mayor será el peso, mejor será la precisión y el tiempo de ajuste y entrenamiento también son relativamente largos. En términos generales, el modelo 7B o 13B será la elección de la mayoría de las personas.
Asegúrese de confirmar la integridad del modelo base de LLAMA y verificar si es consistente con el valor que se muestra en SHA256.MD, de lo contrario, la operación de fusión no se puede realizar.
# 安装依赖库
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 Si no desea convertirse manualmente usted mismo, también puede usar el modelo LLAMA-HF que otros han convertido. Pinkmanlove tiene el peso del Llama-HF convertido en Huggingface. Si falla, puede buscar a otras personas para convertir bien en HuggingFace-Models .
Todo el proceso de capacitación y ajuste fino consta de tres pasos:
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 . modelDescripción del parámetro:
llama_tokenizer_dir : señale el directorio donde se almacena el tokenizador de llamas original;chinese_sp_model_file : apunte al archivo de vocabulario chino (chino_sp.model) entrenado con pieza de oración;Nota
Hay dos métodos principales para expandir la lista de vocabulario: (1) fusionar y expandir la lista de vocabulario; (2) Encuentre una gran lista de vocabulario y elimine palabras inútiles para obtener una lista de vocabulario;
Durante la etapa previa a la capacitación, el Corpus General Chino se usa para obtener un entrenamiento previo sobre la base de los pesos de llamas originales. El proceso se divide en dos etapas:
El modelo converge lentamente en la primera etapa de pre-entrenamiento. Si no hay tiempo particularmente abundante y recursos informáticos, se recomienda omitir esta etapa. La segunda etapa del entrenamiento previo al entrenamiento es la siguiente (tarjeta única para un jugador):
########参数设置########
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 FalseDescripción del parámetro:
--model_name_or_path : el directorio donde se encuentra el modelo original de formato HF;--tokenizer_name_or_path : el directorio donde se encuentra chino-llama tokenizer (resultado de síntesis de merge_tokenizers.py);--dataset_dir : un directorio de datos previamente capacitados, que puede contener múltiples archivos de texto sin formato que terminan en txt;--data_cache_dir : especifique un directorio donde se almacenan los archivos de caché de datos;Múltiples máquinas y múltiples tarjetas:
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
...El modelo de Llama Chinese ha ampliado la lista de vocabulario chino basada en la versión original y utilizado datos de texto plano general chino para el pre-entrenamiento secundario. Aquí, el autor proporciona dos formas de descargar estos pesos de pre-entrenamiento sin exigirnos que gastemos recursos en la capacitación nosotros mismos:
| Nombre del modelo | Datos de capacitación | Refactorizar el modelo | tamaño | Descarga de Lora |
|---|---|---|---|---|
| Chino-llama-7b | General 20g | Llama-7b original | 770m | [Baidu NetDisk] [Google Drive] |
| Chino-llama-plus-7b ️ | Propósito general 120G | Llama-7b original | 790m | [Baidu NetDisk] [Google Drive] |
| Chino-llama-13b | General 20g | Llama-13b original | 1G | [Baidu NetDisk] [Google Drive] |
| Chino-llama-plus-13b ️ | Propósito general 120G | Llama-13b original | 1G | [Baidu NetDisk] [Google Drive] |
.from_pretrained() .| Nombre del modelo | Nombre de llamado modelo | Enlace |
|---|---|---|
| Chino-llama-7b | Ziqingyang/chino-llama-lora-7b | Enlace del centro de modelos |
| Chino-llama-plus-7b | Ziqingyang/chino-llama-plus-lora-7b | Enlace del centro de modelos |
| Chino-llama-13b | Ziqingyang/chino-llama-lora-13b | Enlace del centro de modelos |
| Chino-llama-plus-13b | Ziqingyang/chino-llama-plus-lora-13b | Enlace del centro de modelos |
El esquema de entrenamiento también utiliza Lora para un ajuste fino eficiente y aumenta aún más el número de parámetros capacitables.
Tarjeta única para un solo jugador:
########参数部分########
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 FalseDescripción del parámetro:
--tokenizer_name_or_path : el directorio donde se encuentra el tokenizador chino-alpaca (resultado de síntesis de merge_tokenizers.py);--dataset_dir : un directorio para la instrucción datos de ajuste fino, que contiene uno o más archivos de datos de ajuste de instrucción en el formato de Alpaca Stanford que termina en JSON;--validation_file : un archivo de ajuste fino de una sola instrucción utilizada como conjunto de validación, que finaliza en JSON, también sigue el formato de Stanford Alpaca;El llamado formato de Alpaca Stanford es:
[
{ "instruction" : ...,
"input" : ...,
"output" : ... },
...
]Los datos aquí también se pueden generar utilizando el método de generación de datos chino-llama-alpaca-usage/# de preparación.
Instrucciones de configuración:
Si desea continuar entrenando los pesos Lora del modelo chino-alpaca:
--model_name_or_path : el modelo original HF Format Llama (si continúa entrenando modelos de alpaca no plus) o fusiona chino-llama-plus-lora (si continúa entrenar más modelos);--peft_path : directorio de peso Lora de China-Alpaca; No es necesario especificar --lora_rank , --lora_alpha , --lora_dropout , --trainable y --modules_to_save parámetros.
Si desea ajustar los pesos Lora basados en el entrenamiento chino-llama:
--model_name_or_path : fusionar el modelo de formato HF chino-llama después de chino-llama-lora (independientemente de si es un modelo más o no);--peft_path : no proporcione este parámetro y elimine --peft_path del script; --lora_rank , --lora_alpha , --lora_dropout , --trainable y --modules_to_save Los parámetros deben especificarse.
Múltiples máquinas y múltiples tarjetas:
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
...Adecuado para chino-llama, chino-llama-plus, chino-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 Descripción del parámetro:
--base_model : el directorio donde los pesos del modelo de LLAMA y los archivos de configuración se almacenan en formato HF;--lora_model : el directorio donde el archivo se descomprime en chino Llama/Alpaca Lora, también puede usar el nombre de llamada del modelo Model Hub;--output_type : Especifica el formato de salida, que puede ser pth o huggingface . Si no se especifica, el valor predeterminado es pth ;--output_dir : Especifica el directorio que guarda los pesos del modelo completo, el valor predeterminado es ./ ;--offload_dir : para usuarios de baja memoria, debe especificar una ruta de caché de descarga; Explicación adicional en output_type :
.pth se pueden utilizar para cuantización e implementación de: Llama.cpp Tools;.bin se pueden usar para: transformadores para razonamiento; Text-Generation-Webui para interfaces de construcción;La fusión de peso de una sola lora se realiza en línea y la cuantifica simultáneamente:
Fusionar chino-alpaca-plus requiere dos pesos de lora, a saber, chino-llama-plus-lora y chino-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 La fusión de peso multi-lora se realiza en línea y la cuantifica simultáneamente:
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 Si el script merge_llama_with_chinese_lora_to_hf.py se ha ejecutado antes para fusionar los pesos lora, entonces no es necesario especificar --lora_model , y el método de inicio es más simple:
CUDA_VISIBLE_DEVICES = 0 python scripts / inference_hf . py
- - base_model path_to_merged_llama_or_alpaca_hf_dir
- - with_prompt
- - interactive Si se elimina CUDA_VISIBLE_DEVICES=0 , es el modo de razonamiento CPU. Por supuesto, también puede ejecutarlo e implementarlo en Webui. <guecidos>
Los modelos en este proyecto admiten principalmente los siguientes métodos de cuantificación, razonamiento e implementación.
| Métodos de razonamiento e implementación | Características | plataforma | UPC | GPU | Carga cuantitativa | Interfaz gráfica | Tutorial |
|---|---|---|---|---|---|---|---|
| llama.cpp | Opciones cuantitativas ricas y razonamiento local eficiente | General | ✅ | ✅ | ✅ | Enlace | |
| ? Transformadores | Interfaz de inferencia de transformadores nativos | General | ✅ | ✅ | ✅ | ✅ | Enlace |
| Webui de texto de texto | Cómo implementar la interfaz de interfaz de usuario web front-end | General | ✅ | ✅ | ✅ | ✅ | Enlace |
| Pilón | Interfaz de interacción gráfica en MacOS (debe coincidir con el modelo LLAMA.CPP) | Macosa | ✅ | ✅ | ✅ | Enlace |