TensorFlow Lite Hexagon temsilcisi

Bu belge, Java ve / veya C API kullanarak uygulamanızda TensorFlow Lite Hexagon Delegate'i nasıl kullanacağınızı açıklar. Temsilci, DSP'de nicelleştirilmiş çekirdekleri çalıştırmak için Qualcomm Hexagon kitaplığından yararlanır. Temsilcinin, özellikle NNAPI DSP hızlandırmanın mevcut olmadığı cihazlar için (örneğin, eski cihazlarda veya henüz bir DSP NNAPI sürücüsüne sahip olmayan cihazlarda) NNAPI işlevselliğini tamamlaması amaçlandığını unutmayın.

Desteklenen cihazlar:

Şu anda aşağıdaki Hexagon mimarisi, bunlarla sınırlı olmamak üzere desteklenmektedir:

  • Altıgen 680
    • SoC örnekleri: Snapdragon 821, 820, 660
  • Altıgen 682
    • SoC örnekleri: Snapdragon 835
  • Altıgen 685
    • SoC örnekleri: Snapdragon 845, Snapdragon 710, QCS605, QCS603
  • Altıgen 690
    • SoC örnekleri: Snapdragon 855, QCS610, QCS410, RB5

Desteklenen modeller:

Hexagon delegesi, eğitim sonrası tamsayı niceleme kullanılarak oluşturulanlar da dahil olmak üzere, 8 bitlik simetrik niceleme spesifikasyonumuza uyan tüm modelleri destekler. Eski nicelemeye duyarlı eğitim yolu ile eğitilmiş UInt8 modelleri de desteklenir, örneğin, Barındırılan Modeller sayfamızda bu nicelenmiş sürümler .

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

Örnek kullanım

1. Adım: Her gece Hexagon temsilcisi AAR'yi kullanmak için app / build.gradle'ı düzenleyin

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

Adım 2. Hexagon kitaplıklarını Android uygulamanıza ekleyin

  • Hexagon_nn_skel.run dosyasını indirin ve çalıştırın. "Libhexagon_nn_skel.so", "libhexagon_nn_skel_v65.so", "libhexagon_nn_skel_v66.so" adlı 3 farklı paylaşılan kitaplık sağlamalıdır.
  • Diğer paylaşılan kitaplıklarla birlikte uygulamanıza 3'ünü de dahil edin. Uygulamanıza paylaşılan kitaplık ekleme konusuna bakın. Delege, cihaza bağlı olarak en iyi performansa sahip olanı otomatik olarak seçecektir.

Adım 3. Bir temsilci oluşturun ve bir TensorFlow Lite Yorumlayıcıyı başlatın

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

Altıgen temsilci C API'si

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

Örnek kullanım

1. Adım: Her gece Hexagon temsilcisi AAR'yi kullanmak için app / build.gradle'ı düzenleyin

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

Adım 2. Hexagon kitaplıklarını Android uygulamanıza ekleyin

  • Hexagon_nn_skel.run dosyasını indirin ve çalıştırın. "Libhexagon_nn_skel.so", "libhexagon_nn_skel_v65.so", "libhexagon_nn_skel_v66.so" adlı 3 farklı paylaşılan kitaplık sağlamalıdır.
  • 3'ünü de diğer paylaşılan kitaplıklarla birlikte uygulamanıza dahil edin. Uygulamanıza paylaşılan kitaplık ekleme konusuna bakın. Delege, cihaza bağlı olarak en iyi performansı gösteren kişiyi otomatik olarak seçecektir.

Adım 3. C başlığını ekleyin

  • "Hexagon_delegate.h" başlık dosyası GitHub'dan indirilebilir veya Hexagon delege AAR'dan çıkarılabilir.

Adım 4. Bir temsilci oluşturun ve bir TensorFlow Lite Yorumlayıcıyı başlatın

  • Kodunuzda yerel Hexagon kitaplığının yüklendiğinden emin olun. Bu, System.loadLibrary("tensorflowlite_hexagon_jni");
    Etkinlik veya Java giriş noktanızda.

  • Bir temsilci oluşturun, örnek:

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

Paylaşılan kitaplığı uygulamanıza ekleyin

  • "App / src / main / jniLibs" klasörünü oluşturun ve her hedef mimari için bir dizin oluşturun. Örneğin,
    • ARM 64-bit: app/src/main/jniLibs/arm64-v8a
    • ARM 32 bit: app/src/main/jniLibs/armeabi-v7a
  • .So dosyanızı mimariyle eşleşen dizine koyun.

geri bildirim

Sorunlar için lütfen kullanılan telefon modeli ve kullanılan anakart ( adb shell getprop ro.product.device ve adb shell getprop ro.board.platform ) dahil olmak üzere tüm gerekli repro ayrıntılarıyla bir GitHub sorunu oluşturun.

SSS

  • Temsilci tarafından hangi operasyonlar destekleniyor?
  • Temsilciyi etkinleştirdiğimde modelin DSP'yi kullandığını nasıl anlarım?
    • Temsilciyi etkinleştirdiğinizde, biri temsilcinin oluşturulup oluşturulmadığını, diğeri de temsilciyi kullanarak kaç düğümün çalıştığını belirtmek için iki günlük mesajı yazdırılacaktır.
      Created TensorFlow Lite delegate for Hexagon.
      Hexagon delegate: X nodes delegated out of Y nodes.
  • Temsilciyi çalıştırmak için modeldeki tüm Operatörlerin desteklenmesine ihtiyacım var mı?
    • Hayır, Model desteklenen operasyonlara göre alt grafiklere bölünecektir. Desteklenmeyen operasyonlar CPU üzerinde çalışacaktır.
  • Hexagon delege AAR'yi kaynaktan nasıl oluşturabilirim?
    • bazel build -c opt --config=android_arm64 tensorflow/lite/delegates/hexagon/java:tensorflow-lite-hexagon .
  • Hexagon temsilcisi, Android cihazımın desteklenen bir SoC'ye sahip olmasına rağmen neden başlatılamıyor?
    • Cihazınızın gerçekten desteklenen bir SoC'ye sahip olup olmadığını doğrulayın. adb shell cat /proc/cpuinfo | grep Hardware ve "Hardware: Qualcomm Technologies, Inc MSMXXXX" gibi bir şey döndürüp döndürmediğine bakın.
    • Bazı telefon üreticileri aynı telefon modeli için farklı SoC'ler kullanır. Bu nedenle, Hexagon temsilcisi, aynı telefon modelinin tüm cihazlarında değil, yalnızca bazılarında çalışabilir.
    • Bazı telefon üreticileri, Hexagon DSP'nin sistem dışı Android uygulamalarından kullanımını kasıtlı olarak kısıtlayarak Hexagon delegesini çalışamaz hale getirir.
  • Telefonum DSP erişimini kilitledi. Telefonu köklendirdim ve hala temsilciyi çalıştıramıyorum, ne yapmalı?
    • adb shell setenforce 0 çalıştırarak SELinux uygulamasını devre dışı bıraktığınızdan emin olun.