Google I / O에서 기조 연설, 제품 세션, 워크샵 등을 시청 하세요. 재생 목록보기

훈련 후 양자화

훈련 후 양자화는 모델 정확도를 거의 저하시키지 않으면 서 CPU 및 하드웨어 가속기 대기 시간을 개선하면서 모델 크기를 줄일 수있는 변환 기술입니다. TensorFlow Lite Converter를 사용하여 TensorFlow Lite 형식으로 변환 할 때 이미 훈련 된 float TensorFlow 모델을 양자화 할 수 있습니다.

최적화 방법

선택할 수있는 몇 가지 학습 후 양자화 옵션이 있습니다. 다음은 선택 항목과 제공되는 이점에 대한 요약 표입니다.

기술 혜택 하드웨어
동적 범위 양자화 4 배 작아짐, 2 배 -3 배 속도 향상 CPU
완전한 정수 양자화 4 배 더 작게, 3 배 이상의 속도 향상 CPU, Edge TPU, 마이크로 컨트롤러
Float16 양자화 2 배 더 작아 진 GPU 가속 CPU, GPU

다음 의사 결정 트리는 사용 사례에 가장 적합한 훈련 후 양자화 방법을 결정하는 데 도움이 될 수 있습니다.

훈련 후 최적화 옵션

동적 범위 양자화

훈련 후 양자화의 가장 간단한 형태는 8 비트의 정밀도를 가진 부동 소수점에서 정수까지 가중치 만 정적으로 양자화합니다.

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_quant_model = converter.convert()

추론에서 가중치는 8 비트 정밀도에서 부동 소수점으로 변환되고 부동 소수점 커널을 사용하여 계산됩니다. 이 변환은 한 번 수행되고 캐시되어 대기 시간을 줄입니다.

대기 시간을 더욱 개선하기 위해 "동적 범위"연산자는 8 비트까지의 범위를 기반으로 활성화를 동적으로 양자화하고 8 비트 가중치 및 활성화로 계산을 수행합니다. 이 최적화는 완전 고정 소수점 추론에 가까운 지연 시간을 제공합니다. 그러나 출력은 여전히 ​​부동 소수점을 사용하여 저장되므로 동적 범위 연산을 통한 속도 향상은 전체 고정 소수점 계산보다 적습니다.

완전한 정수 양자화

모든 모델 수학이 정수 양자화되었는지 확인하여 추가 지연 시간 개선, 최대 메모리 사용량 감소, 정수 전용 하드웨어 장치 또는 가속기와의 호환성을 얻을 수 있습니다.

전체 정수 양자화의 경우 모델에있는 모든 부동 소수점 텐서의 범위, 즉 (최소, 최대)를 보정하거나 추정해야합니다. 가중치 및 편향과 같은 상수 텐서와 달리, 모델 입력, 활성화 (중간 레이어의 출력) 및 모델 출력과 같은 가변 텐서는 몇 가지 추론주기를 실행하지 않는 한 보정 할 수 없습니다. 결과적으로 변환기는이를 교정하기 위해 대표 데이터 세트가 필요합니다. 이 데이터 세트는 훈련 또는 검증 데이터의 작은 하위 집합 (약 100 ~ 500 개 샘플) 일 수 있습니다. 아래의 representative_dataset() 함수를 참고하세요.

def representative_dataset():
  for data in tf.data.Dataset.from_tensor_slices((images)).batch(1).take(100):
    yield [tf.dtypes.cast(data, tf.float32)]

테스트 목적으로 다음과 같이 더미 데이터 세트를 사용할 수 있습니다.

def representative_dataset():
    for _ in range(100):
      data = np.random.rand(1, 244, 244, 3)
      yield [data.astype(np.float32)]
 

부동 소수점 대체가있는 정수 (기본 부동 입력 / 출력 사용)

모델을 완전히 정수로 양자화하지만 정수 구현이없는 경우 부동 연산자를 사용하려면 (원활하게 변환을 수행하기 위해) 다음 단계를 사용하십시오.

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset
tflite_quant_model = converter.convert()

정수만

정수 전용 모델을 만드는 것은 마이크로 컨트롤러Coral Edge TPUTensorFlow Lite 의 일반적인 사용 사례입니다.

또한 정수 전용 장치 (예 : 8 비트 마이크로 컨트롤러) 및 가속기 (예 : Coral Edge TPU)와의 호환성을 보장하기 위해 다음 단계를 사용하여 입력 및 출력을 포함한 모든 작업에 대해 전체 정수 양자화를 적용 할 수 있습니다.

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8  # or tf.uint8
converter.inference_output_type = tf.int8  # or tf.uint8
tflite_quant_model = converter.convert()

Float16 양자화

