Quantisierung nach dem Training

Die Quantisierung nach dem Training ist eine Konvertierungstechnik, mit der die Modellgröße reduziert werden kann. und gleichzeitig die Latenz von CPU und Hardwarebeschleuniger Beeinträchtigung der Modellgenauigkeit. Sie können einen bereits trainierten Float quantisieren TensorFlow-Modells, wenn Sie es mithilfe der Methode LiteRT Converter verfügbar.

Optimierungsmethoden

Nach dem Training können Sie aus mehreren Optionen für die Quantisierung auswählen. Hier ist ein Übersichtstabelle der Auswahlmöglichkeiten und deren Vorteile:

Verfahren Vorteile Hardware
Dynamischer Bereich Quantisierung 4-mal kleiner, 2- bis 3-mal schneller CPU
Vollständige Ganzzahl Quantisierung 4-mal kleiner, mehr als 3-mal schneller CPU, Edge TPU, Mikrocontroller
Float16-Quantisierung 2-mal kleiner, GPU Beschleunigung CPU, GPU

Der folgende Entscheidungsbaum kann bestimmen, welche Quantisierung nach dem Training für Ihren Anwendungsfall am besten geeignet:

Optimierungsoptionen nach dem Training

Keine Quantisierung

Es empfiehlt sich, zu Beginn der Studie in ein TFLite-Modell ohne Quantisierung zu konvertieren Punkt. Dadurch wird ein Float-TFLite-Modell generiert.

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

Wir empfehlen dies als ersten Schritt, um zu überprüfen, ob die ursprüngliche Die Operatoren des TF-Modells sind mit TFLite kompatibel und können auch als Referenz zur Behebung von Quantisierungsfehlern, die durch nachfolgendes Training verursacht wurden Quantisierungsmethoden. Wenn z. B. ein quantisiertes TFLite-Modell generiert, unerwartete Ergebnisse liefert. Das Float-TFLite-Modell ist zwar genau, kann aber das Problem auf Fehler, die durch die quantisierte Version der TFLite-Operatoren verursacht wurden.

Quantisierung des dynamischen Bereichs

Die dynamische Bereichsquantisierung sorgt für weniger Arbeitsspeicher und schnellere Berechnungen ohne dass Sie ein repräsentatives Dataset für die Kalibrierung bereitstellen müssen. Dieses Art der Quantisierung, quantisiert nur die Gewichtungen aus Gleitkommazahlen statisch in eine Ganzzahl, was eine Genauigkeit von 8 Bit bietet:

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

Um die Latenz während der Inferenz weiter zu reduzieren, Operatoren quantisieren Aktivierungen dynamisch anhand ihres Bereichs bis zu 8 Bit Berechnungen mit 8-Bit-Gewichtungen und -Aktivierungen. Diese Optimierung bietet Latenzen, die in der Nähe von vollständig festgelegten Inferenzen liegen. Die Ausgaben sind jedoch immer noch werden als Gleitkommazahlen gespeichert, damit die höhere Geschwindigkeit von Operationen für dynamischen Bereich geringer ist. als eine vollständige Festpunktberechnung.

Quantisierung nach vollständiger Ganzzahl

Sie können die Latenz weiter verbessern, den Spitzenverbrauch reduzieren und nur mit Ganzzahlen oder Beschleunigern kompatibel ist. Alle Berechnungen des Modells sind durch Ganzzahlen quantisiert.

Für die Quantisierung der vollständigen Ganzzahl müssen Sie den Bereich kalibrieren oder schätzen. d.h. (min, max) aller Gleitkomma-Tensoren im Modell an. Im Gegensatz zu einer konstanten Tensoren wie Gewichtungen und Verzerrungen, variable Tensoren wie Modelleingaben, Aktivierungen (Ausgaben von Zwischenschichten) und Modellausgabe können nicht kalibriert sind, es sei denn, wir laufen einige Inferenzzyklen ab. Der Konverter für die Kalibrierung eines repräsentativen Datasets erforderlich. Dieses Dataset kann eine kleine Teilmenge (ca. 100–500 Stichproben) der Trainings- oder Validierungsdaten. Weitere Informationen finden Sie unter unten die Funktion representative_dataset().

Ab TensorFlow 2.7 können Sie das repräsentative Dataset über eine signature wie im folgenden Beispiel:

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

Wenn das TensorFlow-Modell mehr als eine Signatur enthält, Mehrere Datasets durch Angabe der Signaturschlüssel angeben:

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,
      },
    )

Sie können das repräsentative Dataset generieren, indem Sie eine Eingabetensorenliste bereitstellen:

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

Seit TensorFlow 2.7 empfehlen wir den signaturbasierten Ansatz gegenüber dem Ansatz auf der Basis von Eingabetensoren, da die Reihenfolge der Eingabetensoren leicht umgedreht werden.

Zu Testzwecken können Sie ein Dummy-Dataset wie folgt verwenden:

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

Ganzzahl mit Gleitkommazahl-Fallback (mit Standardeingabe/-ausgabe für Gleitkommazahl)

Um ein Modell vollständig ganzzahlig zu quantisieren, keine Ganzzahlimplementierung haben (damit die Conversion reibungslos abläuft), verwenden Sie führen Sie die folgenden Schritte aus:

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

Nur Ganzzahl

