SVD-LLM: 대규모 언어 모델 압축을 위한 특이값 분해 [arXiv]
Xin Wang 1 , Yu Zheng 2 , Zhongwei Wan 1 , Mi Zhang 1
1 오하이오 주립대학교, 2 미시간 주립대학교
LLM(대형 언어 모델)의 발전은 실제 배포를 위해 LLM 압축 방법이 필요한 상당한 크기로 인해 방해를 받았습니다. SVD(Singular Value Decomposition)는 LLM 압축을 위한 유망한 솔루션을 제공합니다. 그러나 최첨단 SVD 기반 LLM 압축 방법에는 두 가지 주요 제한 사항이 있습니다. 즉, 더 작은 특이값을 자르면 압축 손실이 높아질 수 있고 SVD 잘린 후 압축된 가중치에 대한 업데이트가 부족하다는 점입니다. 본 연구에서는 기존 방법의 한계를 해결한 새로운 SVD 기반 LLM 압축 방법인 SVD-LLM을 제안한다. SVD-LLM은 절단 인식 데이터 화이트닝 전략을 통합하여 특이값과 압축 손실 간의 직접적인 매핑을 보장합니다. 또한 SVD-LLM은 높은 압축률에서 정확도 저하를 보상하기 위해 레이어별 폐쇄형 모델 매개변수 업데이트 전략을 채택합니다. 우리는 총 10개의 데이터세트와 3개의 서로 다른 LLM 제품군의 8개 모델을 4가지 규모로 평가하여 SVD-LLM을 평가합니다. 우리의 결과는 특히 높은 모델 압축 비율에서 최첨단 기술에 비해 SVD-LLM이 우수함을 보여줍니다.
LLM의 svd 압축 버전에는 모델 구조가 약간 변경되었으므로 변환기 패키지 버전을 4.35.2와 정확히 동일하게 유지하십시오( 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 미세 조정과 결합하여 더 나은 정확도를 얻을 수도 있습니다. 동일한 구성으로 LLM-Pruner에서 LoRA 미세 조정 코드를 빌려왔습니다.
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}
}