Delegasi TensorFlow Lite Hexagon

Dokumen ini menjelaskan cara menggunakan TensorFlow Lite Hexagon Delegate di aplikasi Anda menggunakan Java dan/atau C API. Delegasi memanfaatkan perpustakaan Qualcomm Hexagon untuk mengeksekusi kernel terkuantisasi pada DSP. Perhatikan bahwa delegasi dimaksudkan untuk melengkapi fungsionalitas NNAPI, khususnya untuk perangkat di mana akselerasi DSP NNAPI tidak tersedia (misalnya, pada perangkat yang lebih lama, atau perangkat yang belum memiliki driver DSP NNAPI).

Perangkat yang didukung:

Saat ini arsitektur Hexagon berikut didukung, termasuk namun tidak terbatas pada:

  • segi enam 680
    • Contoh SoC: Snapdragon 821, 820, 660
  • segi enam 682
    • Contoh SoC: Snapdragon 835
  • segi enam 685
    • Contoh SoC: Snapdragon 845, Snapdragon 710, QCS410, QCS610, QCS605, QCS603
  • segi enam 690
    • Contoh SoC: Snapdragon 855, RB5

Model yang didukung:

Delegasi Hexagon mendukung semua model yang sesuai dengan spesifikasi kuantisasi simetris 8-bit kami , termasuk yang dihasilkan menggunakan kuantisasi bilangan bulat pasca pelatihan . Model UInt8 yang dilatih dengan jalur pelatihan sadar kuantisasi lama juga didukung, misalnya, versi terkuantisasi ini di halaman Model yang Di-hosting kami.

Delegasi Hexagon 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();
}

Contoh penggunaan

Langkah 1. Edit app/build.gradle untuk menggunakan delegasi Hexagon malam AAR

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

Langkah 2. Tambahkan perpustakaan Hexagon ke aplikasi Android Anda

  • Unduh dan jalankan hexagon_nn_skel.run. Itu harus menyediakan 3 perpustakaan bersama yang berbeda "libhexagon_nn_skel.so", "libhexagon_nn_skel_v65.so", "libhexagon_nn_skel_v66.so"

Langkah 3. Buat delegasi dan inisialisasi Penerjemah TensorFlow Lite

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

Delegasi segi enam 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();

Contoh penggunaan

Langkah 1. Edit app/build.gradle untuk menggunakan delegasi Hexagon malam AAR

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

Langkah 2. Tambahkan perpustakaan Hexagon ke aplikasi Android Anda

  • Unduh dan jalankan hexagon_nn_skel.run. Itu harus menyediakan 3 perpustakaan bersama yang berbeda "libhexagon_nn_skel.so", "libhexagon_nn_skel_v65.so", "libhexagon_nn_skel_v66.so"

Langkah 3. Sertakan header C

  • File header "hexagon_delegate.h" dapat diunduh dari GitHub atau diekstraksi dari AAR delegasi Hexagon.

Langkah 4. Buat delegasi dan inisialisasi Penerjemah TensorFlow Lite

  • Dalam kode Anda, pastikan pustaka Hexagon asli dimuat. Ini dapat dilakukan dengan memanggil System.loadLibrary("tensorflowlite_hexagon_jni");
    di titik masuk Aktivitas atau Java Anda.

  • Buat delegasi, contoh:

#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.

Tambahkan perpustakaan bersama ke aplikasi Anda

  • Buat folder “app/src/main/jniLibs”, dan buat direktori untuk setiap arsitektur target. Sebagai contoh,
    • ARM 64-bit: app/src/main/jniLibs/arm64-v8a
    • ARM 32-bit: app/src/main/jniLibs/armeabi-v7a
  • Letakkan .so Anda di direktori yang sesuai dengan arsitekturnya.

Masukan

Untuk masalah, harap buat masalah GitHub dengan semua detail repro yang diperlukan, termasuk model telepon dan papan yang digunakan ( adb shell getprop ro.product.device dan adb shell getprop ro.board.platform ).

FAQ

  • Operasi mana yang didukung oleh delegasi?
  • Bagaimana saya bisa tahu bahwa model menggunakan DSP ketika saya mengaktifkan delegasi?
    • Dua pesan log akan dicetak saat Anda mengaktifkan delegasi - satu untuk menunjukkan apakah delegasi telah dibuat dan satu lagi untuk menunjukkan berapa banyak node yang berjalan menggunakan delegasi.
      Created TensorFlow Lite delegate for Hexagon.
      Hexagon delegate: X nodes delegated out of Y nodes.
  • Apakah saya memerlukan semua Ops dalam model yang didukung untuk menjalankan delegasi?
    • Tidak, Model akan dipartisi menjadi subgraf berdasarkan operasi yang didukung. Operasi apa pun yang tidak didukung akan berjalan di CPU.
  • Bagaimana saya bisa membangun AAR delegasi Hexagon dari sumber?
    • Gunakan bazel build -c opt --config=android_arm64 tensorflow/lite/delegates/hexagon/java:tensorflow-lite-hexagon .
  • Mengapa delegasi Hexagon gagal untuk menginisialisasi meskipun perangkat Android saya memiliki SoC yang didukung?
    • Verifikasi apakah perangkat Anda memang memiliki SoC yang didukung. Jalankan adb shell cat /proc/cpuinfo | grep Hardware dan lihat apakah itu mengembalikan sesuatu seperti "Hardware : Qualcomm Technologies, Inc MSMXXXX".
    • Beberapa produsen ponsel menggunakan SoC yang berbeda untuk model ponsel yang sama. Oleh karena itu, delegasi Hexagon hanya dapat bekerja pada beberapa tetapi tidak semua perangkat dengan model telepon yang sama.
    • Beberapa produsen ponsel sengaja membatasi penggunaan Hexagon DSP dari aplikasi Android non-sistem, membuat delegasi Hexagon tidak dapat bekerja.
  • Ponsel saya telah mengunci akses DSP. Saya melakukan root pada telepon dan masih tidak dapat menjalankan delegasi, apa yang harus dilakukan?
    • Pastikan untuk menonaktifkan SELinux menegakkan dengan menjalankan adb shell setenforce 0