يعود مؤتمر Google I / O من 18 إلى 20 مايو! حجز مساحة وبناء الجدول الزمني الخاص بك سجل الآن

مندوب TensorFlow Lite NNAPI

يتوفر Android Neural Networks API (NNAPI) على جميع أجهزة Android التي تعمل بنظام Android 8.1 (مستوى API 27) أو أعلى. يوفر تسريعًا لنماذج TensorFlow Lite على أجهزة Android مع مسرعات الأجهزة المدعومة بما في ذلك:

  • وحدة معالجة الرسومات (GPU)
  • معالج الإشارة الرقمية (DSP)
  • وحدة المعالجة العصبية (NPU)

سيختلف الأداء اعتمادًا على الأجهزة المحددة المتوفرة على الجهاز.

تصف هذه الصفحة كيفية استخدام مندوب NNAPI مع مترجم TensorFlow Lite في Java و Kotlin. بالنسبة لواجهات برمجة تطبيقات Android C ، يرجى الرجوع إلى وثائق Android Native Developer Kit .

تجربة مندوب NNAPI على الطراز الخاص بك

استيراد Gradle

مندوب NNAPI هو جزء من مترجم TensorFlow Lite Android ، الإصدار 1.14.0 أو أعلى. يمكنك استيراده إلى مشروعك عن طريق إضافة ما يلي إلى ملف gradle للوحدة النمطية الخاص بك:

dependencies {
   implementation 'org.tensorflow:tensorflow-lite:2.0.0'
}

تهيئة مفوض NNAPI

أضف الكود لتهيئة مفوض NNAPI قبل تهيئة مترجم TensorFlow Lite.

import org.tensorflow.lite.Interpreter;
import org.tensorflow.lite.nnapi.NnApiDelegate;

Interpreter.Options options = (new Interpreter.Options());
NnApiDelegate nnApiDelegate = null;
// Initialize interpreter with NNAPI delegate for Android Pie or above
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    nnApiDelegate = new NnApiDelegate();
    options.addDelegate(nnApiDelegate);
}

// Initialize TFLite interpreter
try {
    tfLite = new Interpreter(loadModelFile(assetManager, modelFilename), options);
} catch (Exception e) {
    throw new RuntimeException(e);
}

// Run inference
// ...

// Unload delegate
tfLite.close();
if(null != nnApiDelegate) {
    nnApiDelegate.close();
}

أفضل الممارسات

اختبار الأداء قبل النشر

يمكن أن يختلف أداء وقت التشغيل بشكل كبير بسبب بنية النموذج والحجم والعمليات وتوافر الأجهزة واستخدام الأجهزة في وقت التشغيل. على سبيل المثال ، إذا كان التطبيق يستخدم بشكل كبير وحدة معالجة الرسومات للعرض ، فقد لا يؤدي تسريع NNAPI إلى تحسين الأداء بسبب التنازع على الموارد. نوصي بإجراء اختبار أداء بسيط باستخدام مسجل التصحيح لقياس وقت الاستدلال. قم بإجراء الاختبار على العديد من الهواتف التي تحتوي على مجموعات شرائح مختلفة (الشركة المصنعة أو الطرز من نفس الشركة المصنعة) التي تمثل قاعدة المستخدمين قبل تمكين NNAPI في الإنتاج.

للمطورين المتقدمين ، يقدم TensorFlow Lite أيضًا أداة قياس نموذجية لنظام Android .

أنشئ قائمة استبعاد للأجهزة

في الإنتاج ، قد تكون هناك حالات لا يعمل فيها NNAPI بالشكل المتوقع. نوصي المطورين بالاحتفاظ بقائمة من الأجهزة التي يجب ألا تستخدم تسريع NNAPI مع طرز معينة. يمكنك إنشاء هذه القائمة بناءً على قيمة "ro.board.platform" ، والتي يمكنك استردادها باستخدام مقتطف الشفرة التالي:

String boardPlatform = "";

try {
    Process sysProcess =
        new ProcessBuilder("/system/bin/getprop", "ro.board.platform").
        redirectErrorStream(true).start();

    BufferedReader reader = new BufferedReader
        (new InputStreamReader(sysProcess.getInputStream()));
    String currentLine = null;

    while ((currentLine=reader.readLine()) != null){
        boardPlatform = line;
    }
    sysProcess.destroy();
} catch (IOException e) {}

Log.d("Board Platform", boardPlatform);

للمطورين المتقدمين ، ضع في اعتبارك الاحتفاظ بهذه القائمة عبر نظام تكوين عن بُعد. يعمل فريق TensorFlow بنشاط على طرق لتبسيط وأتمتة اكتشاف وتطبيق التكوين الأمثل NNAPI.

توضيح

يقلل التكميم حجم النموذج باستخدام أعداد صحيحة 8 بت أو عوامات 16 بت بدلاً من عوامات 32 بت للحساب. أحجام نماذج الأعداد الصحيحة 8 بت هي ربع إصدارات العائمة ذات 32 بت ؛ تعويم 16 بت نصف الحجم. يمكن أن يحسن التكميم الأداء بشكل كبير على الرغم من أن العملية يمكن أن تقايض بعض دقة النموذج.

هناك أنواع متعددة من تقنيات تكميم ما بعد التدريب المتاحة ، ولكن للحصول على أقصى دعم وتسريع للأجهزة الحالية ، نوصي بتكميم عدد صحيح كامل . يحول هذا الأسلوب الوزن والعمليات إلى أعداد صحيحة. تتطلب عملية التكميم هذه مجموعة بيانات تمثيلية للعمل.

استخدام النماذج والعمليات المدعومة

إذا كان مفوض NNAPI لا يدعم بعض العمليات أو مجموعات المعلمات في نموذج ، فإن إطار العمل يقوم فقط بتشغيل الأجزاء المدعومة من الرسم البياني في المسرع. يعمل الباقي على وحدة المعالجة المركزية ، مما يؤدي إلى تقسيم التنفيذ. نظرًا لارتفاع تكلفة مزامنة وحدة المعالجة المركزية / المسرع ، فقد يؤدي ذلك إلى أداء أبطأ من تنفيذ الشبكة بالكامل على وحدة المعالجة المركزية وحدها.

يعمل NNAPI بشكل أفضل عندما تستخدم الطرز العمليات المعتمدة فقط. من المعروف أن النماذج التالية متوافقة مع NNAPI:

لا يتم دعم تسريع NNAPI أيضًا عندما يحتوي النموذج على مخرجات ذات حجم ديناميكي. في هذه الحالة ، ستتلقى تحذيرًا مثل:

ERROR: Attempting to use a delegate that only supports static-sized tensors \
with a graph that has dynamic-sized tensors.

تفعيل تنفيذ NNAPI CPU

الرسم البياني الذي لا يمكن معالجته بالكامل بواسطة مسرّع يمكن أن يعود إلى تنفيذ NNAPI CPU. ومع ذلك ، نظرًا لأن هذا عادةً ما يكون أقل أداءً من مترجم TensorFlow ، يتم تعطيل هذا الخيار افتراضيًا في مندوب NNAPI لنظام Android 10 (مستوى API 29) أو أعلى. لتجاوز هذا السلوك ، قم بتعيين setUseNnapiCpu على true في كائن NnApiDelegate.Options .