หน้าแรก>การเขียนโปรแกรมที่เกี่ยวข้อง>โค้ดแหล่งที่มา AI

ในการตัดแต่งโครงสร้างของแบบจำลองภาษาขนาดใหญ่

- - - - - บีบอัด LLM ของคุณทุกขนาด! - - - - -

ภาพ

การแนะนำ

LLM-Pruner: ในการตัดแต่งโครงสร้างของแบบจำลองภาษาขนาดใหญ่ [arxiv]
Xinyin Ma, Gongfan Fang, Xinchao Wang
มหาวิทยาลัยแห่งชาติสิงคโปร์

ทำไม LLM-Pruner

รองรับ LLMS:

อัปเดต:

รายการสิ่งที่ต้องทำ:

ติดต่อเรา:

เข้าร่วมกลุ่ม WeChat ของเราเพื่อแชท:

สารบัญ

เริ่มต้นอย่างรวดเร็ว

การติดตั้ง

 pip install -r requirement.txt

ตัวอย่างน้อยที่สุด

 bash script/llama_prune.sh

สคริปต์นี้จะบีบอัดโมเดล LLAMA-7B ด้วยพารามิเตอร์ ~ 20% ตัดแต่ง ทุกรุ่นที่ผ่านการฝึกอบรมมาก่อนและชุดข้อมูลจะถูกดาวน์โหลดโดยอัตโนมัติดังนั้นคุณไม่จำเป็นต้องดาวน์โหลดทรัพยากรด้วยตนเอง เมื่อเรียกใช้สคริปต์นี้เป็นครั้งแรกมันจะต้องใช้เวลาสักครู่ในการดาวน์โหลดโมเดลและชุดข้อมูล

คำแนะนำทีละขั้นตอน

ใช้เวลาสามขั้นตอนในการตัด LLM:

หลังจากการตัดแต่งกิ่งและการฝึกอบรมหลังการฝึกอบรมเราติดตาม LM-Evaluation-Harness เพื่อการประเมินผล

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 ด้วยตำแหน่งที่ต้องการซึ่งคุณต้องการบันทึกโมเดลที่ปรับแต่ง

เคล็ดลับ : ไม่แนะนำให้ฝึกอบรม LLAMA-2 ใน Float16 และเป็นที่รู้จักกันในการผลิต 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

เราให้บริการสคริปต์อย่างง่ายสำหรับข้อความ geneate โดยใช้โมเดลที่ผ่านการฝึกอบรมมาก่อน / ตัดแต่ง / ตัดแต่งด้วยการฝึกอบรมหลังการฝึกอบรม

 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>

คำแนะนำข้างต้นจะปรับใช้ LLM ของคุณในเครื่อง

4. การประเมินผล

สำหรับการประเมินประสิทธิภาพของแบบจำลองการตัดแต่งเราติดตาม LM-Evaluation-Harness เพื่อประเมินรูปแบบ:

 - 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 Equalts เป็น 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_MODEL และ PATH_TO_SAVE_TUNE_MODEL ด้วยเส้นทางที่คุณบันทึกโมเดลตัดแต่งและโมเดลที่ปรับแล้วและ PATH_OR_NAME_TO_BASE_MODEL สำหรับการโหลดไฟล์การกำหนดค่าของรุ่นฐาน

[อัปเดต]: เราอัปโหลดสคริปต์ไปยังกระบวนการประเมินผลหากคุณต้องการประเมินโมเดลตัดแต่งด้วยจุดตรวจสอบที่ปรับแต่ง เพียงใช้คำสั่งต่อไปนี้:

 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. การทดสอบ Macs, params และหน่วยความจำ

 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 พร้อมตัวอย่าง 2.59m:

อัตราส่วนการตัดแต่ง #param หน่วยความจำ ความหน่วงแฝง การเร่งความเร็ว บูลค์ Piqa Hellaswag Winogrande ส่วนโค้ง ARC-C OBQA เฉลี่ย
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 กับ 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 กับ 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

ผลลัพธ์เพิ่มเติมสามารถพบได้ในกระดาษ

ตัวอย่างเพิ่มเติม

