활성값 압축
Activation Compression · SmoothQuant · AWQ · LLM.int8() · Weight-Activation Quantization · Outlier Handling
개요
LLM 추론에서 활성값(activation)은 모델의 각 레이어를 통과하면서 생성되는 중간 값들로, 어텐션 계산과 피드포워드 네트워크의 핵심 연산에 사용됩니다. 가중치(weight)와 달리 활성값은 추론 동안 동적으로 변화하며, 분포가 불균일하고 아웃라이어가 빈번하게 발생합니다. 이러한 특성 때문에 활성값 양자화는 가중치 양자화보다 훨씬 어렵습니다.
활성값 압축은 이 메모리 병목을 해결하기 위해 활성값의 정밀도를 낮추거나(양자화), 불균일한 분포를 평탄화하거나(smoothing), 중요하지 않은 값들을 제거하는 기법들의 총칭입니다. 본 문서는 활성값을 직접 저비트로 만드는 기법과, 활성값 통계를 이용해 양자화 오차를 제어하는 주변 기법까지 함께 묶어 각 동작 원리·트레이드오프·시스템 통합 방안을 정리합니다.
1. 활성값 메모리 문제
LLM 추론에서 활성값은 두 가지 주요 메모리 소비원을 만듭니다.
1.1 어텐션 활성값
어텐션 메커니즘에서 Q, K, V 행렬은 시퀀스 길이에 비례해 커집니다:
Attention_bytes ≈ 3 × L × n_heads × head_dim × seq_len × batch × bytes_per_element
3: Q + K + V 3개L: 레이어 수n_heads: 어텐션 헤드 수head_dim: 헤드당 차원seq_len: 시퀀스 길이
1.2 피드포워드 활성값
피드포워드 네트워크(FFN)의 중간 레이어 활성값은 hidden_dim × intermediate_dim 크기를 가집니다:
FFN_bytes ≈ 2 × L × batch × seq_len × intermediate_dim × bytes_per_element
1.3 왜 활성값 압축이 중요한가
| 병목 | 설명 | 압축이 완화하는 것 |
|---|---|---|
| 메모리 용량 | 긴 문맥·큰 배치에서 활성값 HBM 소진 | 같은 GPU에 더 많은 요청 수용 |
| 메모리 대역폭 | 매 디코딩 스텝마다 활성값 읽기 | 읽기량 감소 → 디코딩 속도 향상 |
| 배치 제한 | 메모리 부족으로 배치 크기 축소 | 배치 확대 → 처리량 향상 |
| 추론 비용 | GPU 메모리·전력 소비 증가 | 하드웨어 비용 절감 |
2. 압축 기법 분류
활성값 압축 기법은 크게 네 가지 범주로 분류할 수 있습니다.
그림 1. 활성값 압축 기법 분류 체계
2.1 스무딩 (Smoothing)
활성값의 아웃라이어를 가중치로 옮겨 분포를 평탄화하는 방법입니다. 대표적인 기법은 SmoothQuant입니다.
주요 특징:
- 가중치와 활성값 사이에 양자화 난이도를 이전
- 수학적으로 동등한 변환으로 정확도 유지
- 하드웨어 효율적 (per-tensor 양자화 가능)
- 추가 학습 없이(post-training) 적용 가능
2.2 가중치 기반 양자화 (Weight-Aware)
활성값 분포를 참고해 가중치의 중요 채널을 보호하는 방법입니다. AWQ가 대표적입니다.
주요 특징:
- 활성값 분포로 중요 가중치 식별
- 중요 채널 스케일링으로 양자화 오차 감소
- 혼합 정밀도 대신 동일 정밀도 유지 (하드웨어 친화적)
- 다양한 모델·도메인에 일반화 가능
2.3 혼합 정밀도 (Mixed Precision)
일반 특성과 아웃라이어를 다른 정밀도로 처리하는 방법입니다. LLM.int8()이 대표적입니다.
주요 특징:
- 아웃라이어(16비트)와 일반값(8비트) 분리 처리
- 99.9% 이상의 값을 8비트로 처리
- 정확도 완벽 유지
- 대규모 모델(175B+)에 효과적
2.4 활성값 기반 양자화 (Activation-Aware)
활성값의 민감도를 분석해 레이어별로 차등 적용하는 방법입니다.
주요 특징:
- 레이어별 활성값 분포 분석
- 민감한 레이어는 고정밀, 덜 민감한 레이어는 저비트
- 그래디언트 기반 중요도 분석
- 최신 연구에서 활발한 영역
2.5 직접 압축과 활성값 인식 기법의 경계
SmoothQuant와 LLM.int8()은 활성값 자체를 INT8 경로에 태우거나, 아웃라이어 차원을 분리해 활성값 경로를 직접 바꾸는 대표적인 활성값 압축 기법입니다. 반면 AWQ는 활성값을 직접 저비트로 저장하지는 않고, 활성값 분포를 이용해 중요한 가중치 채널을 보호하는 weight-only 양자화 기법입니다.
이 차이는 시스템 통합에서 중요합니다. 활성값 직접 압축은 HBM 대역폭과 중간 버퍼 크기를 바로 줄이는 데 유리하고, AWQ 같은 activation-aware weight-only 기법은 활성값을 FP16/BF16로 유지하면서도 전체 추론 메모리 예산을 낮춰 더 큰 배치나 더 큰 모델을 같은 장비에서 다루게 해 줍니다.
3. 주요 기법 상세
3.1 SmoothQuant — W8A8 양자화 (ICML 2023)
활성값의 아웃라이어를 가중치로 옮겨 W8A8(8비트 가중치, 8비트 활성값) 양자화를 가능하게 하는 기법입니다.
그림 2. SmoothQuant 변환: 활성값 아웃라이어를 가중치로 이전
핵심 아이디어:
- 가중치는 양자화하기 쉽고, 활성값은 어렵다
- 따라서 활성값의 양자화 난이도를 가중치로 옮긴다
- 수학적으로 동등한 변환: Y = XW = (X diag(s)^-1) · (diag(s) W)
동작 원리:
1. 학습 데이터로 활성값의 채널별 최대값 측정
2. 스케일 팩터 s 계산: s_j = max(|X_j|)^α / max(|W_j|)^(1-α)
3. 활성값을 X / s로 스케일링, 가중치를 s * W로 스케일링
4. 스케일링된 활성값과 가중치를 INT8로 양자화
성과:
- OPT, BLOOM, GLM, MT-NLG, Llama-1/2, Falcon, Mistral, Mixtral 모델에서 W8A8 달성
- 최대 1.56배 속도 향상, 2배 메모리 절감
- 530B 모델을 단일 노드에서 서빙 가능
3.2 AWQ — 활성값 인식 가중치 양자화 (MLSys 2024 최우수 논문)
활성값 분포를 참고해 중요 가중치 채널을 보호하는 저비트 양자화 기법입니다.
핵심 발견:
- 모든 가중치가 동일하게 중요하지 않다
- 1%의 중요 가중치 채널만 보호해도 양자화 오차를 크게 줄일 수 있다
- 중요 채널은 가중치 분포가 아니라 활성값 분포로 식별해야 한다
동작 원리:
1. 학습 데이터로 채널별 활성값 최대값 측정
2. 중요 채널(높은 활성값) 식별
3. 중요 채널의 가중치를 스케일링해 양자화 오차 감소
4. 스케일링은 수학적으로 동등한 변환
장점:
- 혼합 정밀도 대신 동일 정밀도 유지 (하드웨어 효율)
- 역전파·재구성 불필요 (일반화 우수)
- 코드·수학·멀티모달 모델에 효과적
- TinyChat 프레임워크로 모바일 GPU에서 70B 모델 서빙 가능
3.3 LLM.int8() — 8비트 행렬 곱셈 (NeurIPS 2022)
대규모 트랜스포머에서 8비트 행렬 곱셈을 수행하는 기법입니다. 아웃라이어를 16비트로 분리해 정확도를 유지합니다.
핵심 관찰:
- 6.7B 이상의 모델에서 "출현 특성(emergent features)"이 나타남
- 이 특성은 어텐션과 예측 성능을 지배하는 아웃라이어임
- 아웃라이어를 무시하면 성능이 크게 저하됨
동작 원리:
1. 벡터 단위 양자화: 행렬 곱셈의 각 내적에 대해 별도의 정규화 상수 적용
2. 혼합 정밀도 분리: 아웃라이어 특성 차원을 16비트 행렬 곱셈으로 분리
3. 99.9% 이상의 값을 8비트로 처리: 아웃라이어는 16비트로만 처리
성과:
- 175B 모델에서 성능 저하 없이 8비트 추론 가능
- 메모리 50% 절감 (16/32비트 → 8비트)
- OPT-175B/BLOOM을 소비자 GPU 서버에서 사용 가능
3.4 ZeroQuant — 효율적 8비트 양자화
ZeroQuant는 가중치와 활성값을 모두 하드웨어 친화적인 세분화 단위로 양자화하고, 양자화/역양자화 오버헤드를 줄이는 시스템 최적화를 함께 제공하는 기법입니다.
특징:
- per-tensor 양자화로 하드웨어 효율 극대화
- 커널 융합으로 양자화 오버헤드 최소화
- FP16 대비 2배 메모리 절감, 1.5배 속도 향상
3.5 SpQR — 희소-양자화 표현
SpQR은 아웃라이어 가중치를 높은 정밀도로 분리하고 나머지를 3~4비트로 저장하는 sparse-quantized 표현입니다. 주된 초점은 가중치 압축이지만, 활성값 압축과 결합할 때 메모리 절감 폭을 더 키울 수 있어 함께 비교할 가치가 있습니다.
특징:
- 아웃라이어를 희소 행렬로, 나머지를 양자화
- 가중치와 활성값에 모두 적용 가능
- 메모리 절감과 정확도의 균형
4. 비교 분석
기법별 비교표
| 기법 | 유형 | 정밀도 | 메모리 절감 | 정확도 | 튜닝 필요 | 주요 논문 |
|---|---|---|---|---|---|---|
| SmoothQuant | 스무딩 | W8A8 | ~2배 | 거의 무손실 | 불필요 | ICML 2023 |
| AWQ | 가중치 기반 | W4A16 | ~4배 | 거의 무손실 | 불필요 | MLSys 2024 |
| LLM.int8() | 혼합 정밀도 | W8A8 | ~2배 | 무손실 | 불필요 | NeurIPS 2022 |
| ZeroQuant | 효율적 8비트 | W8A8 | ~2배 | 거의 무손실 | 불필요 | arXiv 2022 |
| SpQR | 희소-양자화 | 가변 | 가변 | 양호 | 보정 필요 | arXiv 2023 |
아웃라이어 처리 전략 비교
| 전략 | 접근 방식 | 장점 | 단점 |
|---|---|---|---|
| 스무딩 (SmoothQuant) | 아웃라이어를 가중치로 이전 | 하드웨어 효율, 단순 | 스케일 팩터 튜닝 필요 |
| 혼합 정밀도 (LLM.int8) | 아웃라이어를 16비트로 분리 | 정확도 완벽 | 혼합 정밀도 오버헤드 |
| 중요 채널 보호 (AWQ) | 중요 가중치 스케일링 | 일반화 우수 | 활성값 프로파일링 필요 |
5. 동작 원리
5.1 SmoothQuant 파이프라인
그림 3. SmoothQuant 파이프라인: 프로파일링 → 스케일링 → 양자화 → 추론
처리 흐름:
1. 학습 데이터를 모델에 통과시켜 활성값 분포 프로파일링
2. 채널별 스케일 팩터 s 계산
3. 활성값을 X / s로 스케일링
4. 가중치를 s * W로 스케일링
5. 스케일링된 활성값과 가중치를 INT8로 양자화
6. 추론 시 INT8 행렬 곱셈 수행
스케일 팩터 계산:
s_j = max(|X_j|)^α / max(|W_j|)^(1-α)
α: 균형 파라미터 (보통 0.5)α가 클수록 활성값 쪽으로 더 많은 난이도 이전
5.2 AWQ 동작 원리
그림 4. AWQ: 활성값 분포로 중요 가중치 채널 식별 및 보호
핵심 단계:
1. 활성값 프로파일링: 학습 데이터의 채널별 활성값 최대값 측정
2. 중요 채널 식별: 높은 활성값을 가지는 채널 = 중요 채널
3. 스케일링: 중요 채널의 가중치를 스케일링해 양자화 오차 감소
4. 양자화: 스케일링된 가중치를 4비트로 양자화
중요도 기반 보호:
- 중요 채널(상위 1%)은 스케일링으로 보호
- 나머지 채널은 일반적으로 양자화
- 하드웨어 효율 유지 (혼합 정밀도 불필요)
5.3 LLM.int8() 분리 처리
그림 5. LLM.int8(): 아웃라이어를 16비트로 분리하고 나머지를 8비트로 처리
처리 흐름:
1. 입력 활성값에서 아웃라이어 차원 식별
2. 아웃라이어 차원을 16비트 행렬로 분리
3. 나머지 99.9%의 값을 8비트로 양자화
4. 병렬로 16비트·8비트 행렬 곱셈 수행
5. 결과를 합산
6. 시스템 통합
6.1 프레임워크 지원 현황
| 프레임워크 | 지원 압축 | 설정 방법 |
|---|---|---|
| vLLM | SmoothQuant, AWQ | quantization="awq" |
| TensorRT-LLM | SmoothQuant, ZeroQuant | 빌드 타임 설정 |
| bitsandbytes | LLM.int8() | load_in_8bit=True |
| AutoGPTQ | AWQ, GPTQ | 보정 데이터 필요 |
| TinyChat | AWQ 4비트 | 모바일/엣지 배포 |
6.2 다른 기법과의 결합
가중치 양자화와 결합: W4A16(AWQ) + W8A8(SmoothQuant)를 레이어별로 결합 가능
KV Cache 압축과 결합: 활성값과 KV Cache를 동시에 압축해 메모리 절감 극대화
FlashAttention과 결합: 저비트 활성값을 FlashAttention 커널에서 직접 처리
모델 병렬화와 결합: 텐서 병렬화 시 활성값 통신량 감소
6.3 구현 시 고려사항
- 프로파일링 데이터: SmoothQuant, AWQ는 보정 데이터 품질과 활성값 범위 대표성에 민감
- 커널 융합: 양자화·역양자화 오버헤드를 줄이려면 fused kernel 필수
- 레이어별 민감도: 모든 레이어가 동일하게 양자화에 강하지 않음
- 모델 구조 의존: GQA/MQA, RoPE 등 새로운 구조에서의 호환성 확인 필요
- prefill/decode 차이: 긴 컨텍스트 prefill과 토큰 단위 decode는 활성값 분포가 달라 같은 스케일 정책이 항상 최적은 아님
7. 장단점
장점
- 메모리 절감 효과가 직접적: W8A8은 2배, W4A16은 4배 이상의 메모리 절감이 가능해 긴 문맥·큰 배치를 같은 GPU에 담을 수 있습니다.
- 추론 속도 향상: 저비트 연산은 하드웨어 가속(텐서 코어)과 결합해 실제 속도 향상으로 이어집니다.
- 가중치 압축과 시너지: 활성값 압축은 가중치 양자화와 결합하면 효과가 배가됩니다.
- 정확도 유지: SmoothQuant, AWQ, LLM.int8()은 거의 무손실 수준의 정확도를 유지합니다.
- 범용성: 최신 모델(Llama, Mistral, Falcon 등)에 광범위하게 적용 가능합니다.
단점
- 프로파일링 비용: SmoothQuant, AWQ는 보정 데이터와 프로파일링에 추가 비용이 발생합니다.
- 구현 복잡도: fused kernel, 혼합 정밀도 처리, 하드웨어별 최적화가 필요합니다.
- 레이어별 차이: 모든 레이어가 동일하게 양자화에 강하지 않아, 민감한 레이어에서 정확도 저하가 발생할 수 있습니다.
- 새로운 구조 호환: GQA, MQA, RoPE 등 최신 구조에서의 검증이 부족할 수 있습니다.
- 하드웨어 의존: 8비트/4비트 연산 가속은 특정 하드웨어(NVIDIA Tensor Core 등)에 의존합니다.
8. 핵심 정리
활성값 압축은 스무딩, 가중치 기반 양자화, 혼합 정밀도, 활성값 기반 양자화의 네 범주로 나뉩니다. SmoothQuant는 아웃라이어를 가중치로 옮겨 W8A8을 달성하는 가장 실용적인 기법이며, AWQ는 중요 가중치 채널을 보호해 4비트에서도 거의 무손실을 달성합니다. LLM.int8()은 대규모 모델에서 아웃라이어를 16비트로 분리해 정확도를 완벽히 유지합니다. 이 기법들은 모두 가중치 양자화와 직교적이며, 결합하면 메모리·속도·정확도의 균형을 최적화할 수 있습니다. 최신 연구는 레이어별 차등 적용과 혼합 전략으로 극저비트에서도 정확도를 유지하는 방향으로 발전하고 있습니다.
9. 관련 기술
| 문서/연구 | 연결점 |
|---|---|
| LLM Quantization Analysis | 양자화 기법 전반 (GPTQ, AWQ, GGUF) |
| KV Cache Compression Analysis | KV Cache 양자화와의 결합 |
| FlashAttention Analysis | 저비트 활성값과의 결합 |
| PagedAttention Analysis | 메모리 관리와의 통합 |
| Continuous Batching Analysis | 배치 처리와 메모리 관리 |
| LLM Inference Scheduler Analysis | 추론 스케줄링과의 통합 |
| SmoothQuant (arXiv 2211.10438) | W8A8 양자화, 활성값 스무딩 |
| AWQ (arXiv 2306.00978) | 활성값 인식 가중치 양자화 |
| LLM.int8() (arXiv 2208.07339) | 8비트 행렬 곱셈, 아웃라이어 분리 |
| ZeroQuant (arXiv 2206.01861) | 가중치·활성값 INT8 양자화와 시스템 최적화 |
| SpQR (arXiv 2306.03078) | sparse-quantized 가중치 표현 |