0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Alpaca-Lora進行參數(shù)高效模型微調(diào)

深度學(xué)習(xí)自然語言處理 ? 來源:吃果凍不吐果凍皮 ? 2023-05-17 14:24 ? 次閱讀

之前嘗試了從0到1復(fù)現(xiàn)斯坦福羊駝(Stanford Alpaca 7B),Stanford Alpaca 是在 LLaMA 整個模型上微調(diào),即對預(yù)訓(xùn)練模型中的所有參數(shù)都進行微調(diào)(full fine-tuning)。但該方法對于硬件成本要求仍然偏高且訓(xùn)練低效。

因此, Alpaca-Lora 則是利用 Lora 技術(shù),在凍結(jié)原模型 LLaMA 參數(shù)的情況下,通過往模型中加入額外的網(wǎng)絡(luò)層,并只訓(xùn)練這些新增的網(wǎng)絡(luò)層參數(shù)。由于這些新增參數(shù)數(shù)量較少,這樣不僅微調(diào)的成本顯著下降(使用一塊 RTX 4090 顯卡,只用 5 個小時就訓(xùn)練了一個與 Alpaca 水平相當(dāng)?shù)哪P?,將這類模型對算力的需求降到了消費級),還能獲得和全模型微調(diào)(full fine-tuning)類似的效果。

LoRA 技術(shù)原理

12aea1da-f475-11ed-90ce-dac502259ad0.pngimage.png

LoRA 的原理其實并不復(fù)雜,它的核心思想是在原始預(yù)訓(xùn)練語言模型旁邊增加一個旁路,做一個降維再升維的操作,來模擬所謂的 intrinsic rank(預(yù)訓(xùn)練模型在各類下游任務(wù)上泛化的過程其實就是在優(yōu)化各類任務(wù)的公共低維本征(low-dimensional intrinsic)子空間中非常少量的幾個自由參數(shù))。訓(xùn)練的時候固定預(yù)訓(xùn)練語言模型的參數(shù),只訓(xùn)練降維矩陣 A 與升維矩陣 B。而模型的輸入輸出維度不變,輸出時將 BA 與預(yù)訓(xùn)練語言模型的參數(shù)疊加。用隨機高斯分布初始化 A,用 0 矩陣初始化 B。這樣能保證訓(xùn)練開始時,新增的通路BA=0從,而對模型結(jié)果沒有影響。

在推理時,將左右兩部分的結(jié)果加到一起即可,h=Wx+BAx=(W+BA)x,所以,只要將訓(xùn)練完成的矩陣乘積BA跟原本的權(quán)重矩陣W加到一起作為新權(quán)重參數(shù)替換原始預(yù)訓(xùn)練語言模型的W即可,不會增加額外的計算資源。

LoRA 的最大優(yōu)勢是速度更快,使用的內(nèi)存更少;因此,可以在消費級硬件上運行。

下面,我們來嘗試使用Alpaca-Lora進行參數(shù)高效模型微調(diào)。

環(huán)境搭建

基礎(chǔ)環(huán)境配置如下:

  • 操作系統(tǒng): CentOS 7
  • CPUs: 單個節(jié)點具有 1TB 內(nèi)存的 Intel CPU,物理CPU個數(shù)為64,每顆CPU核數(shù)為16
  • GPUs: 8 卡 A800 80GB GPUs
  • Python: 3.10 (需要先升級OpenSSL到1.1.1t版本(點擊下載OpenSSL),然后再編譯安裝Python),點擊下載Python
  • NVIDIA驅(qū)動程序版本: 515.65.01,根據(jù)不同型號選擇不同的驅(qū)動程序,點擊下載。
  • CUDA工具包: 11.7,點擊下載
  • NCCL: nccl_2.14.3-1+cuda11.7,點擊下載
  • cuDNN: 8.8.1.3_cuda11,點擊下載

上面的NVIDIA驅(qū)動、CUDA、Python等工具的安裝就不一一贅述了。

創(chuàng)建虛擬環(huán)境并激活虛擬環(huán)境alpara-lora-venv-py310-cu117:

cd /home/guodong.li/virtual-venv
virtualenv -p /usr/bin/python3.10 alpara-lora-venv-py310-cu117
source /home/guodong.li/virtual-venv/alpara-lora-venv-py310-cu117/bin/activate

離線安裝PyTorch,點擊下載對應(yīng)cuda版本的torch和torchvision即可。

pip install torch-1.13.1+cu117-cp310-cp310-linux_x86_64.whl
pip install pip install torchvision-0.14.1+cu117-cp310-cp310-linux_x86_64.whl

安裝transformers,目前,LLaMA相關(guān)的實現(xiàn)并沒有發(fā)布對應(yīng)的版本,但是已經(jīng)合并到主分支了,因此,我們需要切換到對應(yīng)的commit,從源代碼進行相應(yīng)的安裝。

cd transformers
git checkout 0041be5 
pip install .

在 Alpaca-LoRA 項目中,作者提到,為了廉價高效地進行微調(diào),他們使用了 Hugging Face 的 PEFT。PEFT 是一個庫(LoRA 是其支持的技術(shù)之一,除此之外還有Prefix Tuning、P-Tuning、Prompt Tuning),可以讓你使用各種基于 Transformer 結(jié)構(gòu)的語言模型進行高效微調(diào)。下面安裝PEFT。

