中文
Generalmente hay dos esquemas para ajustar Facebook/Llama. Uno es la serie Alpaca de Stanford, y la otra es Vicuna basada en el corpus ShareGPT. Vicuna utiliza un corpus de diálogo multi-ronda, y el efecto de entrenamiento es mejor que la alpaca, que está predeterminada al diálogo de una sola ronda. Por lo tanto, se recomienda ajustar la llama basada en Vicuna. Las dos formas de ajuste fino se describen en detalle en los siguientes proyectos (la descripción del modo Lora en FastChat es relativamente simple).
https://github.com/tloen/alpaca-lora
https://github.com/lm-sys/fastchat
Alpaca-Lora tiene bajos requisitos de memoria, aproximadamente 12G 2080TI puede admitir, pero el entrenamiento de modelos de sesión de ronda múltiple como Vicuna requiere una alta memoria de GPU. La capacitación del modelo de vicuna requiere al menos 24 g de memoria GPU [la recomendación oficial es 4 * V100 (32G)]. Si tiene una tarjeta gráfica de alta gama, simplemente siga el archivo para entrenar. Si solo tiene una tarjeta gráfica de 16G pero desea personalizar el corpus para reproducir el modelo Vicuna, debe pensar en muchas formas de reducir continuamente la precisión de 32 bits a media precisión de 16 bits, entonces de 16 bits a 8 bits y acelerar el método de entrenamiento para lograr el objetivo.
• Use el método Lora para entrenar solo parte de los parámetros
• El modelo básico adopta Llama-7B-HF de media precisión
• Use load_in_8bit para cargar el modelo básico
• Use la tecnología PEFF para ajustar
• Use bitsandbytes para acelerar
Luego, en base a FastChat, este artículo modifica el código de entrenamiento de Lora, utiliza el Corpus ShareGPT y los ajustes finos en una tarjeta de 16 g, que ocupa aproximadamente 13 g de memoria GPU.
• Sistema operativo: CentOS o Ubuntu
• NVIDA P100 o T4: 16G Memoria de GPU o superior
• CUDA, conda
git clone https://github.com/git-cloner/llama-lora-fine-tuning
cd llama-lora-fine-tuningwget https://pkg-config.freedesktop.org/releases/pkg-config-0.29.2.tar.gz
tar -zxvf pkg-config-0.29.2.tar.gz
cd pkg-config-0.29.2
./configure --with-internal-glib
make -j4
make check
sudo make installwget https://mirrors.aliyun.com/blfs/conglomeration/icu/icu4c-73_1-src.tgz
tar xf icu4c-73_1-src.tgz
cd icu/source
./configure
make
make check
sudo make install
sudo ldconfigconda create -n llama-lora python=3.10
conda activate llama-lora
pip3 install -r requirements.txtPuede descargar el modelo original y convertirlo a mitad de precisión, o descargar el modelo de media precisión convertido directamente de https://huggingface.co/decapoda-research/llama-7b-hf.
export GIT_TRACE=1
export GIT_CURL_VERBOSE=1
pip3 install git+https://github.com/juncongmoo/pyllama -i https://pypi.mirrors.ustc.edu.cn/simple --trusted-host=pypi.mirrors.ustc.edu.cn
python -m llama.download --model_size 7BCUDA_VISIBLE_DEVICES=1 python3 ./convert_llama_weights_to_hf.py --input_dir ./pyllama_data --model_size 7B --output_dir ./pyllama_data/output/7BDownload 52k ShareGPT: https: // huggingface.co/datasets/RyokoAI/ShareGPT52K
Other corpora refer to: https: // github.com/Zjh-819/LLMDataHub
Download sg_90k_part1.json and sg_90k_part2.json into the data directorypython3 fastchat/data/merge.py --in ./data/sg_90k_part1.json ./data/sg_90k_part2.json ./data/dummy_cn.json ./data/dummy_en.json --out ./data/sg_90k.jsonpython3 fastchat/data/clean_sharegpt.py --in ./data/sg_90k.json --out ./data/sharegpt_clean.jsonpython3 fastchat/data/optional_clean.py --in ./data/sharegpt_clean.json --out ./data/sharegpt_clean_1.json --skip-lang SOME_LANGUAGE_CODE
The values of SOME_LANGUAGE_CODE are as follows:
en - English
es - Spanish
fr - French
de - German
it - Italian
ja - Japanese
ko - Korean
zh - Chinese
ar - Arabic
ru - Russian
pt - Portuguese
nl - DutchCUDA_VISIBLE_DEVICES=1 python3 fastchat/data/split_long_conversation.py --in ./data/sharegpt_clean.json --out ./data/sharegpt_clean_split.json --model-name ./pyllama_data/output/7B # Disable wandb
wandb disabled
# In order to prevent the SSH terminal from disconnecting and stopping the training, the training can run in the background (remove the # in three places to run in the background)
# If you have multiple GPUs,using --num_gpus parameter
CUDA_VISIBLE_DEVICES=0,1 # nohup
deepspeed --num_gpus=2 fastchat/train/train_lora.py
--deepspeed ./deepspeed-config.json
--lora_r 8
--lora_alpha 16
--lora_dropout 0.05
--model_name_or_path ./pyllama_data/output/7B
--data_path ./data/sharegpt_clean_split.json
--fp16 True
--output_dir ./output
--num_train_epochs 1
--per_device_train_batch_size 14
--per_device_eval_batch_size 14
--gradient_accumulation_steps 1
--evaluation_strategy " no "
--save_strategy " steps "
--save_steps 2400
--save_total_limit 5
--learning_rate 2e-5
--weight_decay 0.
--warmup_ratio 0.03
--lr_scheduler_type " cosine "
--logging_steps 1
--model_max_length 512
--gradient_checkpointing True # >> lora.log 2>&1 &
# If running in the background, tail lora.log to check the training progress
tail -f lora.logEl ajuste fino en P100 (16G) ocupa 13.5 g de memoria. En el caso de una ronda de entrenamiento, lleva 120 horas, aproximadamente 5 días, lo que todavía requiere mucho tiempo. El efecto del modelo resultante debe ser verificado. Model_max_length afectará el tiempo de entrenamiento. Si se establece en 1024, el tiempo se reducirá a la mitad en comparación con 2048, pero afectará el efecto de inferencia.
ajuste fino en un solo A100 y lleva aproximadamente 16 horas.
deepspeed fastchat/train/train_lora.py
--deepspeed ./deepspeed-config.json
--lora_r 8
--lora_alpha 16
--lora_dropout 0.05
--model_name_or_path ./pyllama_data/output/7B
--data_path ./data/sharegpt_clean_split.json
--fp16 True
--output_dir ./output
--num_train_epochs 1
--per_device_train_batch_size 56
--per_device_eval_batch_size 56
--gradient_accumulation_steps 1
--evaluation_strategy " no "
--save_strategy " steps "
--save_steps 1200
--save_total_limit 5
--learning_rate 2e-5
--weight_decay 0.
--warmup_ratio 0.03
--lr_scheduler_type " cosine "
--logging_steps 1
--model_max_length 1024
--gradient_checkpointing TrueEl modelo Lora Peft entrenado consiste en adapter_config.json, adapter_model.bin y entrenador_state.json. A continuación se muestra la estructura de archivos de PEFT y el modelo original de LLAMA.
model
───llama-peft
│ adapter_config.json
│ adapter_model.bin
│ trainer_state.json
│
└──llama_7b
config.json
generation_config.json
pytorch_model-00001-of-00002.bin
pytorch_model-00002-of-00002.bin
pytorch_model.bin.index.json
special_tokens_map.json
tokenizer.json
tokenizer.model
tokenizer_config.jsonCUDA_VISIBLE_DEVICES=0 python generate.py --base_model ./model/llama-7b --lora_weights ./model/llama-peft