SVD-LLM: 大規模言語モデル圧縮のための特異値分解[arXiv]
Xin Wang 1 、Yu Zheng 2 、Zhongwei Wan 1 、Mi Zhang 1
1オハイオ州立大学、 2ミシガン州立大学
Large Language Model (LLM) の進歩は、そのサイズが大きいために妨げられており、実際の展開には LLM 圧縮方法が必要です。特異値分解 (SVD) は、LLM 圧縮に有望なソリューションを提供します。ただし、最先端の SVD ベースの LLM 圧縮方法には、2 つの重要な制限があります。1 つは、より小さい特異値を切り捨てると、圧縮損失が大きくなる可能性があること、もう 1 つは、SVD 切り捨て後に圧縮された重みが更新されないことです。この研究では、既存の方法の制限に対処する新しい SVD ベースの LLM 圧縮方法である SVD-LLM を提案します。 SVD-LLM には、切り捨てを意識したデータ ホワイトニング戦略が組み込まれており、特異値と圧縮損失の間の直接マッピングが保証されます。さらに、SVD-LLM は、層ごとの閉形式モデルのパラメーター更新戦略を採用し、高圧縮率での精度の低下を補償します。 4 つの異なるスケールで、3 つの異なる LLM ファミリーからの合計 10 のデータセットと 8 つのモデルで SVD-LLM を評価します。私たちの結果は、特に高いモデル圧縮率において、SVD-LLM が最新技術よりも優れていることを示しています。
LLM の svd 圧縮バージョンではモデル構造 ( component/.
フォルダー内) がわずかに変更されているため、transformers パッケージのバージョンを 4.35.2 と正確に同じにしてください。
pip install -r requirements.txt
bash compress_llama.sh
このスクリプトは、LLaMA-7B モデルを 20% の圧縮率未満で圧縮し、圧縮モデルの複雑さと効率性の両方を含む評価コードを自動的に実行します。
2 つの異なるパイプラインを使用して 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 の上記 2 つのバージョンほど優れたものではありませんが、それでも既存のベースラインよりは優れています。
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
上記の 2 つのパイプラインのいずれかからの圧縮モデルを 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-4bit を統合して LLaMA-7B を圧縮する方法の例です。
bash svdllm_gptq.sh
python SVDLLM.py
--step 4
--model_path COMPRESSD_MODEL_SAVING_PATH
SparseGPT と同じ c4 データセットを使用します。元のダウンロード リンクは無効であるため、このリンクから直接ダウンロードし、 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}
}