Sehen Sie sich Keynotes, Produktsitzungen, Workshops und mehr in Google I / O an. Siehe Wiedergabeliste

TensorFlow Lite Hexagon-Delegierter

In diesem Dokument wird erläutert, wie Sie den TensorFlow Lite Hexagon-Delegaten in Ihrer Anwendung mithilfe der Java- und / oder C-API verwenden. Der Delegat nutzt die Qualcomm Hexagon-Bibliothek, um quantisierte Kernel auf dem DSP auszuführen. Beachten Sie, dass der Delegat die NNAPI-Funktionalität ergänzen soll, insbesondere für Geräte, auf denen die NNAPI-DSP-Beschleunigung nicht verfügbar ist (z. B. auf älteren Geräten oder Geräten, die noch keinen DSP-NNAPI-Treiber haben).

Unterstützte Geräte:

Derzeit werden die folgenden Hexagon-Architekturen unterstützt, einschließlich, aber nicht beschränkt auf:

  • Sechseck 680
    • SoC-Beispiele: Snapdragon 821, 820, 660
  • Sechseck 682
    • SoC-Beispiele: Snapdragon 835
  • Sechseck 685
    • SoC-Beispiele: Snapdragon 845, Snapdragon 710, QCS605, QCS603
  • Sechseck 690
    • SoC-Beispiele: Snapdragon 855, QCS610, QCS410, RB5

Unterstützte Modelle:

Der Hexagon-Delegat unterstützt alle Modelle, die unserer symmetrischen 8-Bit-Quantisierungsspezifikation entsprechen , einschließlich der Modelle, die mithilfe der Ganzzahlquantisierung nach dem Training generiert wurden. UInt8-Modelle, die mit dem alten quantisierungsbewussten Trainingspfad trainiert wurden, werden ebenfalls unterstützt, z. B. diese quantisierten Versionen auf unserer Seite Hosted Models.

Hexagon-Delegat-Java-API

public class HexagonDelegate implements Delegate, Closeable {

  /*

   * Creates a new HexagonDelegate object given the current 'context'.
   * Throws UnsupportedOperationException if Hexagon DSP delegation is not
   * available on this device.
   */
  public HexagonDelegate(Context context) throws UnsupportedOperationException


  /**

   * Frees TFLite resources in C runtime.
   *
   * User is expected to call this method explicitly.
   */
  @Override
  public void close();
}

Anwendungsbeispiel

Schritt 1. Bearbeiten Sie app / build.gradle, um den nächtlichen Hexagon-Delegierten-AAR zu verwenden

dependencies {
  ...
  implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
  implementation 'org.tensorflow:tensorflow-lite-hexagon:0.0.0-nightly-SNAPSHOT'
}

Schritt 2. Fügen Sie Ihrer Android-App Hexagon-Bibliotheken hinzu

  • Laden Sie hexagon_nn_skel.run herunter und führen Sie es aus. Es sollte 3 verschiedene gemeinsam genutzte Bibliotheken "libhexagon_nn_skel.so", "libhexagon_nn_skel_v65.so", "libhexagon_nn_skel_v66.so" bereitstellen.

Schritt 3. Erstellen Sie einen Delegaten und initialisieren Sie einen TensorFlow Lite-Interpreter

import org.tensorflow.lite.HexagonDelegate;

// Create the Delegate instance.
try {
  hexagonDelegate = new HexagonDelegate(activity);
  tfliteOptions.addDelegate(hexagonDelegate);
} catch (UnsupportedOperationException e) {
  // Hexagon delegate is not supported on this device.
}

tfliteInterpreter = new Interpreter(tfliteModel, tfliteOptions);

// Dispose after finished with inference.
tfliteInterpreter.close();
if (hexagonDelegate != null) {
  hexagonDelegate.close();
}

Hexagon-Delegat-C-API

struct TfLiteHexagonDelegateOptions {
  // This corresponds to the debug level in the Hexagon SDK. 0 (default)
  // means no debug.
  int debug_level;
  // This corresponds to powersave_level in the Hexagon SDK.
  // where 0 (default) means high performance which means more power
  // consumption.
  int powersave_level;
  // If set to true, performance information about the graph will be dumped
  // to Standard output, this includes cpu cycles.
  // WARNING: Experimental and subject to change anytime.
  bool print_graph_profile;
  // If set to true, graph structure will be dumped to Standard output.
  // This is usually beneficial to see what actual nodes executed on
  // the DSP. Combining with 'debug_level' more information will be printed.
  // WARNING: Experimental and subject to change anytime.
  bool print_graph_debug;
};

// Return a delegate that uses Hexagon SDK for ops execution.
// Must outlive the interpreter.
TfLiteDelegate*
TfLiteHexagonDelegateCreate(const TfLiteHexagonDelegateOptions* options);

// Do any needed cleanup and delete 'delegate'.
void TfLiteHexagonDelegateDelete(TfLiteDelegate* delegate);

// Initializes the DSP connection.
// This should be called before doing any usage of the delegate.
// "lib_directory_path": Path to the directory which holds the
// shared libraries for the Hexagon NN libraries on the device.
void TfLiteHexagonInitWithPath(const char* lib_directory_path);

// Same as above method but doesn't accept the path params.
// Assumes the environment setup is already done. Only initialize Hexagon.
Void TfLiteHexagonInit();

// Clean up and switch off the DSP connection.
// This should be called after all processing is done and delegate is deleted.
Void TfLiteHexagonTearDown();

Anwendungsbeispiel

Schritt 1. Bearbeiten Sie app / build.gradle, um den nächtlichen Hexagon-Delegierten-AAR zu verwenden

