학습 후 양자화

학습 후 양자화는 모델 크기를 줄일 수 있는 변환 기법임 이와 동시에 CPU 및 하드웨어 가속기 지연 시간을 모델 정확성 저하를 줄일 수 있습니다 이미 학습된 부동 소수점 수 TensorFlow 모델을 LiteRT 변환기.

최적화 방법

여러 가지 학습 후 양자화 옵션 중에서 선택할 수 있습니다. 다음은 선택사항 및 각 선택의 이점이 요약된 표:

기법 이점 하드웨어
다이내믹 레인지 양자화 4배 더 작게, 2~3배 속도 향상 CPU
정수 양자화 4배 더 작게, 속도 3배 이상 CPU, Edge TPU, 마이크로컨트롤러
Float16 양자화 2배 더 작음, GPU 가속 CPU, GPU

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

학습 후 최적화 옵션

양자화 없음

먼저 양자화 없이 TFLite 모델로 변환하는 것이 좋습니다. 있습니다. 그러면 부동 TFLite 모델이 생성됩니다.

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
tflite_quant_model = converter.convert()

이 작업은 원래 TF 모델의 연산자는 TFLite와 호환되며 후속 학습 후 발생하는 양자화 오류를 디버그하기 위한 기준 방법을 배웠습니다. 예를 들어 양자화된 TFLite 모델이 플로팅 TFLite 모델은 정확하지만 TFLite 연산자의 양자화 버전으로 인해 발생하는 오류에 관한 문제입니다.

다이내믹 레인지 양자화

다이내믹 레인지 양자화는 메모리 사용량을 줄이고 계산 속도를 높입니다. 보정을 위한 대표 데이터 세트를 제공하지 않아도 됩니다. 이 부동 소수점의 가중치만 정적으로 양자화 변환 시점에 정수로 변환되며, 이는 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비트 가중치 및 활성화 연산을 사용하여 수행됩니다. 이러한 최적화는 완전히 고정 소수점 추론에 가까운 지연 시간입니다. 그러나 출력은 여전히 부동 소수점을 사용하여 저장되므로 다이내믹 레인지 작업의 빠른 속도가 훨씬 더 강력합니다.

전체 정수 양자화

지연 시간을 더욱 개선하고, 최대 메모리 사용량을 줄이며, 정수만 사용하는 하드웨어 장치 또는 가속기와의 호환성을 모든 모델 수학은 정수 양자화됩니다.

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

TensorFlow 2.7 버전부터는 서명이 필요합니다.

def representative_dataset():
  for data in dataset:
    yield {
      "image": data.image,
      "bias": data.bias,
    }

주어진 TensorFlow 모델에 서명이 두 개 이상 있는 경우 다음을 수행할 수 있습니다. 서명 키를 지정하여 여러 데이터 세트를 지정합니다.

def representative_dataset():
  # Feed data set for the "encode" signature.
  for data in encode_signature_dataset:
    yield (
      "encode", {
        "image": data.image,
        "bias": data.bias,
      }
    )

  # Feed data set for the "decode" signature.
  for data in decode_signature_dataset:
    yield (
      "decode", {
        "image": data.image,
        "hint": data.hint,
      },
    )

입력 텐서 목록을 제공하여 대표 데이터 세트를 생성할 수 있습니다.

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

TensorFlow 2.7 버전부터는 서명 기반 접근 방식을 사용하는 것이 좋습니다. 왜냐하면 입력 텐서 순서 지정이 쉽게 뒤집힐 수 있습니다.

테스트를 위해 다음과 같이 더미 데이터세트를 사용할 수 있습니다.

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()
드림

정수만

정수 전용 모델을 만드는 것은 LiteRT의 일반적인 사용 사례로서 마이크로컨트롤러Coral Edge TPU

또한 정수 전용 기기 (예: 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 양자화

가중치를 양자화하여 부동 소수점 모델의 크기를 float16은 16비트 부동 소수점 숫자에 관한 IEEE 표준입니다. 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 양자화의 이점은 다음과 같습니다.

  • 모델 크기를 최대 절반까지 줄여줍니다. 모든 가중치가 모델의 원본 크기).
  • 정확도 손실이 최소화됩니다.
  • 또한 작동할 수 있는 일부 대리자 (예: GPU 대리자)를 지원합니다. float16 데이터에서 직접 사용하므로 float32보다 실행 속도가 빠릅니다. 있습니다.

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

  • 이는 고정 소수점 수학으로의 양자화만큼 지연 시간을 줄이지 않습니다.
  • 기본적으로 float16 양자화 모델은 가중치 값 float32로 변경할 수 있습니다. (GPU 대리자는 작업을 수행하지 않음 float16 데이터에서 작동할 수 있기 때문입니다.)

정수만 해당: 8비트 가중치를 사용하는 16비트 활성화 (실험용)

이는 실험용 양자화 체계입니다. '정수만' 활성화는 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 양자화가 지원되지 않는 경우 모델은 여전히 양자화될 수 있지만 지원되지 않는 연산자는 부동 소수점으로 유지됩니다. 이 이를 허용하려면 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와 호환되지 않습니다. 있습니다.
를 통해 개인정보처리방침을 정의할 수 있습니다.

이 양자화 모드에 관한 가이드는 여기에서 확인할 수 있습니다.

모델 정확성

가중치는 학습 후 양자화되므로 정확성 손실이 있을 수 있습니다. 특히 소규모 네트워크의 경우 더욱 그렇습니다. 선행 학습된 완전 양자화 모델은 Kaggle의 특정 네트워크에 대해 제공됨 모델 에서 자세한 내용을 확인하실 수 있습니다. 양자화 모델의 정확성을 검사하여 양자화 모델의 정확성의 저하는 허용 한도 이내입니다. 도구를 사용하여 LiteRT 모델 평가 정확도에 대해 자세히 알아보기

또는 정확성 저하가 너무 크다면 양자화 기능을 사용하는 것이 좋습니다. 인식 교육 에서 자세한 내용을 확인하실 수 있습니다. 하지만 이렇게 하면 모델 학습 중에 가짜를 추가하여 양자화 노드의 학습 후 양자화 기법은 선행 학습된 기존 모델을 사용합니다.

양자화 텐서의 표현

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

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

이 표현은 두 가지 주요 부분으로 구성됩니다.

  • int8 2로 표현되는 축당 (채널별) 또는 텐서당 가중치 [-127, 127] 범위의 값을 보완합니다.

  • int8 2의 보수 값으로 표시되는 텐서별 활성화/입력 [-128, 127] 범위의 0점을 사용합니다.

양자화 체계에 관한 자세한 내용은 양자화 사양을 참조하세요. TensorFlow에 연결하려는 하드웨어 공급업체 Lite의 대리자 인터페이스는 양자화 방식을 구현하도록 권장됨 참조하세요.