git clone https://github.com/huggingface/peft.git
cd peft/
git checkout e536616
pip install .

安裝bitsandbytes。

git clone git@github.com:TimDettmers/bitsandbytes.git

cd bitsandbytes
CUDA_VERSION=117 make cuda11x
python setup.py install

安裝其他相關(guān)的庫。

cd alpaca-lora
pip install -r requirements.txt

requirements.txt文件具體的內(nèi)容如下:

accelerate
appdirs
loralib
black
black[jupyter]
datasets
fire
sentencepiece
gradio

模型格式轉(zhuǎn)換

將LLaMA原始權(quán)重文件轉(zhuǎn)換為Transformers庫對應(yīng)的模型文件格式。具體可參考之前的文章:從0到1復(fù)現(xiàn)斯坦福羊駝(Stanford Alpaca 7B) 。如果不想轉(zhuǎn)換LLaMA模型,也可以直接從Hugging Face下載轉(zhuǎn)換好的模型。

模型微調(diào)

訓(xùn)練的默認(rèn)值如下所示:

batch_size: 128
micro_batch_size: 4
num_epochs: 3
learning_rate: 0.0003
cutoff_len: 256
val_set_size: 2000
lora_r: 8
lora_alpha: 16
lora_dropout: 0.05
lora_target_modules: ['q_proj', 'v_proj']
train_on_inputs: True
group_by_length: False
wandb_project:
wandb_run_name:
wandb_watch:
wandb_log_model:
resume_from_checkpoint: False
prompt template: alpaca

使用默認(rèn)參數(shù),單卡訓(xùn)練完成大約需要5個小時,且對于GPU顯存的消耗確實很低。

 1%|█▌                                | 12/1170 [03:21<545, 16.83s/it]

本文為了加快訓(xùn)練速度,將batch_size和micro_batch_size調(diào)大并將num_epochs調(diào)小了。

python finetune.py 
--base_model '/data/nfs/guodong.li/pretrain/hf-llama-model/llama-7b' 
--data_path '/data/nfs/guodong.li/data/alpaca_data_cleaned.json' 
--output_dir '/home/guodong.li/output/lora-alpaca' 
--batch_size 256 
--micro_batch_size 16 
--num_epochs 2

當(dāng)然也可以根據(jù)需要微調(diào)超參數(shù),參考示例如下:

python finetune.py 
    --base_model 'decapoda-research/llama-7b-hf' 
    --data_path 'yahma/alpaca-cleaned' 
    --output_dir './lora-alpaca' 
    --batch_size 128 
    --micro_batch_size 4 
    --num_epochs 3 
    --learning_rate 1e-4 
    --cutoff_len 512 
    --val_set_size 2000 
    --lora_r 8 
    --lora_alpha 16 
    --lora_dropout 0.05 
    --lora_target_modules '[q_proj,v_proj]' 
    --train_on_inputs 
    --group_by_length

運行過程:

 python finetune.py 
> --base_model '/data/nfs/guodong.li/pretrain/hf-llama-model/llama-7b' 
> --data_path '/data/nfs/guodong.li/data/alpaca_data_cleaned.json' 
> --output_dir '/home/guodong.li/output/lora-alpaca' 
> --batch_size 256 
> --micro_batch_size 16 
> --num_epochs 2

===================================BUG REPORT===================================
Welcome to bitsandbytes. For bug reports, please submit your error trace to: https://github.com/TimDettmers/bitsandbytes/issues
================================================================================
/home/guodong.li/virtual-venv/alpara-lora-venv-py310-cu117/lib/python3.10/site-packages/bitsandbytes-0.37.2-py3.10.egg/bitsandbytes/cuda_setup/main.py UserWarning: WARNING: The following directories listed in your path were found to be non-existent: {PosixPath('/opt/rh/devtoolset-9/root/usr/lib/dyninst'), PosixPath('/opt/rh/devtoolset-7/root/usr/lib/dyninst')}
  warn(msg)
