새소식

Machine Learning

모델 경량화

  • -

연산 최적화와 달리 모델 경량화는 학습 과정에서 이루어진다.

모델을 경량화하여 학습시킬 경우, GPU resource, 메모리 등의 측면에서 이점이 있기 때문에 최근 많이 연구되고 있다.

모델 경량화에는 크게 세가지 방법이 있다.

 

 

  1. Pruning (가지치기)
    • 신경망 학습에서 중요도가 떨어지는 node를 제거하고 재학습하는 과정을 반복하여 모델의 크기를 줄여나가는 방식
    • 이 방식을 통해, Deep Compression (2015) 논문에서는 VGG-16 model을 약 49배 경량화 하였으며, Clip-q (2018)에서는 ResNet-50 model을 약 15배 경량화하였다고 한다.
  2. Knowledge Distillation (지식 증류)
    • 학습이 잘된 큰 딥러닝 모델(Teacher model)의 지식을 학습되지 않은 작은 크기의 모델(student model)에게 가르쳐줄 수 있지 않을까? 에서 시작한 방법론
  3. Quantization (양자화)
    • 모델의 해상도를 낮춰 작게 만드는 방법
    • 파라미터의 Precision을 적절히 줄여서 연산 효율성을 높임

 

Pytorch Pruning 이후 재학습하여 ONNX로 변환하여 양자화 

  1. PyTorch에서 Pruning 적용: 모델의 특정 레이어에 pruning을 적용하고, 중요한 가중치만 남겨두는 방식으로 수행
  2. Pruning 후 재학습 (Fine-tuning): Pruning 후 모델의 성능을 회복시키기 위해 재학습을 진행
  3. ONNX로 변환: Pruning이 적용된 모델을 ONNX 형식으로 변환
  4. Quantization(양자화): ONNX 모델을 NPU 제조사 SDK를 이용하여 INT8 양자화 모델로 변환

Pruning 적용 예제 (PyTorch)

import torch
import torch.nn.utils.prune as prune
import torch.nn.functional as F
import torchvision.models as models

# 모델 불러오기
model = models.resnet18(pretrained=True)

# 프루닝 적용 예시 (conv1 레이어에 50% 프루닝 적용)
prune.l1_unstructured(model.conv1, name='weight', amount=0.5)

# 프루닝 적용 후의 모델 가중치
print(list(model.named_parameters()))

# 프루닝 후 fine-tuning을 위해 재학습
# 예제이므로 데이터로더와 학습 루프는 생략
for epoch in range(10):  # 예제 학습 루프
    for inputs, targets in train_loader:
        outputs = model(inputs)
        loss = F.cross_entropy(outputs, targets)
        loss.backward()
        optimizer.step()

 

 

 

 

 

 

 

 

 

참고 

 

https://velog.io/@khjgmdwns/%EB%AA%A8%EB%8D%B8-%EA%B2%BD%EB%9F%89%ED%99%94%EB%A5%BC-%EC%9C%84%ED%95%9C-Pruning-%EC%A0%81%EC%9A%A9-%EB%B0%A9%EB%B2%95from-GPT4o

 

모델 경량화를 위한 Pruning 적용 방법(from GPT4o)

NPU 제조사에서 pruning을 지원하지 않는 경우, 다음과 같은 방법을 통해 Pruning을 적용할 수 있습니다:PyTorch에는 다양한 pruning 기법을 지원하는 torch.nn.utils.prune 모듈이 있습니다. 이를 통해 네트워

velog.io

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.