SVD-LLM : décomposition de valeurs singulières pour la compression de grands modèles de langage [arXiv]
Xin Wang 1 , Yu Zheng 2 , Zhongwei Wan 1 , Mi Zhang 1
1 Université d'État de l'Ohio, 2 Université d'État du Michigan
Les progrès des grands modèles linguistiques (LLM) ont été entravés par leur taille importante, qui nécessite des méthodes de compression LLM pour un déploiement pratique. La décomposition en valeurs singulières (SVD) offre une solution prometteuse pour la compression LLM. Cependant, les méthodes de compression LLM de pointe basées sur SVD présentent deux limitations clés : la troncature de valeurs singulières plus petites peut entraîner une perte de compression plus élevée et le manque de mise à jour du poids compressé après la troncature du SVD. Dans ce travail, nous proposons SVD-LLM, une nouvelle méthode de compression LLM basée sur SVD qui répond aux limites des méthodes existantes. SVD-LLM intègre une stratégie de blanchiment des données prenant en compte la troncature pour garantir un mappage direct entre les valeurs singulières et la perte de compression. De plus, SVD-LLM adopte une stratégie de mise à jour des paramètres du modèle de forme fermée par couche pour compenser la dégradation de la précision sous des taux de compression élevés. Nous évaluons SVD-LLM sur un total de 10 ensembles de données et huit modèles de trois familles LLM différentes à quatre échelles différentes. Nos résultats démontrent la supériorité du SVD-LLM sur l’état de l’art, en particulier aux taux de compression de modèle élevés.
Veuillez conserver la version du package transformers exactement égale à 4.35.2 car la version compressée svd de LLM présente un léger changement dans la structure du modèle (dans le dossier component/.
).
pip install -r requirements.txt
bash compress_llama.sh
Ce script compresserait le modèle LLaMA-7B sous un taux de compression de 20 % et exécuterait automatiquement le code d'évaluation, incluant à la fois la perplexité et l'efficacité du modèle compressé.
Nous implémentons SVD-LLM avec deux pipelines différents :
Sous le faible taux de compression (taux recommandé <= 0,3), nous exécutons d’abord le blanchiment des données du LLM et enregistrons le poids ainsi que les informations de blanchiment.
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
Sous le taux de compression élevé (taux recommandé > 0,3), nous pouvons en outre appliquer une mise à jour de forme fermée par couche pour mettre à jour la matrice de poids après le premier pipeline afin d'améliorer la précision.
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
Nous fournissons également l'implémentation permettant d'exécuter une mise à jour fermée par couche uniquement dans SVD-LLM. Bien que cette version ne soit pas aussi bonne que les deux versions ci-dessus de SVD-LLM, elle reste meilleure que les versions de base existantes.
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
Le modèle compressé de l'un des deux pipelines ci-dessus peut également être combiné avec le réglage fin LoRA pour obtenir une meilleure précision. Nous avons emprunté le code de réglage fin LoRA à LLM-Pruner avec la même configuration.
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 peut également être intégré à des méthodes de quantification pour obtenir une meilleure compression. Voici l'exemple de comment intégrer SVD-LLM (taux de compression de 20%) avec GPTQ-4bit pour compresser LLaMA-7B
bash svdllm_gptq.sh
python SVDLLM.py
--step 4
--model_path COMPRESSD_MODEL_SAVING_PATH
Nous utilisons le même ensemble de données c4 que dans SparseGPT. Étant donné que le lien de téléchargement d'origine n'est pas valide, veuillez le télécharger directement à partir de ce lien et ajouter les deux fichiers json sous utils/.
dossier.
python SVDLLM.py
--step 5
--model_path COMPRESSD_MODEL_SAVING_PATH
Si vous trouvez ce travail utile, veuillez citer
@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}
}