Beranda>Terkait pemrograman>Kode Sumber AI

Pada pemangkasan struktural model bahasa besar

? ? ? ? ? Kompres LLM Anda ke ukuran apa pun! ? ? ? ? ?

gambar

Perkenalan

LLM-PRUNER: Pada pemangkasan struktural model bahasa besar [Arxiv]
Xinyin MA, Gongfan Fang, Xinchao Wang
Universitas Nasional Singapura

Mengapa LLM-Pruner

LLMS yang didukung:

Pembaruan:

Daftar TODO:

Hubungi kami:

Bergabunglah dengan grup WeChat kami untuk mengobrol:

Daftar isi

Awal yang cepat

Instalasi

 pip install -r requirement.txt

Contoh minimal

 bash script/llama_prune.sh

Skrip ini akan memampatkan model LLAMA-7B dengan ~ 20% parameter yang dipangkas. Semua model pra-terlatih dan dataset akan diunduh secara otomatis, sehingga Anda tidak perlu mengunduh sumber daya secara manual. Saat menjalankan skrip ini untuk pertama kalinya, itu akan membutuhkan waktu untuk mengunduh model dan dataset.

Instruksi langkah demi langkah

Dibutuhkan tiga langkah untuk memangkas llm:

Setelah pemangkasan dan pasca-pelatihan, kami mengikuti LM-Evaluasi-Harness untuk evaluasi.

1. Pemangkasan (tahap penemuan + tahap estimasi)

? Llama/llama-2 pemangkasan dengan ~ 20% parameter dipangkas:

 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 

Argumen:

? Pemangkasan vicuna

Detail:

Jika Anda ingin mencoba Vicuna, tentukan argumennya --base_model ke jalan menuju berat vicuna. Silakan ikuti https://github.com/lm-sys/fastchat untuk mendapatkan bobot 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

? Pemangkasan Baichuan

Detail:

Silakan merujuk ke contoh/Baichuan untuk lebih jelasnya

? Llama3/llama3.1 pemangkasan

Detail:
 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. Pasca-Pelatihan (Pulihkan Tahap)

 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

Pastikan untuk mengganti PATH_TO_PRUNE_MODEL dengan path ke model yang dipangkas pada Langkah 1, dan ganti PATH_TO_SAVE_TUNE_MODEL dengan lokasi yang diinginkan di mana Anda ingin menyimpan model yang disetel.

Kiat : Pelatihan Llama-2 di float16 tidak dianjurkan dan diketahui menghasilkan NAN; Dengan demikian, model harus dilatih di 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. Generasi

Cara memuat model yang dipangkas/terlatih:

Untuk model yang dipangkas, cukup gunakan perintah berikut untuk memuat model Anda.

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

Karena konfigurasi yang berbeda antara modul dalam model yang dipangkas, di mana lapisan tertentu mungkin memiliki lebar yang lebih besar sementara yang lain telah mengalami lebih banyak pemangkasan, menjadi tidak praktis untuk memuat model menggunakan .from_pretrained() sebagaimana disediakan oleh memeluk wajah. Saat ini, kami menggunakan torch.save untuk menyimpan model yang dipangkas.

Karena model yang dipangkas memiliki konfigurasi yang berbeda di setiap lapisan, seperti beberapa lapisan mungkin lebih lebar tetapi beberapa lapisan telah dipangkas lebih banyak, model tidak dapat dimuat dengan .from_pretrained() di wajah pelukan. Saat ini, kami cukup menggunakan torch.save untuk menyimpan model yang dipangkas dan torch.load untuk memuat model yang dipangkas.

Generasi dengan antarmuka gradio

Kami memberikan skrip sederhana untuk teks geneate menggunakan model pra-terlatih / dipangkas / model pruned dengan pasca-pelatihan.

 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>

Instruksi di atas akan menggunakan LLM Anda secara lokal.

4. Evaluasi

Untuk mengevaluasi kinerja model yang dipangkas, kami mengikuti LM-evaluasi-Harness untuk mengevaluasi model:

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

Atur file dengan perintah berikut:

 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

Jika Anda ingin mengevaluasi checkpoint-200 , maka atur Epoch Equalts ke 200 dengan 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 

Di sini, ganti PATH_TO_PRUNE_MODEL dan PATH_TO_SAVE_TUNE_MODEL dengan path yang Anda simpan model yang dipangkas dan model yang disetel, dan PATH_OR_NAME_TO_BASE_MODEL adalah untuk memuat file konfigurasi model dasar.

[UPDATE]: Kami mengunggah skrip hanya untuk proses evaluasi jika Anda ingin mengevaluasi model yang dipangkas dengan pos pemeriksaan yang disetel. Cukup gunakan perintah berikut:

 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

Ganti informasi yang diperlukan dari model Anda dalam perintah. Yang terakhir digunakan untuk mengulangi zaman yang berbeda jika Anda ingin mengevaluasi beberapa pos pemeriksaan dalam satu perintah. Misalnya:

 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. Menguji Mac, Params, dan Memori

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

