首頁>編程相關>Ai源碼

關於大語言模型的結構修剪

? ? ? ? ?將您的LLMS壓縮到任何尺寸! ? ? ? ? ?

圖像

介紹

LLM-Pruner:關於大語言模型的結構修剪[ARXIV]
Xinyin MA,Gongfan Fang,Xinchao Wang
新加坡國立大學

為什麼要LLM-Pruner

支持的LLM:

更新:

待辦事項列表:

聯繫我們:

加入我們的微信小組聊天:

目錄

快速開始

安裝

 pip install -r requirement.txt

最小例子

 bash script/llama_prune.sh

該腳本將用修剪20%的參數壓縮Llama-7b模型。所有預訓練的模型和數據集將自動下載,因此您無需手動下載資源。首次運行此腳本時,它將需要一些時間才能下載模型和數據集。

分步說明

它需要三個步驟才能修剪LLM:

修剪和訓練後修剪後,我們遵循LM評估 - 進行評估。

1。修剪(發現階段 +估計階段)

Llama/Llama-2修剪約20%的參數已修剪:

 python hf_prune.py --pruning_ratio 0.25 
      --block_wise 
      --block_mlp_layer_start 4 --block_mlp_layer_end 30 
      --block_attention_layer_start 4 --block_attention_layer_end 30 
      --pruner_type taylor 
      --test_after_train 
      --device cpu  --eval_device cuda 
      --save_ckpt_log_name llama_prune 

參數:

? Vicuna修剪

細節:

如果您想嘗試Vicuna,請指定參數--base_model到達Vicuna重量的路徑。請關注https://github.com/lm-sys/fastchat獲得Vicuna重量。

 python hf_prune.py --pruning_ratio 0.25 
      --block_wise 
      --block_mlp_layer_start 4 --block_mlp_layer_end 30 
      --block_attention_layer_start 4 --block_attention_layer_end 30 
      --pruner_type taylor 
      --test_after_train 
      --device cpu  --eval_device cuda 
      --save_ckpt_log_name llama_prune 
      --base_model PATH_TO_VICUNA_WEIGHTS

? Baichuan修剪

細節:

有關更多詳細信息,請參閱示例/Baichuan

? Llama3/llama3.1修剪

細節:
 python llama3.py --pruning_ratio 0.25 
                 --device cuda --eval_device cuda 
                 --base_model meta-llama/Meta-Llama-3-8B-Instruct 
                 --block_wise --block_mlp_layer_start 4 --block_mlp_layer_end 30 
                 --block_attention_layer_start 4 --block_attention_layer_end 30 
                 --save_ckpt_log_name llama3_prune 
                 --pruner_type taylor --taylor param_first 
                 --max_seq_len 2048 
                 --test_after_train --test_before_train --save_model 

2。訓練後(恢復階段)

 CUDA_VISIBLE_DEVICES=X python post_training.py --prune_model prune_log/PATH_TO_PRUNE_MODEL/pytorch_model.bin 
      --data_path yahma/alpaca-cleaned 
      --lora_r 8 
      --num_epochs 2  
      --learning_rate 1e-4  
      --batch_size 64 
      --output_dir tune_log/PATH_TO_SAVE_TUNE_MODEL  
      --wandb_project llama_tune

確保將PATH_TO_PRUNE_MODEL替換為步驟1中修剪模型的路徑,然後用要保存調諧模型的所需位置替換PATH_TO_SAVE_TUNE_MODEL

提示:不建議在Float16中訓練Llama-2,並且眾所周知會產生NAN;因此,該模型應在Bfloat16中進行訓練。

 deepspeed --include=localhost:1,2,3,4 post_training.py 
      --prune_model prune_log/PATH_TO_PRUNE_MODEL/pytorch_model.bin 
      --data_path MBZUAI/LaMini-instruction  
      --lora_r 8 
      --num_epochs 3  
      --output_dir tune_log/PATH_TO_SAVE_TUNE_MODEL 
      --extra_val_dataset wikitext2,ptb 
      --wandb_project llmpruner_lamini_tune 
      --learning_rate 5e-5 
      --cache_dataset

