GPU-Bevollmächtigte für LiteRT

Grafikprozessoren (Graphics Processing Units, GPUs) zum Ausführen Ihrer Modelle für maschinelles Lernen (ML) verwenden kann die Leistung Ihres Modells und die Nutzererfahrung erheblich verbessern. Ihrer ML-fähigen Anwendungen. LiteRT ermöglicht die Verwendung von GPUs und andere spezielle Prozessoren über den Hardwaretreiber namens Bevollmächtigten. Verwendung von GPUs mit LiteRT ML aktivieren -Anwendungen können folgende Vorteile bieten:

  • Geschwindigkeit: GPUs sind für einen hohen Durchsatz an massiven Parallelverarbeitung ausgelegt. Arbeitsbelastungen. Dank dieses Designs eignen sie sich gut für tiefe neuronale Netze, aus einer großen Anzahl von Operatoren, die jeweils mit Eingabetensoren arbeiten, parallel verarbeitet werden, was in der Regel zu einer geringeren Latenz führt. In ist das beste Szenario, wenn das Modell auf einer GPU ausgeführt wird, Echtzeitanwendungen zu erstellen, die vorher nicht möglich waren.
  • Energieeffizienz: GPUs führen ML-Berechnungen sehr effizient aus. optimiert und verbraucht in der Regel weniger Strom und als dieselbe Aufgabe, die auf CPUs ausgeführt wird.

Dieses Dokument bietet einen Überblick über die GPU-Unterstützung in LiteRT und einige den Einsatz von GPU-Prozessoren. Genauere Informationen über GPU-Unterstützung auf bestimmten Plattformen implementieren, finden Sie in den folgenden Leitfäden:

Unterstützung für GPU-ML-Vorgänge

Es gibt einige Einschränkungen im Hinblick darauf, welche TensorFlow-ML-Vorgänge oder Operationen möglich sind. durch den LiteRT-GPU-Delegaten beschleunigt wird. Der Bevollmächtigte unterstützt die folgende Operationen mit 16-Bit- und 32-Bit-Gleitkommazahl:

  • ADD
  • AVERAGE_POOL_2D
  • CONCATENATION
  • CONV_2D
  • DEPTHWISE_CONV_2D v1-2
  • EXP
  • FULLY_CONNECTED
  • LOGICAL_AND
  • LOGISTIC
  • LSTM v2 (Basic LSTM only)
  • MAX_POOL_2D
  • MAXIMUM
  • MINIMUM
  • MUL
  • PAD
  • PRELU
  • RELU
  • RELU6
  • RESHAPE
  • RESIZE_BILINEAR v1-3
  • SOFTMAX
  • STRIDED_SLICE
  • SUB
  • TRANSPOSE_CONV

Standardmäßig werden alle Vorgänge nur ab Version 1 unterstützt. Quantisierung aktivieren Support die entsprechenden Versionen aktiviert, z. B. ADD v2.

Fehlerbehebung beim GPU-Support

Wenn einige Vorgänge nicht vom GPU-Delegaten unterstützt werden, führt das Framework nur einen Teil des Graphen auf der GPU und den verbleibenden Teil auf der CPU ausführen. Fällig zu den hohen Kosten für die CPU/GPU-Synchronisierung führt, führt oft zu einer geringeren Leistung als wenn das gesamte Netzwerk auf dem CPU allein. In diesem Fall generiert die Anwendung eine Warnung wie die folgende:

WARNING: op code #42 cannot be handled by this delegate.

Für Fehler dieses Typs gibt es keinen Callback, da es sich nicht um einen tatsächlichen Laufzeitfehler. Wenn Sie die Ausführung Ihres Modells mit dem GPU-Delegaten testen, sollten Sie auf diese Warnungen achten. Eine hohe Anzahl solcher Warnungen kann geben an, dass Ihr Modell nicht für die GPU-Beschleunigung geeignet ist, und eine Refaktorierung des Modells erfordern.

Beispielmodelle

Die folgenden Beispielmodelle sind so konzipiert, dass sie die Vorteile der GPU-Beschleunigung mit LiteRT und werden als Referenz und für Testzwecke bereitgestellt:

Für GPUs optimieren

