Skip to content

p4-mod-p4-opt-4-estoy_a_dieta created by GitHub Classroom

Notifications You must be signed in to change notification settings

HyeonJin-A/Model-Compression-boostcampP4

 
 

Repository files navigation

Index

  1. 대회 개요
  2. 대회 전략 및 결과
  3. 대회 진행 23일
  4. 실험 내용
  5. Test Demo


1. 대회 개요

Image Classification. 이미지를 9개의 재활용 품목 카테고리로 분류하는 문제
Model 경량화. 어느 정도의 성능을 유지하며 크기가 작은 모델을 만드는 문제 image

Metric (평가 지표)

image

  • MACs(Multiply-accumulate operations)
    • 합,곱연산의횟수
    • MACs -> 약 0.5FLOPs

2. 대회 전략 및 결과

image Public 2nd, Private 2nd

Top-down, Bottom-up, Additional 3가지 방향으로 분업 전략을 세웠습니다.
맡은 분야가 같은 팀원 간에는 협업하여 실험을 진행했습니다.
대회 초반부터 이러한 전략을 효과적으로 설정하였기에 다른 팀들보다 다양한 실험을 진행할 수 있었고, 10팀 중 2등의 성과를 내었습니다.


3. 대회 진행 23일

Day LB Score, F1, MACs 실험 내용 실험 내용 실험 내용
01 baseline 코드 작성 MACs 공부 EDA
02 0.0385 / 0.8205 / 266505 pretrained Model 탐색 MACs 공부 LB score 기준 모델 구하기
03 LB 전체 초기화 pretrained Model 탐색 MACs 계산 허점 발견 팀원들과 전략 논의
04 pretrained Model 탐색 3가지 분업 전략 설정
05 0.4858 / 0.5320 / 1688940 pretrained Model 탐색 Input size 탐색 Inference 분포 확인
06 0.4501 / 0.5619 / 1688940 pretrained Model 탐색 LossFunction 탐색 Regularization 기법 적용
07 " pretrained Model 탐색 LossFunction 탐색 Regularization 기법 적용
08 0.4192 / 0.5877 / 1688940 Augmentation Over Sampling Auto Encoder
09 0.4044 / 0.6001 / 1688940 Augmentation (AutoML) Hyper Parameter 탐색 Auto Encoder
10 0.3782 / 0.6220 / 1688940 Knowledge Distillation (AutoML) Hyper Parameter 탐색
11 0.3665 / 0.6318 / 1688940 Knowledge Distillation ArcFace 실험
12 0.3584 / 0.6386 / 1688940 Knowledge Distillation Residual KD
13 0.3513 / 0.6211 / 1299789 Layer Pruning Feature 분포 확인
14 0.3493 / 0.6358 / 1515459 Layer Pruning
15 0.3486 / 0.6318 / 1439700 Layer Pruning Validation 방법 개선 Train All Data
16 0.3476 / 0.6225 / 1272450 Layer Pruning Auxiliary Training 실험
17 0.3362 / 0.6207 / 1083210 Layer Pruning Channel Pruning
18 0.3366 / 0.6158 / 1007460 Channel Pruning Decomposition
19 " Channel Pruning Decomposition
20 " Channel Pruning Decomposition
21 0.3362 / 0.6207 / 1083210 실험 결과 종합 최종 모델 선정
22 " 회고 및 팀원들과 피드백 발표 준비
23 " 발표 준비

4. 실험 내용

Pretrained Model Search

image SOTA, 논문, 라이브러리 등을 참고하여 가벼워 보이는 모델들을 여러가지 구글링 해봤는데, pretrained weight가 존재하는 모델 중에서는 ShuffleNet이 MAC대비 F1 스코어가 가장 좋았습니다.
선택한 ShuffleNet은 스템을 제외하면 stage 3개로, 각 4-8-4개의 유닛 구조로 되어있습니다.

Feature Distribution

Stage1
image
Stage2
image
Stage3
image
ShuffleNet에 경량화 기법을 적용하기 위해 Weight 분포를 확인해본 결과입니다.
std(표준편차)값이 클수록 0이 아닌 weight 값이 많이 분포되어 있으므로, std가 낮은 레이어부터 제거하였습니다.

Model Compression

image

  • MACs를 직접적으로 감소시키기 위해 Input size를 80x80으로 매우 낮게 설정 하였습니다.

  • Input size 축소로 인해 추출할 feature 수가 줄어 들었다고 판단하여 Network 사이즈를 축소 하였습니다.

  • Metric 함수 특성을 고려하여 모델을 직접 잘라내는 structured pruning (layer, channel) 및 weight decomposition를 시도 하였습니다.
    레이어 조정 후 Knowledge Distillation을 통해 성능 복원에 성공하면 유지, 실패할 경우 이전 단계로 돌아가 다른 레이어를 조정하였습니다.
    image

  • layer pruning : [4-8-4] -> [2-5-2]

  • channel pruning : stage3 [120, 240] -> [120, 210]

  • decomposition : stage3 conv group3 -> group6


Knowledge Distillation 실험

image
실험 결과 다음과 같은 결론을 내렸습니다.

  • 비슷한 분포를 가지는 모델을 teacher로 사용하는 것이 매우 효과적
  • 분포가 조금 달라져도, teacher를 Ensemble하는 방법은 효과적


5. Test Demo

MACs F1 Competition Score
Before 1688940.0 0.6206 0.4005
After 1083210.0 0.6149 0.3431
#Before
python test_demo.py --customized_model False --eval True

#After
python test_demo.py --customized_model True --eval True

Envrionment

pytorch '1.7.1+cu101'
albumentations
sklearn
ptflops

Directory

Model Compression/
├──input/
|  └── data/
|      ├── train/
|          ├── trainImg00001.jpg
|          ├── ...
|          └── trainImg22640.jpg
|      └── val/
|          ├── valImg0001.jpg
|          ├── ...
|          └── valImg8816.jpg
├──pretrained/
│  ├── ShuffleNet_final.pt
│  └── shufflenet_g3_wd4.pth
├──solution/
|  ├── dataloader.py
|  ├── ...
|  └── utils.py
└──test_demo.py

About

p4-mod-p4-opt-4-estoy_a_dieta created by GitHub Classroom

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%