3。一代

如何加載修剪/預訓練的模型:

對於修剪模型,只需使用以下命令加載模型即可。

  pruned_dict = torch.load(YOUR_CHECKPOINT_PATH, map_location='cpu')
  tokenizer, model = pruned_dict['tokenizer'], pruned_dict['model']

由於修剪模型中模塊之間的配置不同,在修剪模型中,某些層可能具有更大的寬度,而其他層的修剪較大,因此使用.from_pretrained() (通過擁抱面孔)加載模型是不切實際的。目前,我們使用torch.save存儲修剪模型。

由於修剪模型在每一層中具有不同的配置,就像某些圖層可能更寬,但有些層的修剪得多,因此該模型無法在擁抱面中加載.from_pretrained() 。當前,我們只需使用torch.save來保存修剪模型和torch.load 。負載即可加載修剪的模型。

Gradio接口產生

我們提供了一個簡單的腳本來使用帶有培訓後培訓的預訓練 /修剪模型 /修剪模型進行基因文本。

 python generate.py --model_type pretrain
 python generate.py --model_type pruneLLM --ckpt <YOUR_MODEL_PATH_FOR_PRUNE_MODEL>
 python generate.py --model_type tune_prune_LLM --ckpt <YOUR_CKPT_PATH_FOR_PRUNE_MODEL> --lora_ckpt <YOUR_CKPT_PATH_FOR_LORA_WEIGHT>

以上說明將在本地部署您的LLMS。

4。評估

為了評估修剪模型的性能,我們遵循LM評估 - 評估模型:

 - PATH_TO_SAVE_TUNE_MODEL
  | - checkpoint-200
      | - pytorch_model.bin
      | - optimizer.pt
      ...
  | - checkpoint-400
  | - checkpoint-600
  ...
  | - adapter_config.bin
  | - adapter-config.json

通過以下命令安排文件:

 cd PATH_TO_SAVE_TUNE_MODEL
export epoch=YOUR_EVALUATE_EPOCH
cp adapter_config.json checkpoint-$epoch/
mv checkpoint-$epoch/pytorch_model.bin checkpoint-$epoch/adapter_model.bin

如果要評估checkpoint-200 ,則將Epoch等於200的export epoch=200

 export PYTHONPATH='.'
python lm-evaluation-harness/main.py --model hf-causal-experimental 
       --model_args checkpoint=PATH_TO_PRUNE_MODEL,peft=PATH_TO_SAVE_TUNE_MODEL,config_pretrained=PATH_OR_NAME_TO_BASE_MODEL 
       --tasks openbookqa,arc_easy,winogrande,hellaswag,arc_challenge,piqa,boolq 
       --device cuda:0 --no_cache 
       --output_path PATH_TO_SAVE_EVALUATION_LOG 

在這裡,用保存修剪模型和調諧模型的路徑替換PATH_TO_PRUNE_MODELPATH_TO_SAVE_TUNE_MODEL ,而PATH_OR_NAME_TO_BASE_MODEL用於加載基本模型的配置文件。

[UPDATE]:如果您想使用調諧檢查點評估修剪模型,我們將上傳腳本以簡單地評估過程。只需使用以下命令:

 CUDA_VISIBLE_DEVICES=X bash scripts/evaluate.sh PATH_OR_NAME_TO_BASE_MODEL PATH_TO_SAVE_TUNE_MODEL  PATH_TO_PRUNE_MODEL EPOCHS_YOU_WANT_TO_EVALUATE

在命令中替換模型的必要信息。如果您想在一個命令中評估幾個檢查點,則最終的習慣是在不同的時期迭代。例如:

 CUDA_VISIBLE_DEVICES=1 bash scripts/evaluate.sh decapoda-research/llama-7b-hf tune_log/llama_7B_hessian prune_log/llama_prune_7B 200 1000 2000

5。測試Mac,參數和內存

 python test_speedup.py --model_type pretrain
 python test_speedup.py --model_type pruneLLM --ckpt <YOUR_MODEL_PATH_FOR_PRUNE_MODEL>