รุ่นดั้งเดิม เอาท์พุท รุ่นตัดแต่ง เอาท์พุท
LLAMA-7B จักรวาลเป็นพื้นที่ว่างเวลาเวลาและพลังงานที่มีอยู่ มันรวมถึงสสารและพลังงานทั้งหมดไม่ว่าจะมองเห็นได้หรือไม่และในความเป็นจริงทั้งจักรวาลนั้นมองไม่เห็น มีหลายทฤษฎีเกี่ยวกับต้นกำเนิดและชะตากรรมที่ดีที่สุด ... LLAMA-5.4B จักรวาลเป็นพื้นที่ว่างเวลาเวลาและพลังงานที่มีอยู่ กฎหมายที่ประกอบขึ้นเป็นฟิสิกส์ - อิเล็กตรอนโคจรรอบอะตอมแม่เหล็กดึงดูดวัตถุอื่น ๆ ดาวเคราะห์โคจรรอบดวงอาทิตย์ - มีความสอดคล้องกัน ...
Vicuna-7b 10 ขั้นตอนในการสร้างแอพ iOS: 1. การวิจัยและพัฒนาความคิด 2. ตัดสินใจเกี่ยวกับแพลตฟอร์มที่คุณต้องการใช้ (iOS, Android หรือทั้งสองอย่าง) 3. สร้างแผนและงบประมาณ 4. จ้างทีมนักพัฒนา 5. ออกแบบส่วนต่อประสานผู้ใช้ (UI) 6. พัฒนาอินเทอร์เฟซผู้ใช้ (UI) 7. ทดสอบและวนซ้ำบนแอพ 8. ส่งแอพไปที่ App Store 9. เพิ่มประสิทธิภาพแอพสำหรับประสิทธิภาพและประสบการณ์การใช้งาน (UX) 10. ตลาดและโปรโมตแอพ Vicuna-5.4b 10 ขั้นตอนในการสร้างแอพ iOS: 1 วางแผนแอปของคุณ: ตัดสินใจว่าควรทำอย่างไรสิ่งที่จะเป็นอย่างไรและจะมีค่าใช้จ่ายในการสร้างอะไร 2. จ้างนักพัฒนา: นักพัฒนา iOS ที่ดีจะช่วยให้คุณออกแบบส่วนต่อประสานผู้ใช้สร้างแอพและตรวจสอบให้แน่ใจว่าไม่มีข้อผิดพลาด 3. สร้างส่วนต่อประสานผู้ใช้: นี่คือที่ที่เวทมนตร์เกิดขึ้น ส่วนต่อประสานผู้ใช้แอพของคุณจะได้รับการออกแบบและล้อเลียน ณ จุดนี้ ...
chatglm-6b เขียนบทกวีเกี่ยวกับความรักและความสงบสุข ท่ามกลางความเร่งรีบและคึกคักของชีวิตฉันพบว่าความรักของคุณสงบสุข มันเป็นความรู้สึกที่ไม่สามารถถ่ายทอดได้การเชื่อมต่อที่ไม่สามารถห่างไกลได้ ด้วยรอยยิ้มดวงตาของคุณอ้อมกอดของคุณฉันรู้สึกถึงความเป็นเจ้าของที่มีเพียงคุณเท่านั้นที่สามารถให้ได้ มันเป็นความรักที่คงอยู่ตลอดไปความรักที่ไม่สามารถเอาชนะได้ ... chatglm-5.6b เขียนบทกวีเกี่ยวกับความรักและความสงบสุข ความรักและความสงบสองสิ่งที่ยอดเยี่ยมเช่นนี้ ความปรารถนาอันบริสุทธิ์และไม่มีที่สิ้นสุดในใจของฉัน และทั้งคู่ฉันต้องแสวงหา นานนานฉันรู้ .. ความรักฉันรู้ว่าเป็นความรู้สึกของการเป็นหุ้นส่วนที่สมบูรณ์แบบในทุกแง่มุม และสันติภาพฉันต้องการมันมากวันหนึ่ง

ข้อมูลเวอร์ชัน

เนื่องจากการเปลี่ยนแปลงในรุ่นของรุ่นและ repos ที่ใช้ในโครงการนี้เราแสดงปัญหาเวอร์ชันที่รู้จักและรุ่นเฉพาะที่จำเป็นในการทำซ้ำวิธีการของเรา:

  1. LM-EVAL-HARNESS: เราใช้การกระทำของ LM-Evaluation-Harness นี้และรหัสยังรวมอยู่ใน repo นี้ โปรดตรวจสอบปัญหา #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}
}
ขยาย
ข้อมูลเพิ่มเติม