Delegasi TensorFlow Lite Hexagon, delegasi TensorFlow Lite Hexagon

Dokumen ini menjelaskan cara menggunakan Delegasi Hexagon TensorFlow Lite di aplikasi Anda menggunakan Java dan/atau C API. Delegasi memanfaatkan perpustakaan Qualcomm Hexagon untuk mengeksekusi kernel terkuantisasi pada DSP. Perhatikan bahwa delegasi ini dimaksudkan untuk melengkapi fungsionalitas NNAPI, khususnya untuk perangkat yang akselerasi DSP NNAPI tidak tersedia (misalnya, pada perangkat 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 model 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 Dihosting.

Hexagon mendelegasikan 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 AAR delegasi Hexagon malam hari

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

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 AAR delegasi Hexagon malam hari

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. Ini 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 TensorFlow Lite Interpreter

  • Dalam kode Anda, pastikan pustaka Hexagon asli dimuat. Hal ini dapat dilakukan dengan memanggil System.loadLibrary("tensorflowlite_hexagon_jni");
    di Aktivitas atau titik masuk 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 your use case requires resizing the input or anything that can trigger
// re-applying delegates then 'delegate_ptr' must 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. Misalnya,
    • 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 ponsel dan papan yang digunakan ( adb shell getprop ro.product.device dan adb shell getprop ro.board.platform ).

Pertanyaan Umum

  • Operasi mana yang didukung oleh delegasi?
  • Bagaimana cara mengetahui 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 tersebut.
      Created TensorFlow Lite delegate for Hexagon.
      Hexagon delegate: X nodes delegated out of Y nodes.
  • Apakah saya memerlukan semua Operasi dalam model untuk 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 cara membuat 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 melakukan inisialisasi 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 ia mengembalikan sesuatu seperti "Hardware: Qualcomm Technologies, Inc MSMXXXX".
    • Beberapa produsen ponsel menggunakan SoC berbeda untuk model ponsel yang sama. Oleh karena itu, delegasi Hexagon hanya dapat berfungsi pada beberapa tetapi tidak semua perangkat dengan model ponsel yang sama.
    • Beberapa produsen ponsel sengaja membatasi penggunaan Hexagon DSP dari aplikasi Android non-sistem, sehingga delegasi Hexagon tidak dapat bekerja.
  • Ponsel saya telah mengunci akses DSP. Saya telah melakukan root pada ponsel dan masih tidak dapat menjalankan delegasi, apa yang harus saya lakukan?
    • Pastikan untuk menonaktifkan penerapan SELinux dengan menjalankan adb shell setenforce 0