CoreML 모델의 크기를 줄이는 양자화로 모델의 정확도는 어떻게 바뀌는가?

모바일에 싣는다면, 모델의 사이즈는 작은 편이 좋다고 생각한다.
양자화란, 가중 파라미터를, 예를 들면 Float_32로부터 Float_16으로 해 빠른 자리로 반올림하도록 하는 것.

실제 모델을 양자화하여 얼마나 크기가 작아지는지, 정밀도는 어떻게 바뀌는지를 살펴보았다.


deeplabv3의 xeption 백본 버전에서 시맨틱 세그멘테이션을 비교(배경 흐림).

xeption 백본의 deeplabv3의 mlmodel의 사이즈는 165.1MB.
MobileNet 백본이라면 Model이 8.6MB이므로, xeption 쪽이 정밀도는 훨씬 좋다고는 해도, 과연도 조금 작고 싶은 곳.

CoreMLModel의 양자화 방법


from coremltools.models.neural_network import quantization_utils

# 可能な値はnbits = 16, 8, 7, 6, ...., 1
nbits = 16
quantized_model = quantization_utils.quantize_weights(model, nbits)
coremltools.utils.save_spec(quantized_model, 'quantizedDeepLab.mlmodel')
# Tips: 量子化したmlmodelは、なぜか.save(Path)メソッドが使えないので、coremltools.utils.save_specで保存します。

결과




모델
크기(MB)
속도(s)
사용 메모리(MB)


Float32
165.1
315
477

Float16
82.6
2.72
477

Float8
41.8
2.77
477


모델의 크기는 훌륭하게 절반이되었습니다.
그러나 실행 속도와 사용 메모리는 변하지 않았다.

그런데, 세그멘테이션의 정밀도는 하면...

왼쪽에서 [오리지널] [Float32] [Float16] [0] [Float8]
          165MB  82MB   40MB


이해해 주셨습니까?
32 및 16에서는 거의 전혀 세그먼트 정밀도가 변하지 않는다.
「8이라고 과연 잡이가 되겠지요」라고 생각했고, 그 뒤에는 찢어져, 이것도 거의 변하지 않는다.
잘 보면 우하의 꽃을 흐림이 조금 침식하고 있지만, 이 정도라면 충분히 32와 같이 사용할 수 있다.

번들하는 모델의 사이즈를 작게 하고 싶다면, 양자화는 유효한 옵션이 된다고 생각한다.
다른 과제에서 어떻게 달라지는지는 시도하지 않지만.
* 이번에는 Linear라는 디폴트 양자화 방법을 사용했다. Coremltools의 인수로 다른 종류도 선택할 수 있는 것 같다.

🐣

일 상담 여기까지
로쿠키 시코쿠 @ g 마이 l. 이 m

Core ML을 사용하여 앱을 만들고 있습니다.
기계 학습 관련 정보를 발신하고 있습니다.

트위터
Medium

좋은 웹페이지 즐겨찾기