ML | DL/딥러닝 방법론|실습

모델 압축·배포 최적화 시리즈 4편: Weight Clustering / Sharing

Leeys 2025. 9. 14. 22:49
반응형

"비슷한 값의 가중치를 굳이 따로 저장할 필요가 있을까?"
Weight Clustering(또는 Sharing)은 유사한 가중치를 묶어 모델을 추가로 압축하는 기법입니다.


Weight Clustering / Sharing

 

Weight Clustering / Sharing이란?

Weight Clustering은 비슷한 값을 가지는 weight들을 같은 그룹(cluster) 으로 묶고,
각 그룹의 대표값(centroid) 만 저장하는 방식입니다.

이때 모델의 실제 weight는 “클러스터 인덱스”로 참조되며,
추론 시 centroid lookup으로 실제 weight 값으로 변환됩니다.


왜 필요한가?

  • 대부분의 weight 값은 특정 분포(가우시안 등)에 집중되어 있음
  • 비슷한 값이 많기 때문에 중복 저장은 메모리 낭비
  • Clustering으로 weight 표현을 더 압축 → 모델 크기 추가 감소

동작 원리

  1. 학습이 끝난 모델에서 weight 추출
  2. K-means 같은 알고리즘으로 weight들을 K개의 클러스터로 묶음
  3. weight 값을 해당 클러스터 centroid 값으로 치환
  4. 모델 저장 시 weight 대신 centroid + index만 저장

장점

1. 추가 압축 가능 → Pruning/Quantization 후 더 줄일 수 있음
2. 모델 저장 용량 최소화
3. 비트 수 절감 → weight 표현을 log₂(K) 비트로 압축 가능


단점 & 고려 사항

너무 aggressive한 clustering은 정확도 하락
K 선택 중요 (K 작을수록 압축률↑, 성능↓)

추론 시 lookup 오버헤드 발생 가능 (하지만 대부분 무시 가능한 수준)


Pytorch 예시 (Weight Clustering API)

import torch
import torch.nn.utils.prune as prune

model = get_pretrained_model()

# Conv layer weight 중 30%를 L1 기준으로 pruning
prune.l1_unstructured(model.conv1, name="weight", amount=0.3)

# 실제 weight 값 확인 (많은 값이 0으로 됨)
print(model.conv1.weight)
 

실제 효과 (논문/실험)

모델적용 적용 전 적용 후 압축률 정확도 변화
LeNet-300-100 1.7 MB 0.25 MB 6.8× -0.3%
MobileNetV2 14 MB 3 MB 4.6× -1.0%

Pruning + Clustering을 함께 사용하면 압축률이 10~20× 까지 가능.


실무 적용 팁

  • 먼저 Pruning/Quantization으로 sparsity 확보 → Clustering으로 마무리 압축
  • K값 조절 → 8~32 클러스터로 시작해서 성능-압축률 트레이드오프 실험
  • 압축 후 반드시 Fine-tuning 수행 → 정확도 회복

결론

Weight Clustering / Sharing은 모델 최종 압축 단계에서 매우 유용한 기법입니다.
특히 Pruning, Quantization 이후 적용하면 모델 용량을 극단적으로 줄일 수 있으며,
엣지 디바이스 배포나 메모리 제한이 심한 환경에서 큰 효과를 발휘합니다.

 

 

 

다음 편은 아래에 있습니다!

https://machineindeep.tistory.com/71

 

모델 압축·배포 최적화 시리즈 5편: ONNX / TensorRT / TFLite 변환

"모델을 한 번만 학습하고, 모든 디바이스에서 돌리고 싶다!"ONNX, TensorRT, TFLite는 모델을 효율적으로 배포하기 위한 핵심 툴입니다.모델 배포의 문제점학습은 보통 PyTorch / TensorFlow에서 하지만배

machineindeep.tistory.com

 

반응형