CUDA SETUP: CUDA runtime path found: /usr/local/cuda-11.7/lib64/libcudart.so
CUDA SETUP: Highest compute capability among GPUs detected: 8.0
CUDA SETUP: Detected CUDA version 117
CUDA SETUP: Loading binary /home/guodong.li/virtual-venv/alpara-lora-venv-py310-cu117/lib/python3.10/site-packages/bitsandbytes-0.37.2-py3.10.egg/bitsandbytes/libbitsandbytes_cuda117.so...
Training Alpaca-LoRA model with params:
base_model: /data/nfs/guodong.li/pretrain/hf-llama-model/llama-7b
data_path: /data/nfs/guodong.li/data/alpaca_data_cleaned.json
output_dir: /home/guodong.li/output/lora-alpaca
batch_size: 256
micro_batch_size: 16
num_epochs: 2
learning_rate: 0.0003
cutoff_len: 256
val_set_size: 2000
lora_r: 8
lora_alpha: 16
lora_dropout: 0.05
lora_target_modules: ['q_proj', 'v_proj']
train_on_inputs: True
group_by_length: False
wandb_project:
wandb_run_name:
wandb_watch:
wandb_log_model:
resume_from_checkpoint: False
prompt template: alpaca

Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 33/33 [00:10<00:00,  3.01it/s]
Found cached dataset json (/home/guodong.li/.cache/huggingface/datasets/json/default-2dab63d15cf49261/0.0.0/fe5dd6ea2639a6df622901539cb550cf8797e5a6b2dd7af1cf934bed8e233e6e)
100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 228.95it/s]
trainable params: 4194304 || all params: 6742609920 || trainable%: 0.06220594176090199
Loading cached split indices for dataset at /home/guodong.li/.cache/huggingface/datasets/json/default-2dab63d15cf49261/0.0.0/fe5dd6ea2639a6df622901539cb550cf8797e5a6b2dd7af1cf934bed8e233e6e/cache-d8c5d7ac95d53860.arrow and /home/guodong.li/.cache/huggingface/datasets/json/default-2dab63d15cf49261/0.0.0/fe5dd6ea2639a6df622901539cb550cf8797e5a6b2dd7af1cf934bed8e233e6e/cache-4a34b0c9feb19e72.arrow
{'loss': 2.2501, 'learning_rate': 2.6999999999999996e-05, 'epoch': 0.05}
...
{'loss': 0.8998, 'learning_rate': 0.000267, 'epoch': 0.46}
{'loss': 0.8959, 'learning_rate': 0.00029699999999999996, 'epoch': 0.51}
 28%|███████████████████████████████████████████▎                                                                                                               | 109/390 [32:48<114, 17.77s/it]

顯存占用:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.105.01   Driver Version: 515.105.01   CUDA Version: 11.7     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA A800 80G...  Off  | 0000000000.0 Off |                    0 |
| N/A   71C    P0   299W / 300W |  57431MiB / 81920MiB |    100%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+
...
+-------------------------------+----------------------+----------------------+
|   7  NVIDIA A800 80G...  Off  | 0000000000.0 Off |                    0 |
| N/A   33C    P0    71W / 300W |    951MiB / 81920MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A     55017      C   python                          57429MiB |
...
|    7   N/A  N/A     55017      C   python                            949MiB |
+-----------------------------------------------------------------------------+

發(fā)現(xiàn)GPU的使用率上去了,訓(xùn)練速度也提升了,但是沒有充分利用GPU資源,單卡訓(xùn)練(epoch:3)大概3小時即可完成。

因此,為了進一步提升模型訓(xùn)練速度,下面嘗試使用數(shù)據(jù)并行,在多卡上面進行訓(xùn)練。

torchrun --nproc_per_node=8 --master_port=29005 finetune.py 
--base_model '/data/nfs/guodong.li/pretrain/hf-llama-model/llama-7b' 
--data_path '/data/nfs/guodong.li/data/alpaca_data_cleaned.json' 
--output_dir '/home/guodong.li/output/lora-alpaca' 
--batch_size 256 
--micro_batch_size 16 
--num_epochs 2

運行過程:

torchrun --nproc_per_node=8 --master_port=29005 finetune.py 
> --base_model '/data/nfs/guodong.li/pretrain/hf-llama-model/llama-7b' 
> --data_path '/data/nfs/guodong.li/data/alpaca_data_cleaned.json' 
> --output_dir '/home/guodong.li/output/lora-alpaca' 
> --batch_size 256 
> --micro_batch_size 16 
> --num_epochs 2
WARNING
*****************************************
Setting OMP_NUM_THREADS environment variable for each process to be 1 in default, to avoid your system being overloaded, please further tune the variable for optimal performance in your application as needed.
*****************************************

===================================BUG REPORT===================================
Welcome to bitsandbytes. For bug reports, please submit your error trace to: https://github.com/TimDettmers/bitsandbytes/issues
================================================================================
...
===================================BUG REPORT===================================
Welcome to bitsandbytes. For bug reports, please submit your error trace to: https://github.com/TimDettmers/bitsandbytes/issues
================================================================================
/home/guodong.li/virtual-venv/alpara-lora-venv-py310-cu117/lib/python3.10/site-packages/bitsandbytes-0.37.2-py3.10.egg/bitsandbytes/cuda_setup/main.py UserWarning: WARNING: The following directories listed in your path were found to be non-existent: {PosixPath('/opt/rh/devtoolset-9/root/usr/lib/dyninst'), PosixPath('/opt/rh/devtoolset-7/root/usr/lib/dyninst')}
  warn(msg)
