What are the quantization possibilities?
TFLite가 모델 양자화를 위해 제공하는 두 가지 옵션이 있다.
(i) 훈련 후 양자화 (post-training quantization) : 단순히 모델이 훈련된 후 매개변수의 양자화를 수반한다. (ii) 양자화 인식 훈련 (quantization-aware training) : 훈련 시간 동안 모델을 양자화하는 것을 수반한다. 초기 훈련 전에 네트워크 수정이 필요하고 (가짜 양자화 노드 사용) 나중에 변환이 아닌 훈련을 통해 8비트 가중치를 학습한다. 현재로서는 CNN 아키텍처의 하위 집합에 대해서만 사용할 수 있다. |
Post-training quantization
훈련 후 양자화는 네트워크를 수정할 필요가 없으므로 이전에 훈련된 네트워크를 양자화된 모델 (ex : 32비트 FP에서 16비트 FP 또는 8비트 INT로)로 변환할 수 있다. 이 훈련 후 양자화는 (i) 양자화가 수행되지 않는 경우에 따라 세 부분으로 더 나눌 수 있다. 이는 단순히 TensorFlow 모델을 ".tflite" 파일 형식으로 변환하는 것을 의미한다. (ii) 모델의 가중치만 양자화되는 경우에 하이브리드 양자화라고도 하며 (iii) 가중치와 함께 활성화도 양자화되는 경우이다. 이를 완전 양자화라고 합니다. 양자화된 모델의 정확도를 확인하고 저하가 허용 가능한지 확인하기 위해 아래에 언급된 모든 방법에 대해 매우 중요하다.
모바일 또는 edge 장치에서 추론 목적으로 선택한 다양한 하드웨어에 따라 다음과 같이 적용할 수 있는 다양한 종류의 양자화가 있다.
|
다음 그림은 훈련 후 양자화를 다룰 때 고려해야 할 가능성 목록을 보여준다.
양자화 없음 (No quantization)
여기서 훈련된 모델은 전혀 양자화되지 않고, TensorFlow 모델 (.pb 또는 .h5)은 단순히 TFLite(.tflite) 파일로 변환된다. TFLite로의 변환은 그 후에야 인터프리터가 실행할 수 있도록 장치에 모델을 배포할 수 있기 때문에 중요하다. 예를 들어, 사용자 지정 네트워크의 매우 가벼운 버전을 사용하거나 상대적으로 작은 사전 훈련된 MobileNet을 사용하는 경우 양자화가 필요하지 않을 수 있다. 양자화는 모델의 정확도를 감소시키는 비용과 함께 올 수 있음을 기억해야 한다. 그런 다음 성능 저하가 없는 경우 모델을 TFLite 모델로 변환한 다음 장치 자체에서 실행되는 TFLite 인터프리터에서 가져와서 해석할 수 있다. TFLite 모델의 크기는 원래 TensorFlow 모델보다 약간 작다. 이것은 TFLite 모델을 생성하기 위해 FlatBuffers를 사용하기 때문이다 (프로토콜 버퍼 및 FlatBuffers의 차이점을 확인).
가중치 / 하이브리드 양자화 (Weights / hybrid quantization)
훈련된 모델의 가중치만 16비트 FP 또는 8비트 INT로 양자화된다. 이렇게 하면 모델 크기가 각각 2배 또는 4배 줄어든다. 16비트 FP 양자화된 가중치의 경우 현재 세대 CPU가 기본 16비트 FP 산술을 지원하지 않기 때문에 CPU에서 실행할 때 32비트 FP로 다시 변환 (또는 역양자화)된다. 그러나 16비트 FP는 부동 소수점 16 데이터에서 작동할 수 있으므로 GPU를 사용할 때 좋은 선택이 될 수 있다. 8비트 INT 양자화된 가중치의 경우 정수 데이터로도 작업할 수 있는 일부 연산자 (하이브리드 연산자라고 함)는 활성화 값을 8비트 INT로 동적으로 양자화하고 8비트 가중치 및 활성화로 계산을 수행한다. 이것은 완전 고정 소수점 추론 (ex : 완전 정수 양자화)에 가까운 대기 시간을 제공한다. 그러나 출력은 부동 소수점 정밀도로 역양자화 (또는 다시 변환)된다. 이것은 순수한 부동 소수점 계산보다 속도를 높일 수 있지만 메모리 공간은 동일하게 유지된다. 하이브리드 운영자는 네트워크에서 가장 컴퓨팅 집약적인 부분 (ex : fully_connected, conv2d 등)에 사용할 수 있다.
완전 양자화 (Full quantization)
여기서 훈련된 모델을 완전히 양자화한다. 즉, 가중치와 활성화 값의 양자화가 수행된다. 위에서 언급한 것처럼 가중치의 양자화는 매우 간단하지만 활성화 값의 양자화는 그렇게 간단하지 않는다. 활성화 값을 양자화한다는 것은 무엇을 의미할까? 활성화 함수의 출력은 예를 들어 [+127, -128] 부호 있는 INT 값에 매핑된다. 이것은 (부호 있는) 8비트 INT를 사용한 활성화 값의 양자화이다. 이제 부동 소수점 (32비트 FP)에서 정수로 활성화를 변환하거나 매핑하려면 스케일링 매개변수를 결정하기 위한 보정 단계가 필요하다. 이러한 매개변수는 모델을 통해 대표 데이터세트 (ex : 테스트 또는 검증 데이터세트)의 여러 예를 실행하여 계산된다. TFLite는 대표 데이터 세트에서 활성화의 MIN 및 MAX 값을 계산하고 저장한다. MIN 및 MAX 값을 사용하면 TFLite는 모든 부동 소수점 숫자를 [+127, -128]에 매핑한다. 그런 다음 활성화는 추론 시간에 즉석에서 양자화된다.
많은 모바일 또는 임베디드 장치 가 부동 소수점 연산을 지원하지 않는다는 점에 유의하는 것이 중요하다. 대부분의 경우 부동 소수점 단위 (FPU) 가 없거나 전력 절약을 위해 비활성화되어 있기 때문이다. 따라서, 전체 정수 양자화 (즉, 가중치와 활성화가 모두 8비트 INT로 변환됨)는 일반적으로 요구 사항이다. 이러한 정수는 더 적은 메모리를 필요로 할 뿐만 아니라 정수를 사용한 산술이 매우 빠르게 실행될 수 있으므로 짧은 대기 시간을 제공한다. 예를 들어, Google의 Coral Edge TPU는 완전히 8비트 양자화된 TFLite 모델만 지원하므로 부동 소수점 연산은 지원되지 않으며 해당 모델은 호환되지 않는다. Edge TPU에서 모든 연산자가 지원되는 것은 아니다. TFLite의 호환 가능한 연산자 목록 — 지원되는 연산자 목록은 여기 에서 찾을 수 있다.
반면에 정수 기반 산술이 지원되지 않는 경우 8비트 양자화 모델은 가능하면 32비트 부동 소수점으로 대체된다.
What mobile-friendly deep learning models are available?
다음은 TFLite에서 완전히 지원되는 (즉, 전체 정수 양자화) 사전 훈련된 일부 모델이다.
|
결론
모든 종류의 양자화를 수행하기 전에 항상 다음 사항을 염두에 두는 것이 중요하다.
하드웨어 (CPU 또는 GPU 또는 TPU)에서 지원(FP32 또는 FP16 또는 INT8)하고 마지막으로 TensorFlow Lite에서 지원하는 작업 종류 |
https://medium.com/sclable/model-quantization-using-tensorflow-lite-2fe6a171a90d
'DNN with Keras > TensorFlow' 카테고리의 다른 글
[TensorFlow] Mac M1에서 TensorFlow 설치 (0) | 2022.09.02 |
---|---|
[TensorFlow] The kernel appears to have died. It will restart automatically. (0) | 2022.08.29 |
TensorFlow Lite (1) (0) | 2022.08.23 |
[TensorFlow] 텐서 작업 (0) | 2022.06.20 |
[TensorFlow] Pandas 데이터 프레임 전처리 (0) | 2022.06.16 |