dependencies {
  ...
  implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
  implementation 'org.tensorflow:tensorflow-lite-hexagon:0.0.0-nightly-SNAPSHOT'
}

Schritt 2. Fügen Sie Ihrer Android-App Hexagon-Bibliotheken hinzu

  • Laden Sie hexagon_nn_skel.run herunter und führen Sie es aus. Es sollte 3 verschiedene gemeinsam genutzte Bibliotheken "libhexagon_nn_skel.so", "libhexagon_nn_skel_v65.so", "libhexagon_nn_skel_v66.so" bereitstellen.

Schritt 3. Fügen Sie den C-Header ein

  • Die Header-Datei "hexagon_delegate.h" kann von GitHub heruntergeladen oder aus dem AAR des Hexagon-Delegaten extrahiert werden.

Schritt 4. Erstellen Sie einen Delegaten und initialisieren Sie einen TensorFlow Lite-Interpreter

  • Stellen Sie in Ihrem Code sicher, dass die native Hexagon-Bibliothek geladen ist. Dies kann durch Aufrufen von System.loadLibrary("tensorflowlite_hexagon_jni");
    in Ihrer Aktivität oder Java-Einstiegspunkt.

  • Erstellen Sie einen Delegaten, Beispiel:

#include "tensorflow/lite/delegates/hexagon/hexagon_delegate.h"

// Assuming shared libraries are under "/data/local/tmp/"
// If files are packaged with native lib in android App then it
// will typically be equivalent to the path provided by
// "getContext().getApplicationInfo().nativeLibraryDir"
const char[] library_directory_path = "/data/local/tmp/";
TfLiteHexagonInitWithPath(library_directory_path);  // Needed once at startup.
::tflite::TfLiteHexagonDelegateOptions params = {0};
// 'delegate_ptr' Need to outlive the interpreter. For example,
// If use case will need to resize input or anything that can trigger
// re-applying delegates then 'delegate_ptr' need to outlive the interpreter.
auto* delegate_ptr = ::tflite::TfLiteHexagonDelegateCreate(&params);
Interpreter::TfLiteDelegatePtr delegate(delegate_ptr,
  [](TfLiteDelegate* delegate) {
    ::tflite::TfLiteHexagonDelegateDelete(delegate);
  });
interpreter->ModifyGraphWithDelegate(delegate.get());
// After usage of delegate.
TfLiteHexagonTearDown();  // Needed once at end of app/DSP usage.

Fügen Sie die gemeinsam genutzte Bibliothek zu Ihrer App hinzu

  • Erstellen Sie den Ordner "app / src / main / jniLibs" und erstellen Sie ein Verzeichnis für jede Zielarchitektur. Beispielsweise,
    • ARM 64-Bit: app/src/main/jniLibs/arm64-v8a
    • ARM 32-Bit: app/src/main/jniLibs/armeabi-v7a
  • Legen Sie Ihre .so in das Verzeichnis, das der Architektur entspricht.

Feedback

Erstellen Sie bei Problemen ein GitHub- Problem mit allen erforderlichen Repro-Details, einschließlich des verwendeten Telefonmodells und der verwendeten adb shell getprop ro.product.device und adb shell getprop ro.board.platform ).

FAQ

  • Welche Operationen werden vom Delegierten unterstützt?
  • Wie kann ich feststellen, dass das Modell den DSP verwendet, wenn ich den Delegaten aktiviere?
    • Wenn Sie den Delegaten aktivieren, werden zwei Protokollnachrichten gedruckt - eine, um anzugeben, ob der Delegat erstellt wurde, und eine, um anzugeben, wie viele Knoten mit dem Delegaten ausgeführt werden.
      Created TensorFlow Lite delegate for Hexagon.
      Hexagon delegate: X nodes delegated out of Y nodes.
  • Benötige ich, dass alle Operationen im Modell unterstützt werden, um den Delegaten auszuführen?
    • Nein, das Modell wird basierend auf den unterstützten Operationen in Untergraphen unterteilt. Alle nicht unterstützten Operationen werden auf der CPU ausgeführt.
  • Wie kann ich den Hexagon-Delegat-AAR aus dem Quellcode erstellen?
    • Verwenden Sie bazel build -c opt --config=android_arm64 tensorflow/lite/delegates/hexagon/java:tensorflow-lite-hexagon .
  • Warum kann der Hexagon-Delegat nicht initialisiert werden, obwohl mein Android-Gerät über einen unterstützten SoC verfügt?
    • Überprüfen Sie, ob Ihr Gerät tatsächlich über einen unterstützten SoC verfügt. Führen Sie adb shell cat /proc/cpuinfo | grep Hardware und prüfen Sie, ob etwas wie "Hardware: Qualcomm Technologies, Inc MSMXXXX" zurückgegeben wird.
    • Einige Telefonhersteller verwenden unterschiedliche SoCs für dasselbe Telefonmodell. Daher funktioniert der Hexagon-Delegat möglicherweise nur auf einigen, aber nicht allen Geräten desselben Telefonmodells.
    • Einige Telefonhersteller beschränken absichtlich die Verwendung von Hexagon DSP für Nicht-System-Android-Apps, sodass der Hexagon-Delegat nicht mehr arbeiten kann.
  • Mein Telefon hat den DSP-Zugriff gesperrt. Ich habe das Telefon gerootet und kann den Delegaten immer noch nicht ausführen. Was tun?
    • adb shell setenforce 0 Sie sicher, dass Sie die SELinux-Durchsetzung deaktivieren, indem Sie die adb shell setenforce 0