CUDA SETUP: CUDA runtime path found: /usr/local/cuda-11.7/lib64/libcudart.so
CUDA SETUP: Highest compute capability among GPUs detected: 8.0
CUDA SETUP: Detected CUDA version 117
CUDA SETUP: Loading binary /home/guodong.li/virtual-venv/alpara-lora-venv-py310-cu117/lib/python3.10/site-packages/bitsandbytes-0.37.2-py3.10.egg/bitsandbytes/libbitsandbytes_cuda117.so...
/home/guodong.li/virtual-venv/alpara-lora-venv-py310-cu117/lib/python3.10/site-packages/bitsandbytes-0.37.2-py3.10.egg/bitsandbytes/cuda_setup/main.py UserWarning: WARNING: The following directories listed in your path were found to be non-existent: {PosixPath('/opt/rh/devtoolset-7/root/usr/lib/dyninst'), PosixPath('/opt/rh/devtoolset-9/root/usr/lib/dyninst')}
...
Training Alpaca-LoRA model with params:
base_model: /data/nfs/guodong.li/pretrain/hf-llama-model/llama-7b
data_path: /data/nfs/guodong.li/data/alpaca_data_cleaned.json
output_dir: /home/guodong.li/output/lora-alpaca
batch_size: 256
micro_batch_size: 16
num_epochs: 2
learning_rate: 0.0003
cutoff_len: 256
val_set_size: 2000
lora_r: 8
lora_alpha: 16
lora_dropout: 0.05
lora_target_modules: ['q_proj', 'v_proj']
train_on_inputs: True
group_by_length: False
wandb_project:
wandb_run_name:
wandb_watch:
wandb_log_model:
resume_from_checkpoint: False
prompt template: alpaca

Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 33/33 [00:14<00:00,  2.25it/s]
...
Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 33/33 [00:20<00:00,  1.64it/s]
Found cached dataset json (/home/guodong.li/.cache/huggingface/datasets/json/default-2dab63d15cf49261/0.0.0/fe5dd6ea2639a6df622901539cb550cf8797e5a6b2dd7af1cf934bed8e233e6e)
100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 129.11it/s]
trainable params: 4194304 || all params: 6742609920 || trainable%: 0.06220594176090199
Loading cached split indices for dataset at /home/guodong.li/.cache/huggingface/datasets/json/default-2dab63d15cf49261/0.0.0/fe5dd6ea2639a6df622901539cb550cf8797e5a6b2dd7af1cf934bed8e233e6e/cache-d8c5d7ac95d53860.arrow and /home/guodong.li/.cache/huggingface/datasets/json/default-2dab63d15cf49261/0.0.0/fe5dd6ea2639a6df622901539cb550cf8797e5a6b2dd7af1cf934bed8e233e6e/cache-4a34b0c9feb19e72.arrow
Map:   4%|██████▎                                                                                                                                     | 2231/49942 [00:01<00:37, 1256.31 examples/s]Found cached dataset json (/home/guodong.li/.cache/huggingface/datasets/json/default-2dab63d15cf49261/0.0.0/fe5dd6ea2639a6df622901539cb550cf8797e5a6b2dd7af1cf934bed8e233e6e)
100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 220.24it/s]
...
trainable params: 4194304 || all params: 6742609920 || trainable%: 0.06220594176090199
Loading cached split indices for dataset at /home/guodong.li/.cache/huggingface/datasets/json/default-2dab63d15cf49261/0.0.0/fe5dd6ea2639a6df622901539cb550cf8797e5a6b2dd7af1cf934bed8e233e6e/cache-d8c5d7ac95d53860.arrow and /home/guodong.li/.cache/huggingface/datasets/json/default-2dab63d15cf49261/0.0.0/fe5dd6ea2639a6df622901539cb550cf8797e5a6b2dd7af1cf934bed8e233e6e/cache-4a34b0c9feb19e72.arrow
Map:   2%|██▋                                                                                                                                          | 939/49942 [00:00<00:37, 1323.94 examples/s]Found cached dataset json (/home/guodong.li/.cache/huggingface/datasets/json/default-2dab63d15cf49261/0.0.0/fe5dd6ea2639a6df622901539cb550cf8797e5a6b2dd7af1cf934bed8e233e6e)
100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 362.77it/s]
trainable params: 4194304 || all params: 6742609920 || trainable%: 0.06220594176090199
Loading cached split indices for dataset at /home/guodong.li/.cache/huggingface/datasets/json/default-2dab63d15cf49261/0.0.0/fe5dd6ea2639a6df622901539cb550cf8797e5a6b2dd7af1cf934bed8e233e6e/cache-d8c5d7ac95d53860.arrow and /home/guodong.li/.cache/huggingface/datasets/json/default-2dab63d15cf49261/0.0.0/fe5dd6ea2639a6df622901539cb550cf8797e5a6b2dd7af1cf934bed8e233e6e/cache-4a34b0c9feb19e72.arrow
{'loss': 2.2798, 'learning_rate': 1.7999999999999997e-05, 'epoch': 0.05}
...
{'loss': 0.853, 'learning_rate': 0.0002006896551724138, 'epoch': 1.02}
{'eval_loss': 0.8590874075889587, 'eval_runtime': 10.5401, 'eval_samples_per_second': 189.752, 'eval_steps_per_second': 3.036, 'epoch': 1.02}
{'loss': 0.8656, 'learning_rate': 0.0001903448275862069, 'epoch': 1.07}
...
{'loss': 0.8462, 'learning_rate': 6.620689655172413e-05, 'epoch': 1.69}
{'loss': 0.8585, 'learning_rate': 4.137931034482758e-06, 'epoch': 1.99}
{'loss': 0.8549, 'learning_rate': 0.00011814432989690721, 'epoch': 2.05}
{'eval_loss': 0.8465630412101746, 'eval_runtime': 10.5273, 'eval_samples_per_second': 189.983, 'eval_steps_per_second': 3.04, 'epoch': 2.05}
{'loss': 0.8492, 'learning_rate': 0.00011195876288659793, 'epoch': 2.1}
...
{'loss': 0.8398, 'learning_rate': 1.2989690721649484e-05, 'epoch': 2.92}
{'loss': 0.8473, 'learning_rate': 6.804123711340206e-06, 'epoch': 2.97}
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 585/585 [23:46<00:00,  2.38s/it] 
{'train_runtime': 1426.9255, 'train_samples_per_second': 104.999, 'train_steps_per_second': 0.41, 'train_loss': 0.9613736364576552, 'epoch': 2.99}
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 585/585 [23:46<00:00,  2.44s/it]