Evaluasi Zero-Shot

Hasil kuantitatif singkat untuk LLAMA-7B:


Hasil untuk Vicuna-7b:


Hasil untuk chatglm-6b:


Statistik untuk model yang dipangkas:


Hasil LLM-Pruner dengan 2,59m sampel:

Rasio pemangkasan #Param Ingatan Latensi Percepatan Boolq Piqa Hellaswag Winogrande Arc-e Arc-C OBQA Rata-rata
Llama-7b 6.74b 12884.5mib 69.32S 1x 73.18 78.35 72.99 67.01 67.45 41.38 42.40 63.25
Llama-5.4b dengan alpaca (50k) 5.47b 10488.4MIB 58.55S 1.18x 64.62 77.20 68.80 63.14 64.31 36.77 39.80 59.23
Llama-5.4b dengan lamini (2,59m) 5.47b 10488.4MIB 58.55S 1.18x 76.57 77.37 66.60 65.82 70.62 40.70 38.80 62.36

Lebih banyak hasil dapat ditemukan di koran.

Lebih banyak contoh

Model asli Keluaran Model yang dipangkas Keluaran
Llama-7b Alam semesta adalah keseluruhan ruang, waktu, materi, dan energi yang ada. Ini mencakup semua materi dan energi, baik terlihat atau tidak, dan pada kenyataannya seluruh alam semesta tidak terlihat. Ada banyak teori tentang asal dan takdirnya ... Llama-5.4b Alam semesta adalah keseluruhan ruang, waktu, materi, dan energi yang ada. Undang -undang yang membentuk fisika - elektron yang mengorbit atom, magnet yang menarik benda lain, planet yang mengorbit matahari - telah konsisten ...
Vicuna-7b 10 Langkah untuk Membangun Aplikasi iOS: 1. Meneliti dan mengembangkan ide. 2. Tentukan platform yang ingin Anda gunakan (iOS, Android, atau keduanya). 3. Buat rencana dan anggaran. 4. Pekerjakan tim pengembang. 5. Desain Antarmuka Pengguna (UI). 6. Kembangkan Antarmuka Pengguna (UI). 7. Uji dan Iterasi pada Aplikasi. 8. Kirimkan aplikasi ke App Store. 9. Optimalkan aplikasi untuk kinerja dan pengalaman pengguna (UX). 10. Pasar dan promosikan aplikasi. Vicuna-5.4b 10 Langkah untuk Membangun Aplikasi iOS: 1. Rencanakan aplikasi Anda: Tentukan apa yang harus dilakukan, seperti apa nantinya, dan berapa biaya untuk membangunnya. 2. Pekerjakan pengembang: Pengembang iOS yang baik akan membantu Anda merancang antarmuka pengguna, membuat aplikasi, dan pastikan itu bebas bug. 3. Buat Antarmuka Pengguna: Di sinilah keajaiban terjadi. Antarmuka pengguna aplikasi Anda akan dirancang dan diejek pada saat ini ...
Chatglm-6b Tulis puisi tentang cinta dan kedamaian. Di tengah -tengah keramaian dan kesibukan hidup, saya menemukan cinta Anda kedamaian yang menenangkan. Ini adalah perasaan yang tidak dapat disampaikan, koneksi yang tidak dapat jauh. Dengan senyum Anda, mata Anda, pelukan Anda, saya merasa memiliki rasa memiliki yang hanya bisa Anda berikan. Itu adalah cinta yang bertahan selamanya, cinta yang tidak bisa dikalahkan ... Chatglm-5.6b Tulis puisi tentang cinta dan kedamaian. Cinta dan kedamaian, dua hal yang begitu indah keinginan yang murni dan tak ada habisnya di hati saya dan keduanya, saya harus mencari untuk waktu yang sangat lama, saya tahu .. cinta, saya tahu, adalah perasaan menjadi pasangan yang sempurna, dalam segala hal dan kedamaian, saya membutuhkannya, sangat banyak, suatu hari nanti, hati saya akan pergi .. dan damai, saya membutuhkannya ..

Informasi versi

Karena perubahan dalam versi model dan repo yang digunakan dalam proyek ini, kami mencantumkan beberapa masalah versi yang diketahui dan versi spesifik yang diperlukan untuk mereproduksi metode kami:

  1. LM-EVAL-HARNESS: Kami menggunakan komit ini dari LM-Evaluasi-Harness, dan kodenya juga termasuk dalam repo ini. Silakan periksa masalah #25 untuk detailnya.
  2. LLAMA1-7B: Kami menggunakan pos pemeriksaan Decapoda-Research/LLAMA-7B-HF dalam percobaan kami, yang tidak tersedia sekarang. Harap pertimbangkan untuk menggunakan versi yang disalin, misalnya, Baffo32/decapoda-research-llama-7b-hf.

Keterbatasan

Pengakuan

Kutipan

Jika Anda menemukan proyek ini bermanfaat, silakan mengutip

 @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}
}
Memperluas
Informasi Tambahan