EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks

1 minute read

https://arxiv.org/abs/1905.11946

ICML 2019에 나온 구글 논문. 먼저 눈이 갔던 것은 논문에서 제안하고 있는 EfficientNet의 성능 대비 엄청나게 낮은 파라미터 수와 Flops. 1

2

기존 Resnet 등보다 파라미터 수는 월등히 낮으면서도 성능은 오히려 좋다.

역시 갓구글이라고 회사 동료와 함께 외쳤다. 하지만…

공개된 https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet 코드를 이용해서 바로 속도 테스트를 해봤다. 이 코드는 TPU용이라 Multi-GPU에서는 동작하지 않으므로 코드는 조금 수정했다. 그 결과,

  • gpu: p40 1gpu
  • model: efficientnet-b4
  • batch_size: 32 (64 이상에선 OOM 발생. 이때부터 좀 불안.)
  • global step per sec: 약 0.47 (batch_size 128 기준으론 0.1175)

resnet50(+trick)에서 batch_size=128로 global step/sec 이 1.0 정도 나왔으니 9배 정도 느리네?? Flops와 실제 학습 시간이 비례하지 않음은 꽤 겪어오긴 했다. 하지만 Flops가 이정도로 낮은데, 학습 속도가 더 느려지는건 무슨 일인가.

https://cloud.google.com/tpu/docs/tutorials 에 적혀있는 training 시간으로 유추해봤을 때, TPU에서도 학습 시간이 efficientnet-b4가 resnet50 대비 최소 3배, 최대 7배 정도 느린게 맞는 것 같다. cpu infenrence 시간 기준으로 보면 3배 정도 느린 것 같고.

아. 이게 뭐람.

실제 환경에서의 EfficientNet 속도와 무관하게, Model Scaling 관점에선(논문 제목도 Rethinking Model Scaling…) 다음 결과가 보편적으로 유의미한듯. 3

4

baseline은 efficientnet-b0.

Network의 scale 요소인 width, depth, resolution 중 하나만 scale-up했을 땐 80% 정도에서 빠르게 saturate되는데, scale 요소를 복합적으로 up시키면 더 좋은 성능이 나온다는 것. 그 최적 지점을 기계가 잘 찾을 수 있도록 compound scaling method를 정의해서 사용.

Categories: ,

Updated:

Comments