模型文件:

> tree /home/guodong.li/output/lora-alpaca
/home/guodong.li/output/lora-alpaca
├── adapter_config.json
├── adapter_model.bin
└── checkpoint-200
    ├── optimizer.pt
    ├── pytorch_model.bin
    ├── rng_state_0.pth
    ├── rng_state_1.pth
    ├── rng_state_2.pth
    ├── rng_state_3.pth
    ├── rng_state_4.pth
    ├── rng_state_5.pth
    ├── rng_state_6.pth
    ├── rng_state_7.pth
    ├── scaler.pt
    ├── scheduler.pt
    ├── trainer_state.json
    └── training_args.bin

1 directory, 16 files

我們可以看到,在數(shù)據(jù)并行的情況下,如果epoch=3(本文epoch=2),訓(xùn)練僅需要20分鐘左右即可完成。目前,tloen/Alpaca-LoRA-7b提供的最新“官方”的Alpaca-LoRA adapter于 3 月 26 日使用以下超參數(shù)進行訓(xùn)練。

-   Epochs: 10 (load from best epoch)
-   Batch size: 128
-   Cutoff length: 512
-   Learning rate: 3e-4
-   Lorar: 16
-   Lora target modules: q_proj, k_proj, v_proj, o_proj

具體命令如下:

python finetune.py 
    --base_model='decapoda-research/llama-7b-hf' 
    --num_epochs=10 
    --cutoff_len=512 
    --group_by_length 
    --output_dir='./lora-alpaca' 
    --lora_target_modules='[q_proj,k_proj,v_proj,o_proj]' 
    --lora_r=16 
    --micro_batch_size=8

模型推理

運行命令如下:

python generate.py 
    --load_8bit 
    --base_model '/data/nfs/guodong.li/pretrain/hf-llama-model/llama-7b' 
    --lora_weights '/home/guodong.li/output/lora-alpaca'

運行這個腳本會啟動一個gradio服務(wù),你可以通過瀏覽器在網(wǎng)頁上進行測試。

運行過程如下所示:

python generate.py 
>     --load_8bit 
>     --base_model '/data/nfs/guodong.li/pretrain/hf-llama-model/llama-7b' 
>     --lora_weights '/home/guodong.li/output/lora-alpaca'

===================================BUG REPORT===================================
Welcome to bitsandbytes. For bug reports, please submit your error trace to: https://github.com/TimDettmers/bitsandbytes/issues
================================================================================
/home/guodong.li/virtual-venv/alpara-lora-venv-py310-cu117/lib/python3.10/site-packages/bitsandbytes-0.37.2-py3.10.egg/bitsandbytes/cuda_setup/main.py UserWarning: WARNING: The following directories listed in your path were found to be non-existent: {PosixPath('/opt/rh/devtoolset-9/root/usr/lib/dyninst'), PosixPath('/opt/rh/devtoolset-7/root/usr/lib/dyninst')}
  warn(msg)