Mit den folgenden Methoden können Sie eine bessere Leistung beim Ausführen von Modellen erzielen auf GPU-Hardware mit dem LiteRT GPU-Delegaten:

  • Umformung von Vorgängen: Einige Vorgänge, die auf einer CPU schnell ausgeführt werden, haben möglicherweise eine hohe Kosten für die GPU auf Mobilgeräten. Umformungsvorgänge sind besonders teure Ausführung, einschließlich BATCH_TO_SPACE, SPACE_TO_BATCH, SPACE_TO_DEPTH usw. Sie sollten die Verwendung der Funktion Operationen und möglicherweise nur zur Untersuchung von Daten oder für erste Iterationen Ihres Modells geeignet. Das Entfernen kann erheblich die Leistung zu verbessern.

  • Bilddatenkanäle: Auf der GPU werden Tensordaten in vier Kanäle unterteilt. sodass eine Berechnung mit einem Tensor mit der Form [B,H,W,5] in Bezug auf gleich bei einem Tensor der Form [B,H,W,8], aber deutlich schlechter als [B,H,W,4] Wenn die verwendete Kamera-Hardware Bilderrahmen in RGBA, die Einspeisung dieser 4-Kanal-Eingabe ist deutlich schneller, da dadurch verhindert wird, eine Speicherkopie von 3-Kanal-RGB zu 4-Kanal-RGBX.

  • Für Mobilgeräte optimierte Modelle: Für eine optimale Leistung sollten Sie Ihr Klassifikator mit einer für Mobilgeräte optimierten Netzwerkarchitektur erneut trainieren. Die Optimierung der On-Device-Inferenz kann die Latenz erheblich durch die Nutzung mobiler Hardwarefunktionen.

Erweiterte GPU-Unterstützung

Sie können zusätzliche, fortgeschrittene Techniken bei der GPU-Verarbeitung verwenden, um noch eine bessere Leistung für Ihre Modelle zu erzielen, einschließlich Quantisierung und Serialisierung. In den folgenden Abschnitten werden diese Techniken ausführlicher beschrieben.

Quantisierte Modelle verwenden

In diesem Abschnitt wird erläutert, wie der GPU-Delegate 8-Bit-quantisierte Modelle beschleunigt. einschließlich der folgenden:

Verwenden Sie zur Leistungsoptimierung Modelle, die sowohl Gleitkomma-Eingaben Ausgabetensoren.

So funktioniert's

Da das GPU-Back-End nur Gleitkommaausführung unterstützt, führen wir die quantisierte Ausführung indem Sie ihm eine Gleitkommaansicht des ursprünglichen Modells geben. Bei umfasst dies folgende Schritte:

  • Konstantentensoren (wie Gewichtungen/Verzerrungen) werden einmal in die GPU-Arbeitsspeicher. Dieser Vorgang tritt auf, wenn der Bevollmächtigte für LiteRT

  • Die Ein- und Ausgaben an das GPU-Programm sind bei 8-Bit-Quantisierung für jede Inferenz dequantisiert und quantisiert. Dieser Vorgang erfolgt auf der CPU mithilfe der optimierten Kernel von LiteRT.

  • Quantisierungssimulatoren werden zwischen Vorgängen eingefügt, um quantisierte Daten zu imitieren. verhalten. Dieser Ansatz ist für Modelle erforderlich, bei denen das operative IT-Team Aktivierungen erwartet den während der Quantisierung erlernten Grenzen zu folgen.

Informationen zum Aktivieren dieses Features mit dem GPU-Delegaten finden Sie in der Folgendes:

Initialisierungszeit durch Serialisierung reduzieren

Mit dem GPU Delegate-Feature können Sie Daten aus vorkompiliertem Kernel-Code laden und Modelldaten aus früheren Ausführungen serialisiert und auf dem Laufwerk gespeichert. Dadurch wird verhindert, und die Startzeit um bis zu 90 % reduzieren. Diese Verbesserung ist durch Austausch von Speicherplatz zur Zeitersparnis erreicht. Sie können diese Funktion aktivieren mit einigen Konfigurationsoptionen, wie in den folgenden Codebeispielen gezeigt:

C++

    TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default();
    options.experimental_flags |= TFLITE_GPU_EXPERIMENTAL_FLAGS_ENABLE_SERIALIZATION;
    options.serialization_dir = kTmpDir;
    options.model_token = kModelToken;

    auto* delegate = TfLiteGpuDelegateV2Create(options);
    if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
      

Java

    GpuDelegate delegate = new GpuDelegate(
      new GpuDelegate.Options().setSerializationParams(
        /* serializationDir= */ serializationDir,
        /* modelToken= */ modelToken));

    Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
      

Stellen Sie bei Verwendung der Serialisierungsfunktion sicher, dass Ihr Code diesen Implementierungsregeln:

  • Speichern Sie die Serialisierungsdaten in einem Verzeichnis, auf das andere Nutzer nicht zugreifen können. Apps. Verwenden Sie auf Android-Geräten getCodeCacheDir() der auf einen Speicherort verweist, der für die aktuelle Anwendung privat ist.
  • Das Modelltoken muss für das Gerät des jeweiligen Modells eindeutig sein. Sie können ein Modelltoken zu berechnen, indem ein Fingerabdruck aus den Modelldaten generiert wird. Bibliotheken wie farmhash::Fingerprint64