[Github] https://github.com/apple/ml-mobileone
이번에 포스팅한 논문은 CVPR 2023에 투고된 모바일 환경에 최적화된 모델을 소개하는 "MobileOne: An Improved One millisecond Mobile Backbone" 입니다. Apple에서 투고한 논문이네요 :)
1. Introduction
모바일 환경을 위한 딥러닝 모델은 대부분 floating-point operations (FLOPs)를 감소 시키거나 파라미터수를 줄여 정확도를 개선하는 방향으로 발전해왔습니다. 하지만 이러한 방법들이 모델의 latency(inference speed) 측면에서 항상 의미있는 영향을 주는 것은 아니라고 합니다. 그 이유는 다음과 같습니다.
* FLOPs : 효율성과 관련된 metric인 FLOPs는 메모리에 접근하는 비용과 병렬처리 정도를 고려하지 않기 때문에 두 가지를 모두 고려한다면 FLOPs가 낮아도 latency가 증가할 수 있습니다.
* 파라미터 수 감소 : 공유 파라미터가 존재한다면 FLOPs는 높아지지만 모델의 크기는 작아지게 됩니다.
skip-connection과 branching은 또한 상당한 메모리 접근 비용이 발생하게 되기 때문에 letency 감소에 효과적이지 않습니다.
따라서, 본 논문에서는 모바일 기기에서 latency 를 증가시키는 bottleneck에 대해 분석하고, 이를 개선하여 모바일 기기에서 inference 속도를 최적화한 MobileOne 모델을 소개합니다.
MobileOne 모델은 이전 연구들처럼 re-parameterization 기법을 사용합니다. 차이점이 있다면, MobileOne은 low parameter와 model scaling이 있다는 점입니다.
본 모델은 아래 그림에서 확인 할 수 있듯이 accuracy와 latency 부분에서 기존의 모델들을 제치고 SOTA를 달성했습니다.
2. Method
2.1 Metric Correlations
모델들의 사이즈를 비교하는 대표적인 지표로는 파라미터 수와 FLOPs가 있습니다. 하지만 이 두 metric 모두 실제 모바일 환경에서 latency와 크게 관계가 없습니다. 따라서, 본 논문에서는 FLOPs와 파라미터 수의 latency와의 상관관계에 대해 연구했습니다. 실험에서 latency는 iPhone12를 이용하여 측정하였습니다. 아래 그림은 여러 모델들의 latency와 FLOPs, latency와 파라미터 수 사이의 관계를 그래프에 나타낸 것입니다.
아래 그래프를 좀 더 분석해보겠습니다. 높은 파라미터 수를 가진 모델이 latency가 낮다는 사실을 확인 할 수 있습니다. 또한 FLOPs와 latency 도 비슷한 경향을 보이고 있네요. MobileNet과 Transformer계열의 모델들은 FLOPs 와 파라미터 수는 비슷하지만 latency는 낮다는 사실도 확인할 수 있습니다.
latency 와 FLOPs, 파라미터 수 사이의 연관성을 좀 더 직관적으로 알아보기 위해 이번에는 spearman rank correlation 을 이용하여 계산하였습니다.
latency와 FLOPs 사이는 모바일 환경에서 약간의 correation 이 존재하지만, 파라미터 수 사이에는 모바일, CPU 모두 적다는 것을 알 수 있습니다.
2.2 Key Bottlenecks
2.2.1 Activation Functions
activation function이 latency 에 미치는 효과를 분석하기 위해 30layer의 CNN네트워크를 설계하고 activation function 에만 변화를 준 후 latency를 측정하였습니다.
비교적 최근에 제안된 SE-ReLu, Dynamic Shift-Max, DynamicReLU(A,B)들은 H/W acceleration에 최적화되지 않았기 때문에 latency가 비교적 높습니다. 반면에, ReLU와 GELU는 낮구요. 따라서, 본 논문에서는 MobileOne모델에 ReLU만 적용한다고 합니다.
2.2.2 Architectural Blocks
runtime performence를 저하시키는 큰 원인 2가지는 바로 memory access cost와 degree of parallelism입니다. branch에서 activation function들이 다음 tensor값을 연산하기 위해 저장해야하는데 branch가 많아질수록 부담이 되기 때문입니다. 이는 모델이 적은 branch를 가지게 함으로써 해결할 수 있습니다.
또한 Squeeze-Excite block의 global pooling과 같은 연산들은 synchronization cost가 많이 들기 때문에 전체 run-time시간에 악영향을 줍니다. 이러한 이유들로 MobileNet에서는 skip connection과 Squeeze-Excite block를 사용하지 않았다고 하네요.아래는 이를 증명하는 latency 측정결과입니다.
2.3 MobileNet Architecture
MobileOne은 앞서 설명한 구조를 포함함과 동시에 re-parameterization이 적용될 수 있는 구조로 설계하여 train과 inference 시에 다른 구조를 가질 수 있도록 했습니다.
2.3.1 MobileOne Block
MobileOne은 RepVGG모델과 유사한 구조를 갖습니다. 먼저 간단하게 RepVGG모델의 구조에 대해서 살펴보겠습니다.
RepVGG는 학습시에는 multi-branch 형태로 모델이 존재하지만, inference 시에는 branch들을 하나로 합쳐 하나의 convolution layer로 합쳐 reparameterization 합니다. reparameterization의 장점은 여러 branch를 하나로 합치기 때문에 memory access시간이 감소한다는 점입니다. (RepVGG의 구조에 대해 좀 더 자세한 설명은 이 블로그를 참조해주세요!)
MobileOne의 reparameterization과 RepVGG의 reparameterization의 차이점은, RepVGG는 standard convolution layer에 적용한 반면, MobileOne은 depthwise(3*3)와 pointwise(1*1) convolution layer block들을 추가해 적용했다는 것입니다. 아래 그림은 MobileOne의 구조도입니다. inference시에 reparameterization을 통해서 모든 branch들이 제거되는 것을 알 수 있습니다.
또한 본 논문에서 over-parameterization(실제 필요한 파라미터 보다 과하게 설정하는 것)도 제안하였습니다. 위 구조에서 over-parameterization factor k가 추가되었는데 이는 conv-BN block를 몇개나 쌓을지에 해당하는 하이퍼 파라미터입니다. 1~5사이의 값으로 설정합니다. 이렇게 여러 개를 쌓아 over-parameterization시킨 후 inference시에 하나의 conv로 fusing 됩니다. 각 block에 activation function이 없기 때문에 linear한 성질이 유지되기 때문에 후에 fusing 하는 것이 가능한 것이죠!(activation function을 사용하는 이유에 대해 생각해보면 이해가 쉬울 것 같습니다!)
본 논문에서 주장하는 reparameterization 과 over-parameterization의 효과를 증명하기 위해 여러 실험을 진행하였습니다.
먼저, loss와 관련된 결과입니다. reparameterization을 적용했을 때가 train, validation loss가 낮을 것을 확인할 수 있습니다. block을 더 많이 쌓을수록 loss가 더 낮은 것도 확인 할 수 있네요.
왼쪽 표는 reparameterization 한 branch를 추가함에 따른 성능 변화입니다. S0, S1, S3는 모델의 scale에 변화를 준 것입니다. 역시 branch를 추가했을 때 세 모델 모두 성능이 더 높은 것을 확인할 수 있습니다.
오른쪽은 block수에 따른 성능의 변화입니다. MobileOne-S0는 4개를 쌓았을 때 가장 성능이 높은 것을 알 수 있습니다. 다만 모델의 scale이 더 큰 MobileOne-S1의 경우에는 block를 많이 쌓아도 유의미한 효과를 얻지는 못했습니다.
2.3.2 Model Scaling
MobileOne은 width scale에 따라 5가지 버전이 제안되었습니다.
그리고 input resolution의 scaling up을 사용하면 모바일 기기에서 FLOPs와 memory access cost 가 커질 수 있기 때문에 사용하지 않는다고 합니다.
inference시에 multi branch가 아니기에, 앞서 설명했듯이 data 저장이나 이동에 별도의 cost가 들지 않습니다. 바로 이점이 MobileNet이나 EfficientNet보다 월등히 좋은 장점이기도 합니다. 그리고 MobileOne-S1이 똑같이 over-parameterization을 적용한 RepVGG-B0모델볻다 3배 가벼운데 성능은 더 좋다고 하네요 :)
2.3.3 Training
일반적으로 MobileOne처럼 작은 모델들은 overfitting을 방지하기 위해 큰모델에 비해 덜 regularization합니다. 학습 시에 초기에 weight decay를 잘 해주는 것이 중요한데, 본 논문에서는 완전히 weight decay regularization을 없애기 보다는 학습 진행 상황에 따라 생기는 loss를 annealing하는 것이 더 효과적이라고 주장합니다. 그래서 MobileOne은 cosine schedule을 적용했고, 그에 따라 weight decay annealing 하였습니다. 이 부분 또한 실험으로 증명했습니다. (EMA는 'Exponential Moving Average' 입니다.)
2.3.4 Benchmarking
본 논문에서는 iPhone12로 latency를 측정하여 실험하고 있습니다. 하지만 일반적으로 네트워크 초기화, 데이터 이동 등과 같은 과정도 포함돼버려 정확안 latency를 측정하는 것은 어렵습니다. 최대한 동일한 환경에서 정확하게 latency를 측정하기 위해 다음과 같은 환경을 구성했다고 합니다.
- startup inconsistencies를 없애기 위해 모델 그래프가 로드되고 입력 텐서를 preallocate 하며 model warmup을 진행합니다.
- benchamarking시에는 다른 모든 어플리케이션은 종료한 채, 동일하게 1000번 실행하여 lowest, hightest latency를 측정합니다.
3. Experiments
먼저 여러 CNN, Transformer 모델과 FLOPs, 파라미터 수, latency를 측정한 결과입니다. imageNet 데이터 셋을 이용했습니다. CPU는 Ubuntu desktop with a 2.3 GHz – Intel Xeon Gold 5118 processor 환경에서, GPU는 NVIDIA TensorRT library (v8.0.1.6) and run on a single RTX-2080Ti GPU with batch size set to 1 환경에서 진행되었습니다.
다음은 MS-COCO 데이터셋을 이용하여 mAP를 측정한 것입니다. (object detection)
다음은 Pascal-VOC와 ADE20k 데이터 셋에서 mIoU를 측정한 결과입니다. (semantic segmentation)
모두 MobileOne이 좋은 성능을 내고 있음을 확인할 수 있습니다 :)