CUDA SETUP: CUDA runtime path found: /usr/local/cuda-11.7/lib64/libcudart.so
CUDA SETUP: Highest compute capability among GPUs detected: 8.0
CUDA SETUP: Detected CUDA version 117
CUDA SETUP: Loading binary /home/guodong.li/virtual-venv/alpara-lora-venv-py310-cu117/lib/python3.10/site-packages/bitsandbytes-0.37.2-py3.10.egg/bitsandbytes/libbitsandbytes_cuda117.so...
Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 33/33 [00:12<00:00,  2.68it/s]
/home/guodong.li/virtual-venv/alpara-lora-venv-py310-cu117/lib/python3.10/site-packages/gradio/inputs.py UserWarning: Usage of gradio.inputs is deprecated, and will not be supported in the future, please import your component from gradio.components
  warnings.warn(
/home/guodong.li/virtual-venv/alpara-lora-venv-py310-cu117/lib/python3.10/site-packages/gradio/deprecation.py UserWarning: `optional` parameter is deprecated, and it has no effect
  warnings.warn(value)
/home/guodong.li/virtual-venv/alpara-lora-venv-py310-cu117/lib/python3.10/site-packages/gradio/deprecation.py UserWarning: `numeric` parameter is deprecated, and it has no effect
  warnings.warn(value)
Running on local URL:  http://0.0.0.0:7860

To create a public link, set `share=True` in `launch()`.

顯存占用:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.105.01   Driver Version: 515.105.01   CUDA Version: 11.7     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA A800 80G...  Off  | 0000000000.0 Off |                    0 |
| N/A   50C    P0    81W / 300W |   8877MiB / 81920MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------+


+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      7837      C   python                           8875MiB |
+-----------------------------------------------------------------------------+

打開瀏覽器輸入IP+端口進行測試。

12d12872-f475-11ed-90ce-dac502259ad0.pngimage.png

將 LoRA 權(quán)重合并回基礎(chǔ)模型

下面將 LoRA 權(quán)重合并回基礎(chǔ)模型以導(dǎo)出為 HuggingFace 格式和 PyTorch state_dicts。以幫助想要在 llama.cpp 或 alpaca.cpp 等項目中運行推理的用戶。

導(dǎo)出為 HuggingFace 格式

修改export_hf_checkpoint.py文件:

import os

import torch
import transformers
from peft import PeftModel
from transformers import LlamaForCausalLM, LlamaTokenizer  # noqa: F402

BASE_MODEL = os.environ.get("BASE_MODEL", None)

# TODO
LORA_MODEL = os.environ.get("LORA_MODEL", "tloen/alpaca-lora-7b")
HF_CHECKPOINT = os.environ.get("HF_CHECKPOINT", "./hf_ckpt")

assert (
    BASE_MODEL
), "Please specify a value for BASE_MODEL environment variable, e.g. `export BASE_MODEL=decapoda-research/llama-7b-hf`"  # noqa: E501

tokenizer = LlamaTokenizer.from_pretrained(BASE_MODEL)

base_model = LlamaForCausalLM.from_pretrained(
    BASE_MODEL,
    load_in_8bit=False,
    torch_dtype=torch.float16,
    device_map={"": "cpu"},
)

first_weight = base_model.model.layers[0].self_attn.q_proj.weight
first_weight_old = first_weight.clone()

lora_model = PeftModel.from_pretrained(
    base_model,
    # TODO
    # "tloen/alpaca-lora-7b",
    LORA_MODEL,
    device_map={"": "cpu"},
    torch_dtype=torch.float16,
)

...

# TODO
LlamaForCausalLM.save_pretrained(
    base_model, HF_CHECKPOINT , state_dict=deloreanized_sd, max_shard_size="400MB"
)

運行命令:

BASE_MODEL=/data/nfs/guodong.li/pretrain/hf-llama-model/llama-7b 
LORA_MODEL=/home/guodong.li/output/lora-alpaca 
HF_CHECKPOINT=/home/guodong.li/output/hf_ckpt 
python export_hf_checkpoint.py

運行過程:

BASE_MODEL=/data/nfs/guodong.li/pretrain/hf-llama-model/llama-7b 
> LORA_MODEL=/home/guodong.li/output/lora-alpaca 
> HF_CHECKPOINT=/home/guodong.li/output/hf_ckpt 
> python export_hf_checkpoint.py

===================================BUG REPORT===================================
Welcome to bitsandbytes. For bug reports, please submit your error trace to: https://github.com/TimDettmers/bitsandbytes/issues
================================================================================
/home/guodong.li/virtual-venv/alpara-lora-venv-py310-cu117/lib/python3.10/site-packages/bitsandbytes-0.37.2-py3.10.egg/bitsandbytes/cuda_setup/main.py UserWarning: WARNING: The following directories listed in your path were found to be non-existent: {PosixPath('/opt/rh/devtoolset-7/root/usr/lib/dyninst'), PosixPath('/opt/rh/devtoolset-9/root/usr/lib/dyninst')}
  warn(msg)
CUDA SETUP: CUDA runtime path found: /usr/local/cuda-11.7/lib64/libcudart.so
CUDA SETUP: Highest compute capability among GPUs detected: 8.0
CUDA SETUP: Detected CUDA version 117
CUDA SETUP: Loading binary /home/guodong.li/virtual-venv/alpara-lora-venv-py310-cu117/lib/python3.10/site-packages/bitsandbytes-0.37.2-py3.10.egg/bitsandbytes/libbitsandbytes_cuda117.so...
Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 33/33 [00:05<00:00,  5.99it/s]

查看模型輸出文件:

> tree /home/guodong.li/output/hf_ckpt
/home/guodong.li/output/hf_ckpt
├── config.json
├── generation_config.json
├── pytorch_model-00001-of-00039.bin
├── pytorch_model-00002-of-00039.bin
...
├── pytorch_model-00038-of-00039.bin
├── pytorch_model-00039-of-00039.bin
└── pytorch_model.bin.index.json
0 directories, 42 files

導(dǎo)出為PyTorch state_dicts

修改export_state_dict_checkpoint.py文件:

import json
import os

import torch
import transformers
from peft import PeftModel
from transformers import LlamaForCausalLM, LlamaTokenizer  # noqa: E402

BASE_MODEL = os.environ.get("BASE_MODEL", None)
LORA_MODEL = os.environ.get("LORA_MODEL", "tloen/alpaca-lora-7b")
PTH_CHECKPOINT_PREFIX = os.environ.get("PTH_CHECKPOINT_PREFIX", "./ckpt")

assert (
    BASE_MODEL
), "Please specify a value for BASE_MODEL environment variable, e.g. `export BASE_MODEL=decapoda-research/llama-7b-hf`"  # noqa: E501

tokenizer = LlamaTokenizer.from_pretrained(BASE_MODEL)

base_model = LlamaForCausalLM.from_pretrained(
    BASE_MODEL,
    load_in_8bit=False,
    torch_dtype=torch.float16,
    device_map={"": "cpu"},
)

lora_model = PeftModel.from_pretrained(
    base_model,
    # todo
    #"tloen/alpaca-lora-7b",
    LORA_MODEL,
    device_map={"": "cpu"},
    torch_dtype=torch.float16,
)

...

os.makedirs(PTH_CHECKPOINT_PREFIX, exist_ok=True)

torch.save(new_state_dict, PTH_CHECKPOINT_PREFIX+"/consolidated.00.pth")

with open(PTH_CHECKPOINT_PREFIX+"/params.json", "w") as f:
    json.dump(params, f)

運行命令:

BASE_MODEL=/data/nfs/guodong.li/pretrain/hf-llama-model/llama-7b 
LORA_MODEL=/home/guodong.li/output/lora-alpaca 
PTH_CHECKPOINT_PREFIX=/home/guodong.li/output/ckpt 
python export_state_dict_checkpoint.py

查看模型輸出文件:

tree /home/guodong.li/output/ckpt
/home/guodong.li/output/ckpt
├── consolidated.00.pth
└── params.json

當(dāng)然,你還可以封裝為Docker鏡像來對訓(xùn)練和推理環(huán)境進行隔離。

封裝為Docker鏡像并進行推理

  1. 構(gòu)建Docker鏡像:
docker build -t alpaca-lora .
  1. 運行Docker容器進行推理 (您還可以使用 finetune.py 及其上面提供的所有超參數(shù)進行訓(xùn)練):
docker run --gpus=all --shm-size 64g -p 7860:7860 -v ${HOME}/.cache:/root/.cache --rm alpaca-lora generate.py 
    --load_8bit 
    --base_model 'decapoda-research/llama-7b-hf' 
    --lora_weights 'tloen/alpaca-lora-7b'
  1. 打開瀏覽器,輸入URL:https://localhost:7860進行測試。

結(jié)語

從上面可以看到,在一臺8卡的A800服務(wù)器上面,基于Alpaca-Lora針對alpaca_data_cleaned.json指令數(shù)據(jù)大概20分鐘左右即可完成參數(shù)高效微調(diào),相對于斯坦福羊駝訓(xùn)練速度顯著提升。

參考文檔

  • LLaMA
  • Stanford Alpaca:斯坦福-羊駝
  • Alpaca-LoRA


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8702

    瀏覽量

    84569
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3032

    瀏覽量

    48374
  • 語言模型
    +關(guān)注

    關(guān)注

    0

    文章

    487

    瀏覽量

    10201

原文標(biāo)題:足夠驚艷,使用Alpaca-Lora基于LLaMA(7B)二十分鐘完成微調(diào),效果比肩斯坦福羊駝

文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    有哪些省內(nèi)存的大語言模型訓(xùn)練/微調(diào)/推理方法?

    首先,我們需要了解如何根據(jù)參數(shù)量估計模型大致所需的 RAM,這在實踐中有很重要的參考意義。我們需要通過估算設(shè)置 batch_size,設(shè)置模型精度,選擇微調(diào)方法和
    的頭像 發(fā)表于 04-10 11:41 ?1288次閱讀

    使用LoRA和Hugging Face高效訓(xùn)練大語言模型

    在本文中,我們將展示如何使用 大語言模型低秩適配 (Low-Rank Adaptation of Large Language Models,LoRA) 技術(shù)在單 GPU 上微調(diào) 110 億
    的頭像 發(fā)表于 04-14 17:37 ?1852次閱讀

    如何訓(xùn)練自己的ChatGPT

    LLM 相關(guān)的開源社區(qū)這兩周涌現(xiàn)了很多優(yōu)秀的工作,吸引了很多人的關(guān)注。其中,我比較關(guān)注的是 Stanford 基于 LLaMA 的 Alpaca 和隨后出現(xiàn)的 LoRA 版本 Alpaca-LoRA。原因很簡單,便宜 。
    的頭像 發(fā)表于 04-21 14:11 ?3621次閱讀

    關(guān)于LLM+LoRa微調(diào)加速技術(shù)原理

    本文主要從LoRA基本原理及PEFT中的實現(xiàn)、基于mt0-large+lora的完整實踐兩方面進行了介紹。關(guān)于進一步的細(xì)節(jié),我們可以熟悉原理后,可以進行動手實踐,加深理解。
    發(fā)表于 04-24 10:32 ?3362次閱讀
    關(guān)于LLM+<b class='flag-5'>LoRa</b><b class='flag-5'>微調(diào)</b>加速技術(shù)原理

    調(diào)教LLaMA類模型沒那么難,LoRA模型微調(diào)縮減到幾小時

    工智能領(lǐng)域,以高效和有效的方式使用大型語言模型正變得越來越重要。 LoRA(Low-Rank Adaption,低秩自適應(yīng)) 作為微調(diào) LLMs 一種比較出圈的技術(shù),其額外引入了可訓(xùn)
    的頭像 發(fā)表于 05-28 10:58 ?2416次閱讀
    調(diào)教LLaMA類<b class='flag-5'>模型</b>沒那么難,<b class='flag-5'>LoRA</b>將<b class='flag-5'>模型</b><b class='flag-5'>微調(diào)</b>縮減到幾小時

    iPhone都能微調(diào)模型了嘛

    一起提出的新方法 QLoRA 把微調(diào)模型的 顯存需求從>780GB降低到 。 開源社區(qū)直接開始狂歡,相關(guān)論文成為24小時內(nèi)關(guān)注度最高的AI論文。 ? 以Meta的美洲駝LLaMA為基礎(chǔ),得到原駝
    的頭像 發(fā)表于 06-02 15:26 ?628次閱讀
    iPhone都能<b class='flag-5'>微調(diào)</b>大<b class='flag-5'>模型</b>了嘛

    GLoRA—高效微調(diào)模型參數(shù)

    近年來,大規(guī)模深度神經(jīng)網(wǎng)絡(luò)的顯著成就徹底改變了人工智能領(lǐng)域,在各種任務(wù)和領(lǐng)域展示了前所未有的性能。
    的頭像 發(fā)表于 06-27 16:47 ?697次閱讀
    GLoRA—<b class='flag-5'>高效</b><b class='flag-5'>微調(diào)</b><b class='flag-5'>模型</b><b class='flag-5'>參數(shù)</b>

    GLoRA:一種廣義參數(shù)高效微調(diào)方法

    了卓越的能力。 ? 本文提出了 廣義LoRA (GLoRA),一種通用參數(shù)高效微調(diào)任務(wù)的先進方法。增強低秩適應(yīng)(LoRA), GLoRA 采
    的頭像 發(fā)表于 06-27 16:53 ?628次閱讀
    GLoRA:一種廣義<b class='flag-5'>參數(shù)</b><b class='flag-5'>高效</b>的<b class='flag-5'>微調(diào)</b>方法

    OpenAI開放大模型微調(diào)功能 GPT-3.5可以打造專屬ChatGPT

    OpenAI開放大模型微調(diào)功能 GPT-3.5可以打造專屬ChatGPT OpenAI開放大模型微調(diào)功能,這意味著GPT-3.5 Turbo支持自定義
    的頭像 發(fā)表于 08-23 19:34 ?1103次閱讀

    怎樣使用QLoRA對Llama 2進行微調(diào)呢?

    使用QLoRA對Llama 2進行微調(diào)是我們常用的一個方法,但是在微調(diào)時會遇到各種各樣的問題
    的頭像 發(fā)表于 09-22 14:27 ?1535次閱讀
    怎樣使用QLoRA對Llama 2<b class='flag-5'>進行</b><b class='flag-5'>微調(diào)</b>呢?

    四種微調(diào)模型的方法介紹

    微調(diào)(Full Fine-tuning):全微調(diào)是指對整個預(yù)訓(xùn)練模型進行微調(diào),包括所有的模型
    發(fā)表于 01-03 10:57 ?2.2w次閱讀
    四種<b class='flag-5'>微調(diào)</b>大<b class='flag-5'>模型</b>的方法介紹

    模型微調(diào)開源項目全流程

    對于所有“基座”(Base)模型,–template 參數(shù)可以是 default, alpaca, vicuna 等任意值。但“對話”(Chat)模型請務(wù)必使用對應(yīng)的模板。
    的頭像 發(fā)表于 03-13 14:56 ?692次閱讀
    大<b class='flag-5'>模型</b><b class='flag-5'>微調(diào)</b>開源項目全流程

    基于雙級優(yōu)化(BLO)的消除過擬合的微調(diào)方法

    這篇論文試圖解決的問題是大型預(yù)訓(xùn)練模型在下游任務(wù)中進行微調(diào)時出現(xiàn)的過擬合問題。盡管低秩適應(yīng)(LoRA)及其變體通過學(xué)習(xí)低秩增量矩陣有效地減少了與完全
    的頭像 發(fā)表于 04-02 16:46 ?509次閱讀
    基于雙級優(yōu)化(BLO)的消除過擬合的<b class='flag-5'>微調(diào)</b>方法

    模型為什么要微調(diào)?大模型微調(diào)的原理

    難以達到最佳性能。為了提升模型在特定任務(wù)上的表現(xiàn),微調(diào)(Fine-tuning)成為了一個關(guān)鍵步驟。本文將詳細(xì)探討大模型為什么要進行微調(diào)以及
    的頭像 發(fā)表于 07-10 10:43 ?1962次閱讀

    chatglm2-6b在P40上做LORA微調(diào)

    chatglm2-6b模型在集團EA的P40機器上進行垂直領(lǐng)域的LORA微調(diào)。 一、chatglm2-6b介紹 github: https://github.com/THUDM/Cha
    的頭像 發(fā)表于 08-13 17:12 ?268次閱讀
    chatglm2-6b在P40上做<b class='flag-5'>LORA</b><b class='flag-5'>微調(diào)</b>