Die Erstellung von Modellen, die ausschließlich Ganzzahlen enthalten, ist ein häufiger Anwendungsfall für LiteRT für Mikrocontroller und Coral Edge-TPUs

Um die Kompatibilität mit reinen Ganzzahl-Geräten (z. B. 8-Bit-Geräte) sicherzustellen, -Mikrocontrollern) und Beschleunigern (wie die Coral Edge TPU) vollständige Ganzzahlquantisierung für alle Operationen, einschließlich der Ein- und Ausgabe, unter Verwendung von führen Sie die folgenden Schritte aus:

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-Quantisierung

Sie können die Größe eines Gleitkommamodells reduzieren, indem Sie die Gewichtungen float16, der IEEE-Standard für 16-Bit-Gleitkommazahlen. Um float16 zu aktivieren Quantisierung von Gewichtungen führen Sie die folgenden Schritte aus:

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

Die FLOAT16-Quantisierung bietet folgende Vorteile:

  • Sie reduziert die Modellgröße um bis zu 50 %, da alle Gewichtungen die Hälfte ihrer Originalgröße).
  • Dies führt zu minimalen Genauigkeitsverlusten.
  • Sie unterstützt einige Bevollmächtigte (z.B. den GPU-Delegaten), die direkt auf float16-Daten, was eine schnellere Ausführung als float32 bedeutet. Berechnungen.

Die float16-Quantisierung hat folgende Nachteile:

  • Sie reduziert die Latenz nicht so sehr wie eine Quantisierung bei der Fixpunktberechnung.
  • Standardmäßig „dequantisiert“ ein mit float16 quantisiertes Modell Gewichtungen auf float32. (Der GPU-Delegate führt keine diese Dequantisierung ein, da sie mit float16-Daten arbeiten kann.)

Nur Ganzzahl: 16-Bit-Aktivierungen mit 8-Bit-Gewichtungen (experimentell)

Dies ist ein experimentelles Quantisierungsschema. Er entspricht in etwa der Zahl „Nur Ganzzahl“. Aktivierungen werden jedoch anhand ihres Bereichs bis 16-Bit-Gewichtungen quantisiert. werden mit einer 8-Bit-Ganzzahl quantisiert, und die Bias wird in eine 64-Bit-Ganzzahl quantisiert. Dieses wird als 16x8-Quantisierung bezeichnet.

Der Hauptvorteil dieser Quantisierung besteht darin, dass sie die Genauigkeit verbessern kann. deutlich erhöht, aber nur geringfügig größer.

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

Wenn die 16x8-Quantisierung für einige Operatoren im Modell nicht unterstützt wird, gibt der das Modell weiterhin quantisiert werden kann, aber nicht unterstützte Operatoren bleiben als Gleitkommazahl erhalten. Die muss die folgende Option zu „target_spec“ hinzugefügt werden, um dies zu ermöglichen.

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

Beispiele für Anwendungsfälle, bei denen die Genauigkeit verbessert wird. Quantisierungsschema:

  • mit hoher Auflösung,
  • Audiosignalverarbeitung wie Geräuschunterdrückung und Beamforming,
  • Rauschen entfernen,
  • HDR-Rekonstruktion aus einem einzelnen Bild.

Diese Quantisierung hat folgenden Nachteil:

  • Derzeit ist die Inferenz deutlich langsamer als eine 8-Bit-Ganzzahl. keine optimierte Kernel-Implementierung.
  • Derzeit ist es nicht mit dem vorhandenen hardwarebeschleunigten TFLite-Modell kompatibel. Bevollmächtigten.

Eine Anleitung für diesen Quantisierungsmodus finden Sie hier.

Modellgenauigkeit

Da die Gewichtungen nach dem Training quantisiert werden, kann es zu einem insbesondere für kleinere Netzwerke. Vortrainierte, vollständig quantisierte Modelle für bestimmte Netzwerke auf Kaggle Modelle . Es ist wichtig, die Genauigkeit des quantisierten Modells zu überprüfen, jede Verschlechterung der Genauigkeit innerhalb akzeptabler Grenzen. Es gibt Tools, LiteRT-Modell bewerten Genauigkeit.

Wenn der Rückgang der Genauigkeit zu hoch ist, können Sie alternativ die Quantisierung verwenden. bewusst Training . Dafür sind jedoch Änderungen während des Modelltrainings erforderlich, um fiktive Quantisierungsknoten. Die Quantisierungsverfahren nach dem Training ein vorhandenes vortrainiertes Modell verwenden.

Darstellung für quantisierte Tensoren

Bei der 8-Bit-Quantisierung werden Gleitkommawerte mithilfe von aus.

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

Die Darstellung besteht aus zwei Hauptteilen:

  • Gewichtungen pro Achse (auch pro Kanal genannt) oder pro Tensor, dargestellt durch Int8-Zweier ergänzen Werte im Bereich [-127, 127] mit einem Nullpunkt gleich 0.

  • Aktivierungen/Eingaben pro Tensor, dargestellt durch Int8-Zweierkomplementwerte in den Bereich [-128, 127] mit einem Nullpunkt im Bereich [-128, 127].

Eine detaillierte Ansicht unseres Quantisierungsschemas finden Sie in unserer Quantisierungstabelle Spezifikation. Hardwareanbieter, die TensorFlow einbinden möchten Für die Delegate-Schnittstelle von Lite wird empfohlen, das Quantisierungsschema zu implementieren. wie dort beschrieben.