مندوب TensorFlow Lite Hexagon، مندوب TensorFlow Lite Hexagon

يشرح هذا المستند كيفية استخدام TensorFlow Lite Hexagon Delegate في تطبيقك باستخدام Java و/أو C API. يستفيد المندوب من مكتبة Qualcomm Hexagon لتنفيذ حبات كمية على DSP. لاحظ أن المفوض يهدف إلى استكمال وظيفة NNAPI، خاصة للأجهزة التي لا يتوفر فيها تسريع NNAPI DSP (على سبيل المثال، على الأجهزة القديمة، أو الأجهزة التي لا تحتوي على برنامج تشغيل DSP NNAPI حتى الآن).

اجهزة مدعومة:

يتم حاليًا دعم البنية السداسية التالية، بما في ذلك على سبيل المثال لا الحصر:

  • مسدس 680
    • أمثلة على شركة نفط الجنوب: Snapdragon 821، 820، 660
  • السداسي 682
    • أمثلة على شركة نفط الجنوب: Snapdragon 835
  • السداسي 685
    • أمثلة على SoC: Snapdragon 845، Snapdragon 710، QCS410، QCS610، QCS605، QCS603
  • مسدس 690
    • أمثلة على شركة نفط الجنوب: Snapdragon 855، RB5

النماذج المدعومة:

يدعم مندوب Hexagon جميع النماذج التي تتوافق مع مواصفات التكميم المتماثل 8 بت لدينا، بما في ذلك تلك التي تم إنشاؤها باستخدام التكميم الصحيح بعد التدريب . يتم أيضًا دعم نماذج UInt8 التي تم تدريبها باستخدام مسار التدريب القديم المدرك للتكميم ، على سبيل المثال، هذه الإصدارات الكمية على صفحة النماذج المستضافة لدينا.

مندوب مسدس جافا 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();
}

استخدام المثال

الخطوة 1. قم بتحرير app/build.gradle لاستخدام مندوب Hexagon الليلي AAR

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

الخطوة 2. أضف مكتبات Hexagon إلى تطبيق Android الخاص بك

  • قم بتنزيل وتشغيل hexagon_nn_skel.run. يجب أن توفر 3 مكتبات مشتركة مختلفة "libhexagon_nn_skel.so"، "libhexagon_nn_skel_v65.so"، "libhexagon_nn_skel_v66.so"

الخطوة 3. قم بإنشاء مفوض وتهيئة مترجم 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();
}

واجهة برمجة تطبيقات مندوب السداسي C

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

استخدام المثال

الخطوة 1. قم بتحرير app/build.gradle لاستخدام مندوب Hexagon الليلي AAR

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

الخطوة 2. أضف مكتبات Hexagon إلى تطبيق Android الخاص بك

  • قم بتنزيل وتشغيل hexagon_nn_skel.run. يجب أن توفر 3 مكتبات مشتركة مختلفة "libhexagon_nn_skel.so"، "libhexagon_nn_skel_v65.so"، "libhexagon_nn_skel_v66.so"

الخطوة 3. قم بتضمين رأس C

  • يمكن تنزيل ملف الرأس "hexagon_delegate.h" من GitHub أو استخراجه من مندوب Hexagon AAR.

الخطوة 4. قم بإنشاء مندوب وتهيئة مترجم TensorFlow Lite

  • في التعليمات البرمجية الخاصة بك، تأكد من تحميل مكتبة Hexagon الأصلية. يمكن القيام بذلك عن طريق استدعاء System.loadLibrary("tensorflowlite_hexagon_jni");
    في نشاطك أو نقطة دخول Java.

  • إنشاء مندوب، مثال:

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

أضف المكتبة المشتركة إلى تطبيقك

  • قم بإنشاء مجلد "app/src/main/jniLibs"، وقم بإنشاء دليل لكل بنية مستهدفة. على سبيل المثال،
    • أرم 64 بت: app/src/main/jniLibs/arm64-v8a
    • ARM 32 بت: app/src/main/jniLibs/armeabi-v7a
  • ضع .so في الدليل الذي يطابق البنية.

تعليق

بالنسبة للمشكلات، يرجى إنشاء مشكلة GitHub مع جميع تفاصيل النسخ الضرورية، بما في ذلك طراز الهاتف واللوحة المستخدمة ( adb shell getprop ro.product.device و adb shell getprop ro.board.platform ).

التعليمات

  • ما هي العمليات التي يدعمها المندوب؟
  • كيف يمكنني معرفة أن النموذج يستخدم DSP عندما أقوم بتمكين المفوض؟
    • ستتم طباعة رسالتين للسجل عندما تقوم بتمكين المفوض - إحداهما للإشارة إلى ما إذا كان قد تم إنشاء المفوض والأخرى للإشارة إلى عدد العقد التي تعمل باستخدام المفوض.
      Created TensorFlow Lite delegate for Hexagon.
      Hexagon delegate: X nodes delegated out of Y nodes.
  • هل أحتاج إلى دعم جميع العمليات في النموذج لتشغيل المفوض؟
    • لا، سيتم تقسيم النموذج إلى رسوم بيانية فرعية بناءً على العمليات المدعومة. سيتم تشغيل أي عمليات غير مدعومة على وحدة المعالجة المركزية.
  • كيف يمكنني بناء مندوب Hexagon AAR من المصدر؟
    • استخدم bazel build -c opt --config=android_arm64 tensorflow/lite/delegates/hexagon/java:tensorflow-lite-hexagon .
  • لماذا يفشل مندوب Hexagon في التهيئة على الرغم من أن جهاز Android الخاص بي يحتوي على SoC مدعوم؟
    • تحقق مما إذا كان جهازك يحتوي بالفعل على SoC مدعوم. قم بتشغيل adb shell cat /proc/cpuinfo | grep Hardware ومعرفة ما إذا كانت تُرجع شيئًا مثل "Hardware : Qualcomm Technologies, Inc MSMXXXX".
    • تستخدم بعض الشركات المصنعة للهواتف شرائح SoC مختلفة لنفس طراز الهاتف. لذلك، قد يعمل مندوب Hexagon فقط على بعض الأجهزة من نفس طراز الهاتف وليس جميعها.
    • تقوم بعض الشركات المصنعة للهواتف عمدًا بتقييد استخدام Hexagon DSP من تطبيقات Android غير التابعة للنظام، مما يجعل مندوب Hexagon غير قادر على العمل.
  • لقد قام هاتفي بتأمين الوصول إلى DSP. لقد قمت بتجذير الهاتف وما زلت لا أستطيع تشغيل المندوب، ماذا أفعل؟
    • تأكد من تعطيل فرض SELinux عن طريق تشغيل adb shell setenforce 0