가중치를 16 비트 부동 소수점 숫자에 대한 IEEE 표준 인 float16으로 양자화하여 부동 소수점 모델의 크기를 줄일 수 있습니다. 가중치의 float16 양자화를 활성화하려면 다음 단계를 사용하십시오.

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [tf.float16]
tflite_quant_model = converter.convert()

float16 양자화의 장점은 다음과 같습니다.

  • 모든 가중치가 원래 크기의 절반이되므로 모델 크기를 최대 절반까지 줄입니다.
  • 정확도 손실을 최소화합니다.
  • float16 데이터에서 직접 작동 할 수있는 일부 델리게이트 (예 : GPU 델리게이트)를 지원하므로 float32 계산보다 빠른 실행이 가능합니다.

float16 양자화의 단점은 다음과 같습니다.

  • 고정 소수점 수학에 대한 양자화만큼 지연 시간을 줄이지 않습니다.
  • 기본적으로 float16 양자화 된 모델은 CPU에서 실행될 때 가중치 값을 float32로 "역 양자화"합니다. (GPU 델리게이트는 float16 데이터에서 작동 할 수 있으므로이 역 양자화를 수행하지 않습니다.)

정수만 : 8 비트 가중치를 사용한 16 비트 활성화 (실험적)

이것은 실험적인 양자화 체계입니다. 이는 "정수 전용"방식과 유사하지만 활성화는 16 비트 범위에 따라 양자화되고 가중치는 8 비트 정수로 양자화되고 바이어스는 64 비트 정수로 양자화됩니다. 이를 16x8 양자화라고합니다.

이 양자화의 주요 장점은 정확도를 크게 향상시킬 수 있지만 모델 크기를 약간만 늘릴 수 있다는 것입니다.

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.representative_dataset = representative_dataset
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8]
tflite_quant_model = converter.convert()

모델의 일부 연산자에 대해 16x8 양자화가 지원되지 않는 경우 모델은 여전히 ​​양자화 될 수 있지만 지원되지 않는 연산자는 float에 유지됩니다. 이를 허용하려면 다음 옵션을 target_spec에 추가해야합니다.

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.representative_dataset = representative_dataset
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8,
tf.lite.OpsSet.TFLITE_BUILTINS]
tflite_quant_model = converter.convert()

이 양자화 체계에 의해 정확도가 향상되는 사용 사례의 예는 다음과 같습니다. * 초 고해상도, * 노이즈 제거 및 빔 포밍과 같은 오디오 신호 처리, * 이미지 노이즈 제거, * 단일 이미지에서 HDR 재구성.

이 양자화의 단점은 다음과 같습니다.

  • 현재 추론은 최적화 된 커널 구현이 없기 때문에 8 비트 정수보다 눈에 띄게 느립니다.
  • 현재 기존 하드웨어 가속 TFLite 델리게이트와 호환되지 않습니다.

이 양자화 모드에 대한 자습서는 여기 에서 찾을 수 있습니다 .

모델 정확도

가중치는 훈련 후 양자화되기 때문에 특히 소규모 네트워크의 경우 정확도가 손실 될 수 있습니다. TensorFlow Lite 모델 저장소 의 특정 네트워크에 대해 사전 학습 된 완전 양자화 된 모델이 제공됩니다. 양자화 된 모델의 정확도를 확인하여 정확도 저하가 허용 가능한 한계 내에 있는지 확인하는 것이 중요합니다. TensorFlow Lite 모델 정확도 를 평가하는 도구가 있습니다 .

또는 정확도 저하가 너무 높으면 양자화 인식 훈련 사용을 고려하십시오. 그러나 이렇게하려면 모델 학습 중에 수정하여 가짜 양자화 노드를 추가해야하는 반면이 페이지의 학습 후 양자화 기술은 기존의 사전 학습 된 모델을 사용합니다.

양자화 된 텐서 표현

8 비트 양자화는 다음 공식을 사용하여 부동 소수점 값을 근사화합니다.

$$real\_value = (int8\_value - zero\_point) \times scale$$

표현에는 두 가지 주요 부분이 있습니다.

  • 축당 (또는 채널당) 또는 텐 서당 가중치는 0과 같은 영점이있는 [-127, 127] 범위의 int8 2의 보수 값으로 표시됩니다.

  • 텐 서당 활성화 / 입력은 [-128, 127] 범위에있는 int8 2의 보수 값으로 표시되며 [-128, 127] 범위에 0 점이 있습니다.

양자화 체계에 대한 자세한 내용은 양자화 사양을 참조하십시오. TensorFlow Lite의 델리게이트 인터페이스에 연결하려는 하드웨어 공급 업체는 여기에 설명 된 양자화 체계를 구현하는 것이 좋습니다.