SVD-LLM: การแบ่งแยกค่าเอกพจน์สำหรับการบีบอัดโมเดลภาษาขนาดใหญ่ [arXiv]
ซินหวาง 1 , หยูเจิ้ง 2 , จงเว่ยวาน 1 , มีจาง 1
1 มหาวิทยาลัยแห่งรัฐโอไฮโอ 2 มหาวิทยาลัยแห่งรัฐมิชิแกน
ความก้าวหน้าในโมเดลภาษาขนาดใหญ่ (LLM) ถูกขัดขวางโดยขนาดที่ใหญ่โต ซึ่งจำเป็นต้องใช้วิธีการบีบอัด LLM สำหรับการใช้งานจริง Singular Value Decomposition (SVD) นำเสนอโซลูชันที่น่าหวังสำหรับการบีบอัด LLM อย่างไรก็ตาม วิธีการบีบอัด LLM ที่ใช้ SVD ที่ล้ำสมัยมีข้อจำกัดที่สำคัญสองประการ: การตัดทอนค่าเอกพจน์ที่น้อยลงอาจทำให้เกิดการสูญเสียการบีบอัดที่สูงขึ้น และการขาดการอัปเดตน้ำหนักที่บีบอัดหลังจากการตัดทอน SVD ในงานนี้ เราขอเสนอ SVD-LLM ซึ่งเป็นวิธีการบีบอัด LLM ที่ใช้ SVD ใหม่ที่จัดการกับข้อจำกัดของวิธีการที่มีอยู่ SVD-LLM รวมเอากลยุทธ์การทำให้ข้อมูลขาวขึ้นโดยคำนึงถึงการตัดทอนเพื่อให้แน่ใจว่ามีการแมปโดยตรงระหว่างค่าเอกพจน์และการสูญเสียการบีบอัด นอกจากนี้ SVD-LLM ยังใช้กลยุทธ์การอัปเดตพารามิเตอร์โมเดลรูปแบบปิดแบบเลเยอร์เพื่อชดเชยการลดความแม่นยำภายใต้อัตราส่วนการบีบอัดที่สูง เราประเมิน SVD-LLM จากชุดข้อมูลทั้งหมด 10 ชุดและโมเดล 8 โมเดลจากตระกูล LLM ที่แตกต่างกัน 3 ตระกูลในระดับขนาดที่แตกต่างกัน 4 ระดับ ผลลัพธ์ของเราแสดงให้เห็นถึงความเหนือกว่าของ SVD-LLM ที่เหนือกว่าเทคโนโลยีล้ำสมัย โดยเฉพาะอย่างยิ่งที่อัตราส่วนการบีบอัดโมเดลที่สูง
โปรดคงเวอร์ชันของแพ็คเกจ Transformers ไว้เท่ากับ 4.35.2 ทุกประการ เนื่องจาก LLM เวอร์ชันบีบอัด svd มีการเปลี่ยนแปลงโครงสร้างโมเดลเล็กน้อย (ในโฟลเดอร์ component/.
)
pip install -r requirements.txt
bash compress_llama.sh
สคริปต์นี้จะบีบอัดโมเดล LLaMA-7B ภายใต้อัตราส่วนการบีบอัด 20% และรันโค้ดการประเมินโดยอัตโนมัติ รวมถึงความงุนงงและประสิทธิภาพของโมเดลที่ถูกบีบอัด
เราใช้ SVD-LLM กับไปป์ไลน์ที่แตกต่างกันสองแบบ:
ภายใต้อัตราส่วนการบีบอัดต่ำ (อัตราส่วนที่แนะนำ <= 0.3) เราจะดำเนินการฟอกสีข้อมูลของ LLM ก่อน และบันทึกน้ำหนักพร้อมกับข้อมูลการฟอกสีฟัน
python SVDLLM.py
--step 1
--ratio COMPRESSION_RATIO
--model HUGGINGFACE_MODEL_REPO
--whitening_nsamples WHITENING_SAMPLE_NUMBER
--dataset WHITENING_DATASET
--seed SAMPLING_SEED
--model_seq_len MODEL_SEQ_LEN
--save_path WHITENING_INFO_SAVING_PATH
ภายใต้อัตราส่วนการบีบอัดสูง (อัตราส่วนที่แนะนำ > 0.3) เราสามารถใช้การอัปเดตฟอร์มปิดแบบเลเยอร์เพิ่มเติมเพื่ออัปเดตเมทริกซ์น้ำหนักหลังจากไปป์ไลน์แรกเพื่อปรับปรุงความแม่นยำ
python SVDLLM.py
--step 2
--ratio COMPRESSION_RATIO
--model HUGGINGFACE_MODEL_REPO
--whitening_nsamples WHITENING_SAMPLE_NUMBER
--updating_nsamples UPDATING_SAMPLE_NUMBER
--dataset WHITENING_DATASET
--seed SAMPLING_SEED
--model_seq_len MODEL_SEQ_LEN
--save_path WHITENING_INFO_SAVING_PATH
นอกจากนี้เรายังจัดให้มีการใช้งานเพื่อเรียกใช้การอัปเดตแบบฟอร์มปิดแบบเลเยอร์ใน SVD-LLM เท่านั้น แม้ว่าเวอร์ชันนี้จะไม่ดีเท่ากับ SVD-LLM สองเวอร์ชันข้างต้น แต่ก็ยังดีกว่าเวอร์ชันพื้นฐานที่มีอยู่
python SVDLLM.py
--step 3
--ratio COMPRESSION_RATIO
--model HUGGINGFACE_MODEL_REPO
--updating_nsamples UPDATING_SAMPLE_NUMBER
--dataset WHITENING_DATASET
--seed SAMPLING_SEED
--model_seq_len MODEL_SEQ_LEN
--save_path WHITENING_INFO_SAVING_PATH
โมเดลที่บีบอัดจากไปป์ไลน์ทั้งสองข้างต้นสามารถใช้ร่วมกับการปรับแต่ง LoRA อย่างละเอียดเพื่อให้ได้ความแม่นยำที่ดีขึ้น เรายืมโค้ดการปรับแต่ง LoRA จาก LLM-Pruner ที่มีการกำหนดค่าเดียวกัน
python LoRA.py
--prune_model COMPRESSED_MODEL_PATH
--data_path yahma/alpaca-cleaned
--output_dir LORA_OUTPUT_PATH
--lora_r 8
--num_epochs 2
--learning_rate 1e-4
--batch_size 64
SVD-LLM ยังสามารถบูรณาการเข้ากับวิธีการเชิงปริมาณเพื่อให้ได้การบีบอัดที่ดีขึ้น นี่คือตัวอย่างวิธีรวม SVD-LLM (อัตราส่วนการบีบอัด 20%) เข้ากับ GPTQ-4 บิตเพื่อบีบอัด LLaMA-7B
bash svdllm_gptq.sh
python SVDLLM.py
--step 4
--model_path COMPRESSD_MODEL_SAVING_PATH
เราใช้ชุดข้อมูล c4 เดียวกันกับใน SparseGPT เนื่องจากลิงก์ dowload ต้นฉบับไม่ถูกต้อง โปรดดาวน์โหลดโดยตรงจากลิงก์นี้ และเพิ่มไฟล์ json สองไฟล์ใต้ utils/.
โฟลเดอร์
python SVDLLM.py
--step 5
--model_path COMPRESSD_MODEL_SAVING_PATH
หากคุณพบว่างานนี้มีประโยชน์โปรดอ้างอิง
@article{wang2024svd,
title={Svd-llm: Truncation-aware singular value decomposition for large language model compression},
author={Wang, Xin and Zheng, Yu and Wan, Zhongwei and Zhang, Mi},
journal={arXiv preprint arXiv:2403.07378},
year={2024}
}