👋 안녕하세요, 오늘은 "A Survey on Model Compression for Large Language Models"라는 논문을 📖 리뷰해보려고 합니다. 이 논문은 2023년에 발표되었으며, 2024년 11월 기준, 188회 인용될 정도로 주목받고 있는 최신 리뷰 논문입니다. 대형 언어 모델(LLM)에서 모델 압축 기술이 점차적으로 중요해지는 상황에서, 이 논문은 다양한 모델 압축 방법론에 대한 포괄적인 탐색을 제공하고 있습니다. 꽤나 요약이 잘되어있어서 리뷰를 진행합니다!
대표적인 압축 예시로는, 앤트맨이 있습니다ㅎㅎ
모델 압축의 필요성
최근 LLM은 갈수록 더 거대해지고 있으며, 이러한 확장된 모델들은 우수한 성능을 제공하는 반면, 상당한 컴퓨팅 자원을 요구합니다. 예를 들어, GPT-3 175B 모델의 경우 FP16 형식으로 약 350GB의 메모리가 필요하며, 이를 구동하려면 A100 80GB GPU가 적어도 5대가 필요합니다 (약 1억 원 정도 ㅎㅎ...). 이는 상당한 💰 비용 부담으로 이어지며, GPU 자원 확보가 어려운 연구자들에게 큰 걸림돌로 작용합니다.
이와 같은 문제를 해결하기 위해 모델 압축 기술이 중요한 역할을 하고 있습니다. 모델 압축은 거대 모델을 소형화하여 성능을 유지하면서도 추론 속도를 높이고 자원 사용을 최적화하는 방안을 제시합니다.
특히 제한된 자원 환경에서 대규모 모델을 활용하고자 하는 경우에는 이러한 기술들이 필수적입니다. 또한, 모델 압축은 단순한 자원 절감뿐만 아니라 소형화된 모델을 모바일 장치나 엣지 컴퓨팅 환경에서도 사용할 수 있도록 함으로써, LLM의 활용 범위를 더욱 확장하는 중요한 기술적 기반이 됩니다. 💡
모델 압축 기술들 📊
모델 압축 기술은 크게 양자화(Quantization), 가지치기(Pruning), 지식 증류(Knowledge Distillation), 저순위 인수분해(Low-Rank Factorization)로 구분됩니다. 각 접근법의 주요 개념과 실제 적용 사례를 통해 이들 기술의 본질을 살펴보겠습니다.
1. 양자화 (Quantization)
양자화는 모델의 매개변수를 저 정밀도 데이터 타입으로 변환하여 모델의 크기를 줄이고 추론 효율을 증가시키는 방법입니다. 양자화는 크게 QAT(Quantization-Aware Training)[왼쪽]와 PTQ(Post-Training Quantization)[오른쪽]로 나뉩니다.
- Quantization-Aware Training (QAT): QAT는 모델의 양자화로 인한 성능 저하를 최소화하기 위해, 양자화된 모델을 재학습하는 방식입니다. QAT는 높은 자원이 요구되지만, 최종적으로 더 우수한 성능을 유지할 수 있습니다. QLORA, PEQA, LoftQ 등의 기법들은 매개변수 효율적 미세 조정(Parameter-Efficient Fine Tuning, PEFT)과 결합하여 양자화 재학습을 효율화합니다. 이러한 접근은 대규모 모델에서도 원래 성능을 유지할 수 있도록 하며, 고정밀 연산이 필요한 작업에서도 효과적입니다.
- LLM-QAT는 LLM 자체에서 데이터를 생성하여 지식을 추출하고, 생성된 데이터를 기반으로 양자화된 LLM을 훈련하여 원래 LLM의 출력 분포와 일치시킵니다.
- OneBit는 1-bit 양자화를 구현했습니다... (1비트🤔??)(github 보니까 아직은 llama만 지원하는듯...)
- Post-Training Quantization (PTQ): PTQ는 학습이 완료된 모델을 추가적인 재학습 없이 양자화하는 방법입니다. PTQ는 Weight-Only Quantization, Weight-Activation Quantization, KV Cache Quantization 세 가지로 나뉩니다. PTQ는 재학습이 필요 없으므로 적용이 간편하지만, 성능 저하의 가능성이 있습니다. 그럼에도 불구하고, 자원이 제한적인 환경에서 매우 유용하며, 모델 경량화 속도가 빠르다는 장점이 있습니다.
- Weight-Only Quantization: 이 기법은 모델의 가중치만을 저정밀도로 변환하여 메모리 사용량을 줄이고 연산 효율성을 높이는 것을 목표로 합니다. 하지만 양자화된 가중치는 활성화와 곱하기 전에 양자화 해제(dequantization)가 필요하기 때문에 가중치 전용 양자화는 추론 중에 필연적으로 추가적인 계산 오버헤드가 있을 수 있습니다. 여러 가지 방식이 존재하며, 주요 방식들은 다음과 같습니다
- Binary-coding Quantization (BCQ): BCQ는 LLM의 매개변수를 이진 매개변수와 스케일링 인자의 세트로 분해하여, 가중치 전용 양자화에서 행렬 곱셈을 가속화합니다.
- GPTQ: GPTQ는 Optimal Brain Quantization에 기반한 계층별 양자화 방법을 제안합니다. 역 헤시안 정보를 사용하여 가중치를 업데이트하고, LLM을 3비트 또는 4비트로 양자화합니다. 최근 연구에서는 2비트 양자화까지 가능해졌습니다.
- QuIP: QuIP는 calibration set에서 무작위로 추출된 벡터를 기반으로 헤시안 행렬의 LDL 분해를 활용하여 가중치를 최적화합니다. 그 후, 가중치와 헤시안 행렬 간의 불일치를 보장하기 위해 무작위 직교 행렬의 크로네커 곱을 사용합니다. 이러한 방식은 모델의 성능 손실을 최소화하면서 2비트 양자화를 달성하는 데 목적이 있습니다.
- AWQ (Adaptive Weight Quantization): AWQ는 높은 정밀도에서 LLM의 성능에 가장 큰 영향을 미치는 가중치의 상위 1%를 저장하고, 나머지 가중치에 대해 채널별 스케일링 방법을 적용하여 최적의 스케일링 요소를 식별합니다.
- OWQ (Outlier Weight Quantization): OWQ는 AWQ와 유사하게 활성화 이상치에 민감한 가중치를 고정밀로 저장하고, 나머지 비민감 가중치만을 양자화하는 방법입니다.
- SpQR (Sparse Quantization and Recalibration): SpQR은 양자화된 예측과 기존 예측 사이의 L2 에러를 가중치 민감도 측정 기준으로 사용합니다. 이를 통해 민감도가 높은 가중치를 식별하고, 이러한 가중치는 보다 높은 정밀도로 유지하면서 나머지 가중치만 양자화합니다.
- SqueezeLLM: SqueezeLLM은 가중치의 민감도에 기반한 클러스터링 알고리즘을 도입하여, k-means 군집 중심점을 양자화된 가중치 값으로 사용합니다. 이를 통해 민감한 가중치를 효과적으로 식별하고 제외한 나머지를 양자화합니다. 결과적으로 LLM을 3비트로 양자화하며, 속도 또한 FP16 대비 약 2배 향상됩니다.
- Weight-Activation Quantization: 모델의 가중치뿐만 아니라 활성화 값도 함께 양자화하여 모델의 크기와 메모리 사용량을 줄이는 접근법입니다.
- ZeroQuant: ZeroQuant는 LLM에서 가중치-활성화 양자화를 적용한 최초의 연구 중 하나입니다. 이 기법은 가중치에 대해 그룹별 양자화(group-wise quantization)를 적용하고, 활성화에 대해서는 토큰 크기 기반 양자화(token size quantization)를 사용하여, 가중치와 활성화를 INT8로 양자화합니다.
- LLM.int8(): LLM.int8()은 활성화 값의 이상치 문제를 해결하기 위해, 이러한 이상치 특징 차원을 고정밀로 저장하고, 나머지 특징들을 벡터별 양자화를 통해 처리합니다.
- SmoothQuant: SmoothQuant는 다양한 토큰들이 활성화 채널 간에 유사한 변형을 가진다는 사실을 기반으로, 활성화 이상치를 부드럽게 처리하기 위해 채널별 스케일링 변환을 설계합니다.
- OmniQuant: OmniQuant(Shao et al., 2024b)는 활성화 값의 이상치를 처리하기 위해, 활성화에서 가중치로 양자화의 과제를 전환하고 클리핑 임계값을 최적화하여 가중치의 극값을 조정합니다.
- KV Cache Quantization: 트랜스포머 모델에서 Key-Value 캐시를 양자화하여 메모리 사용량을 줄입니다. 이는 특히 추론 속도를 높이고, 메모리 효율성을 극대화하는 데 기여합니다. KV Cache의 양자화는 주로 캐시의 정확도를 유지하면서 메모리 사용량을 줄이는 데 중점을 둡니다. 최신 연구에서는 각 캐시의 채널별로 다른 양자화 스케일을 적용하거나, 동적 범위 조절을 통해 최적의 양자화 전략을 찾는 방법들이 제안되고 있습니다.
- Weight-Only Quantization: 이 기법은 모델의 가중치만을 저정밀도로 변환하여 메모리 사용량을 줄이고 연산 효율성을 높이는 것을 목표로 합니다. 하지만 양자화된 가중치는 활성화와 곱하기 전에 양자화 해제(dequantization)가 필요하기 때문에 가중치 전용 양자화는 추론 중에 필연적으로 추가적인 계산 오버헤드가 있을 수 있습니다. 여러 가지 방식이 존재하며, 주요 방식들은 다음과 같습니다
2. 가지치기 (Pruning) ✂️
가지치기는 모델에서 중복된 구성 요소를 제거하여 모델의 크기와 복잡성을 줄이는 강력한 기술입니다. 가지치기는 크게 비구조화 가지치기(Unstructured Pruning), 구조화 가지치기(Structured Pruning), 반구조화 가지치기(Semi-Structured Pruning)로 나눌 수 있습니다.
- 비구조화 가지치기 (Unstructured Pruning): 개별 매개변수를 제거하여 불규칙한 sparse 구조를 만드는 방식입니다.
- SparseGPT는 가지치기를 광범위한 희소 회귀 문제로 구성하고, 근사 희소 회귀 솔버를 사용하여 해결합니다., OPT-175B 및 BLOOM-176B와 같은 대규모 GPT 모델에서 최대 50% 이상의 희소성을 달성하며, perplexity의 증가를 최소화합니다.
- 구조화 가지치기 (Structured Pruning): 뉴런, 어텐션 헤드 또는 레이어와 같은 전체 구성 요소를 제거하여 특정 규칙에 따라 전체 네트워크 구조를 유지하는 방식입니다. 구조화된 가지치기는 하드웨어 친화적이어서 가지치기 후에도 가속화된 추론이 가능하다는 장점이 있습니다. 그러나 중요한 구성 요소를 제거하면 성능이 저하될 수 있기 때문에, 보통 효율적인 미세 조정이 필요합니다. 구조화된 가지치기는 Loss-based Pruning, Magnitude-based Pruning, Regularization-based Pruning의 세 가지로 나눌 수 있습니다.
- Loss-based Pruning: 손실 함수나 기울기 정보에 기반하여 가지치기 단위의 중요성을 평가하는 방식입니다.
- LLMPruner는 종속성 감지 알고리즘을 통해 종속 구조를 식별하고, 손실 변화에만 의존하지 않고, 작업에 독립적인 방식으로 경사 정보를 사용하여 최적의 가지치기 그룹을 선택합니다. LoRA를 활용해 가지치기 후 모델의 성능을 빠르게 회복합니다.
- Magnitude-based Pruning: 가지치기 단위의 크기를 기준으로 중요성을 평가하여, 일정 임계값 아래의 요소를 가지 치는 방식입니다.
- SliceGPT(Ashkboos et al., 2024)는 PCA를 사용하여 신호 행렬을 주성분에 투영한 후, 중요하지 않은 요소를 제거하는 방식으로 모델을 최적화합니다.
- Regularization-based Pruning: L0, L1, L2 등의 정규화 항목을 손실 함수에 추가하여 모델의 희소성을 유도하는 방식입니다.
- Sheared LLaMA(Xia et al., 2024)는 라그랑주 승수를 이용해 최적의 가지치기 마스크를 도출합니다.
- Loss-based Pruning: 손실 함수나 기울기 정보에 기반하여 가지치기 단위의 중요성을 평가하는 방식입니다.
- 반구조화 가지치기 (Semi-Structured Pruning): 반구조화된 가지치기는 구조화된 가지치기와 비구조화된 가지치기의 중간 형태로, 세밀한 가지치기와 구조적 정규화를 동시에 달성합니다. 예를 들어, N:M 희소성은 M개의 연속된 요소 중 N개의 요소만 남기는 방식으로, 효율적인 가지치기를 달성할 수 있습니다.
Tip: PTQ(Post-Training Quantization)와 가지치기를 적용할 때는 고품질의 calibration dataset을 준비하는 것이 매우 중요합니다. Williams와 Aletras(2023)는 calibration dataset의 선택이 모델 압축 방법에 큰 영향을 미칠 수 있음을 발견했습니다. 고품질의 calibration dataset은 압축된 모델의 성능과 정확도를 개선하는 데 중요한 역할을 합니다.
3. 지식 증류 (Knowledge Distillation) 📚
지식 증류(KD)는 크고 복잡한 모델(즉, 교사 모델)에서 더 작고 간단한 모델(즉, 학생 모델)로 지식을 전수하는 것을 목표로 하는 기술입니다. 지식 증류는 크게 블랙박스 지식 증류와 화이트박스 지식 증류로 나눌 수 있습니다.
- 블랙박스 지식 증류 (Black-box KD): 블랙박스 KD는 교사 모델의 출력만을 이용해 학생 모델을 학습시키는 방식입니다. 교사 모델의 내부 구조에 접근할 수 없기 때문에 폐쇄형 LLM에 적용 가능하다는 장점이 있습니다. ChatGPT(gpt-3.5-turbo)와 GPT-4와 같은 대형 LLM이 교사 모델로 사용되며, 학생 모델로는 GPT-2, T5, FlanT5, CodeT5와 같은 더 작은 언어 모델들이 주로 활용됩니다.
블랙박스 KD는 주로 교사 모델의 출력을 기반으로 학생 모델을 미세 조정하여, 학생 모델이 교사 모델의 성능을 최대한 재현하도록 돕습니다. 주요 접근 방식으로는 Chain-of-Thought (CoT) Distillation, In-Context Learning (ICL) Distillation, Instruction Following (IF) Distillation이 있습니다.
- Chain-of-Thought Distillation (CoT): CoT 증류는 LLM이 중간 추론 단계를 생성하도록 촉구하여 복잡한 추론 작업을 단계적으로 처리할 수 있도록 합니다.
- In-Context Learning Distillation (ICL): ICL은 LLM이 그래디언트 업데이트 없이 새로운 작업을 학습할 수 있도록 작업 설명과 예시가 있는 구조화된 프롬프트를 사용하여 증류를 수행합니다.
- Instruction Following Distillation (IF): IF 증류는 LLM의 제로샷 학습 능력을 강화하는 것을 목표로 합니다. 명령어와 유사한 프롬프트-응답 쌍을 사용해 모델을 미세 조정하며, LaMini-LM은 이러한 접근을 통해 258만 개의 명령어를 기반으로 모델을 효과적으로 미세 조정한 사례입니다.
- 화이트박스 지식 증류 (White-box KD): 화이트박스 KD는 교사 모델의 내부 구조와 매개변수에 접근하여, 학생 모델이 교사 모델의 지식을 깊이 있게 학습할 수 있도록 하는 방식입니다.
- MINILLM은 교사 모델의 출력 분포를 학습하는 과정에서 역방향 Kullback-Leibler 발산을 목표로 하여 학생 모델이 교사 분포의 낮은 확률 영역을 과대평가하지 않도록 방지합니다. 이 접근은 학생 모델이 교사 모델의 복잡한 지식 표현을 보다 잘 학습할 수 있게 하지만, 현재 오픈소스 LLM의 성능 한계로 인해 성과 개선이 제한적일 수 있습니다.
지식 증류는 모델의 크기를 줄이면서도 성능을 유지하고, 작은 모델에서도 대형 모델의 지식을 효과적으로 전수하는 데 중요한 역할을 합니다. 블랙박스와 화이트박스 접근 각각의 장단점을 고려하여 상황에 맞게 선택하여 활용할 수 있습니다.
4. 저순위 인수분해 (Low-Rank Factorization)
저순위 인수분해는 큰 가중치 행렬을 두 개의 작은 행렬로 분해하여 모델의 크기를 줄이는 방식입니다. 예를 들어, LPLR은 가중치 행렬을 저순위로 분해하여 저장하고, 이를 통해 모델을 효율적으로 압축합니다. 이러한 접근은 특히 대규모 언어 모델에서 가중치 행렬의 복잡성을 줄여 연산량을 감소시키고 추론 속도를 높이는 데 기여합니다. 🚀 저순위 인수분해는 아직 널리 사용되고 있지는 않습니다.
결론 ✨
LLM의 모델 압축은 현재와 같은 자원 한정적 환경에서 필수적인 기술로 자리 잡고 있습니다. 양자화, 가지치기, 지식 증류, 저순위 인수분해와 같은 다양한 모델 압축 기법들은 각기 다른 장단점을 지니고 있으며, 응용 환경에 따라 적절히 선택하여 활용해야 합니다. 예를 들어, 모바일 환경에서는 간편하게 적용할 수 있는 PTQ가 유리할 수 있고, 고성능이 요구되는 서버 환경에서는 QAT가 적합할 수 있습니다. 📱💻
이번 논문 리뷰를 통해 다양한 모델 압축 기술들을 살펴보았습니다. 모델 자원이 부족할 때, 이러한 기술들을 적절히 활용함으로써 비용을 절감하고 성능을 유지하는 데 큰 도움이 될 것입니다. 💡 앞으로도 더욱 흥미로운 주제로 찾아뵙겠습니다. 감사합니다. 🙏
여러분의 피드백과 질문은 언제나 환영합니다. 이 글이 유익했다면 👍 좋아요와 💬 댓글 부탁드리며, 궁금한 점이나 더 알고 싶은 주제가 있다면 말씀해 주세요. 여러분의 관심이 더 나은 콘텐츠를 만드는 데 큰 힘이 됩니다. 감사합니다. ✨
'인공지능' 카테고리의 다른 글
vLLM으로 OpenAI API 스타일 서버를 Docker로 배포하는 방법 (0) | 2024.12.27 |
---|---|
Node.js 실행했는데 아무것도 안뜨는 이유... 경로 문제였다고?! (2) | 2024.11.27 |
LLM에서 사용되는 Float16, Float8, Int4, Int3는 뭘까? (2) | 2024.11.16 |
LLM은 어떻게 평가할까? - 인기 성능 평가 도구와 리더보드 파헤치기 (3) | 2024.11.15 |
어르신들을 위한 ‘취미 공유 플랫폼’을 만든다면? 웹사이트로 시작해도 될까? (34) | 2024.11.14 |