零射門評估

Llama-7b的簡短定量結果:


Vicuna-7b的結果:


CHATGLM-6B的結果:


修剪模型的統計數據:


LLM-Pruner的結果為259萬樣品:

修剪比率#param記憶潛伏期加速布爾克piqa Hellaswag WinograndeOBQA平均的
Llama-7b 6.74b 12884.5MIB 69.32 1倍73.18 78.35 72.99 67.01 67.45 41.38 42.40 63.25
與羊駝(50k)的駱駝5.4b 5.47b 10488.4mib 58.55 1.18x 64.62 77.20 68.80 63.14 64.31 36.77 39.80 59.23
Lamini(259m) 5.47b 10488.4mib 58.55 1.18x 76.57 77.37 66.60 65.82 70.62 40.70 38.80 62.36

可以在論文中找到更多結果。

更多例子

原始型號輸出修剪模型輸出
Llama-7b宇宙是存在的全部空間,時間,物質和能量。它包括所有物質和能量,無論是否可見,實際上整個宇宙都是看不見的。關於其起源和最終命運的理論很多... Llama-5.4b宇宙是存在的全部空間,時間,物質和能量。構成物理學的法律 - 電子原子,吸引其他物體的磁鐵,繞太陽繞行的行星 - 一直保持一致...
Vicuna-7b建立iOS應用程序的10個步驟:1。研究和發展這個想法。 2。確定要使用的平台(iOS,Android或兩者)。 3。制定計劃和預算。 4.僱用一個開發人員團隊。 5。設計用戶界面(UI)。 6。開髮用戶界面(UI)。 7。在應用程序上進行測試和迭代。 8。將應用程序提交到應用商店。 9.優化應用程序的性能和用戶體驗(UX)。 10。市場並推廣該應用程序。 Vicuna-5.4b構建iOS應用程序的10個步驟:1。計劃您的應用程序:確定應該做什麼,它的外觀以及構建它的成本。 2.僱用開發人員:良好的iOS開發人員將幫助您設計用戶界面,創建應用程序並確保它不含錯誤。 3。創建一個用戶界面:這是魔術發生的地方。您應用程序的用戶界面將在這一點上進行設計和嘲笑...
chatglm-6b寫一首關於愛與和平的詩。在人生的喧囂中,我發現你的愛是一個舒緩的和平。這種感覺無法傳達,這種聯繫是無法遠距離的。憑著你的微笑,你的眼睛,你的擁抱,我感到只有你才能給予的歸屬感。這是一種永遠持續的愛,一種不能失敗的愛... chatglm-5.6b寫一首關於愛與和平的詩。愛與和平,這兩個奇妙的事情我的心中純淨而無盡的慾望,我必須尋求很長一段時間,我知道。

版本信息

由於該項目中使用的模型和存儲庫的版本變化,我們列出了一些已知版本問題以及重現我們方法所需的特定版本:

  1. LM-eval-Harness:我們使用LM評估 - harness的這種承諾,並且該代碼也包括在此存儲庫中。請檢查第25期中的詳細信息。
  2. Llama1-7b:我們在實驗中使用Decapoda-research/Llama-7b-HF的檢查站,這是現在無法使用的。請考慮使用複製版本,例如,Baffo32/decapoda-research-llama-7b-hf。

限制

致謝

引用

如果您覺得這個項目有用,請引用

 @inproceedings{ma2023llmpruner,
  title={LLM-Pruner: On the Structural Pruning of Large Language Models},
  author={Xinyin Ma and Gongfan Fang and Xinchao Wang},
  booktitle={Advances in Neural Information Processing Systems},
  year={2023},
}
 @article{fang2023depgraph,
  title={DepGraph: Towards Any Structural Pruning},
  author={Fang, Gongfan and Ma, Xinyin and Song, Mingli and Mi, Michael Bi and Wang, Xinchao},
  journal={The IEEE/CVF Conference on Computer Vision and Pattern Recognition},
  year={2023}
}
展開
附加信息