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

모델 압축·배포 최적화 시리즈 3편: Pruning (가중치 가지치기)

Leeys 2025. 9. 14. 22:46

"신경망에서 정말 모든 weight가 필요할까?"
Pruning은 중요도가 낮은 weight, 뉴런, 채널을 제거해 모델을 가볍게 만드는 기법입니다.


Pruning

 

Pruning이란?

Pruning(가지치기)은 신경망의 불필요한 파라미터를 제거하여 모델 크기를 줄이고 추론 속도를 높이는 방법입니다.

  • 학습이 끝난 모델의 weight 중요도를 측정
  • 중요도가 낮은 weight → 0으로 만들거나 제거
  • 모델 sparsity 증가 → 연산량 감소

왜 중요한가?

  • 모델 크기 줄이기 (저장 공간, 메모리 사용량 절약)
  • 추론 속도 향상 (특히 하드웨어가 sparsity 가속 지원 시)
  • Overfitting 감소 → 일반화 성능이 더 좋아질 수도 있음

Pruning의 종류

Unstructured Pruning 개별 weight 중요도 기준으로 0으로 만듦 (sparse matrix) 모델 크기 크게 줄어듦 sparsity 지원 없는 HW에서는 속도 향상 제한
Structured Pruning 채널/필터/헤드 단위로 제거 속도 향상 확실 모델 아키텍처 자체가 변경, 성능 영향 클 수 있음
Iterative Pruning 여러 단계로 조금씩 Pruning → Fine-tuning 반복 성능 보존 학습 시간 증가
One-shot Pruning 한 번에 가지치기 후 fine-tuning 빠름 성능 급격히 떨어질 수 있음

중요도 측정 기준

  • Magnitude (L1/L2 Norm): weight 크기 작은 것부터 제거 (가장 흔한 방식)
  • Gradient-based: loss 변화에 민감하지 않은 weight 제거
  • Fisher Information / Hessian: 중요도 정량화 후 제거

장점

1. 모델 크기 줄이기 (압축 효과)
2. 연산량 감소 → latency 단축
3. Overfitting 감소 → regularization 효과
4. 다른 압축 기법과 조합 가능 (Quantization + KD + Pruning)


단점 & 주의점

지나치게 Pruning 시 성능 급락
Unstructured sparsity는 하드웨어 가속 없으면 속도 향상 거의 없음
Structured pruning은 모델 capacity 줄어들어 fine-tuning 필요


PyTorch 예시 (Unstructured Pruning)

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)

실제 효과 (예시)

ResNet-50 50% (unstructured) 25.6M → 12.8M -0.5%
ResNet-50 80% (unstructured) 25.6M → 5.1M -3.0%
BERT-base 40% (structured, head pruning) latency 20% ↓ -1.5%

적절한 비율을 찾는 것이 핵심 → 보통 30~50% 수준이 sweet spot


실무 적용 팁

  • 먼저 unstructured pruning으로 sparsity vs accuracy curve 확인
  • 최적 sparsity 찾은 후 structured pruning으로 변환 (속도 향상)
  • pruning 후 반드시 fine-tuning 수행 (성능 회복)
  • Quantization과 함께 쓰면 추가 압축 가능

결론

Pruning은 모델의 불필요한 연결을 줄여 가볍고 빠르게 만드는 핵심 기법입니다.
적절히 적용하면 성능 저하 없이 모델 크기와 latency를 줄일 수 있습니다.
단, 하드웨어 가속이 있는 환경(예: NVIDIA Ampere, TensorRT Sparse 지원)에서 효과가 극대화됩니다.

 

 

 

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

https://machineindeep.tistory.com/70

 

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

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

machineindeep.tistory.com