قياس الأداء

أدوات قياس الأداء

تقيس أدوات قياس الأداء في LiteRT وتحسب حاليًا إحصاءات مقاييس الأداء المهمة التالية:

  • وقت الإعداد
  • وقت الاستنتاج في حالة الإحماء
  • وقت الاستنتاج في الحالة الثابتة
  • استخدام الذاكرة أثناء وقت الإعداد
  • الاستخدام العام للذاكرة

تتوفّر أدوات قياس الأداء كالتطبيقات المرجعية لنظامَي التشغيل Android وiOS، وكملفات ثنائية مسبقة الإنشاء تعمل من سطر الأوامر، وتتشارك جميعها منطق قياس الأداء الأساسي نفسه. يُرجى العِلم أنّ الخيارات المتاحة وتنسيقات الإخراج تختلف قليلاً بسبب الاختلافات في بيئة وقت التشغيل.

ملف ثنائي معياري مُنشأ مسبقًا (باستخدام CompiledModel API)

تتوفّر طريقتان لاستخدام أداة قياس الأداء على Android. أحدهما ثنائي معياري أصلي (يستند إلى CompiledModel API)، والآخر تطبيق معياري لنظام Android (يستند إلى Interpreter API). يتم توفير أداة قياس الأداء في LiteRT كملف ثنائي مضمَّن benchmark_model. يمكنك تنفيذ هذه الأداة من سطر أوامر shell على أنظمة التشغيل Linux وmacOS وWindows وRaspberry Pi والأجهزة المضمّنة وأجهزة Android التي تم تفعيل ميزة تسريع معالجة الرسومات فيها.

تنزيل أو إنشاء الرمز الثنائي

نزِّل ملفات ثنائية مُنشأة مسبقًا لسطر الأوامر من خلال اتّباع الروابط التالية:

يمكنك أيضًا إنشاء الرمز الثنائي الخاص بمقياس الأداء من المصدر على جهاز الكمبيوتر.

bazel build -c opt //litert/tools:benchmark_model

لإنشاء تطبيق باستخدام مجموعة أدوات Android NDK، عليك أولاً إعداد بيئة الإنشاء باتّباع هذا الدليل، أو استخدام صورة Docker كما هو موضّح في هذا الدليل.

bazel build -c opt --config=android_arm64 \
  //litert/tools:benchmark_model

تنفيذ مقياس الأداء

لتشغيل مقاييس الأداء على الكمبيوتر، نفِّذ الملف الثنائي من واجهة الأوامر.

path/to/downloaded_or_built/benchmark_model \
  --graph=your_model.tflite \
  --num_threads=4

يمكنك استخدام مجموعة المَعلمات نفسها المذكورة سابقًا مع ملف ثنائي مُنشأ مسبقًا لسطر الأوامر.

مسرّع وحدة معالجة الرسومات

تتضمّن هذه الملفات الثنائية المُنشأة مسبقًا أداة تسريع جديدة لوحدة معالجة الرسومات (GPU) في LiteRT. يتوافق مع OpenCL وWebGPU المستند إلى Vulkan (على Linux) وMetal (على MacOS) وDirect3D (على Windows).

لاستخدام مسرِّع وحدة معالجة الرسومات، مرِّر العلامة --use_gpu=true.

عمليات نموذج الملف الشخصي

يتيح لك ملف ثنائي لنموذج قياسي أيضًا إنشاء ملف تعريف لعمليات النموذج والحصول على أوقات التنفيذ لكل عامل تشغيل. لإجراء ذلك، مرِّر العلامة --use_profiler=true إلى benchmark_model أثناء الاستدعاء.

تطبيق قياس أداء Android (باستخدام Interpreter API)

يتوفّر أيضًا تطبيق قياس أداء على Android يستند إلى الإصدار 1 من واجهة برمجة التطبيقات Interpreter API. ويُعدّ هذا المقياس أفضل لتحديد مستوى أداء النموذج في تطبيق Android، مع العلم أنّ الأرقام التي تقدّمها أداة قياس الأداء ستظل تختلف قليلاً عن الأرقام التي يتم الحصول عليها عند تنفيذ الاستدلال باستخدام النموذج في التطبيق الفعلي.

لا يحتوي تطبيق قياس الأداء على Android هذا على واجهة مستخدم. ثبِّت الأداة وشغِّلها باستخدام الأمر adb واستردّ النتائج باستخدام الأمر adb logcat.

تنزيل التطبيق أو إنشاؤه

يمكنك تنزيل تطبيقات قياس أداء Android المسبقة الإنشاء التي يتم إصدارها كل ليلة باستخدام الروابط التالية:

بالنسبة إلى تطبيقات قياس الأداء على Android التي تتوافق مع عمليات TensorFlow من خلال Flex delegate، استخدِم الروابط أدناه:

يمكنك أيضًا إنشاء التطبيق من المصدر باتّباع هذه التعليمات.

إعداد مقياس الأداء

قبل تشغيل تطبيق قياس الأداء، ثبِّت التطبيق وادفع ملف النموذج إلى الجهاز على النحو التالي:

adb install -r -d -g android_aarch64_benchmark_model.apk
adb push your_model.tflite /data/local/tmp

تنفيذ مقياس الأداء

adb shell am start -S \
  -n org.tensorflow.lite.benchmark/.BenchmarkModelActivity \
  --es args '"--graph=/data/local/tmp/your_model.tflite \
              --num_threads=4"'

graph هي مَعلمة مطلوبة.

  • graph: string
    مسار ملف نموذج TFLite.

يمكنك تحديد المزيد من المَعلمات الاختيارية لتشغيل مقياس الأداء.

  • num_threads: int (القيمة التلقائية هي 1)
    عدد سلاسل المحادثات التي سيتم استخدامها لتشغيل برنامج TFLite.
  • use_gpu: bool (القيمة التلقائية هي false)
    يتم استخدام مفوّض وحدة معالجة الرسومات.
  • use_xnnpack: bool (القيمة التلقائية=false)
    استخدام مفوّض XNNPACK

قد لا تتوفّر بعض هذه الخيارات أو قد لا يكون لها أي تأثير حسب الجهاز الذي تستخدمه. راجِع المَعلمات للحصول على المزيد من مَعلمات الأداء التي يمكنك تنفيذها باستخدام تطبيق قياس الأداء.

اطّلِع على النتائج باستخدام الأمر logcat:

adb logcat | grep "Inference timings"

يتم عرض نتائج مقياس الأداء على النحو التالي:

... tflite  : Inference timings in us: Init: 5685, First inference: 18535, Warmup (avg): 14462.3, Inference (avg): 14575.2

تطبيق قياس الأداء على iOS

لتشغيل مقاييس الأداء على جهاز iOS، عليك إنشاء التطبيق من المصدر. ضَع ملف نموذج LiteRT في الدليل benchmark_data لشجرة المصدر وعدِّل الملف benchmark_params.json. يتم تجميع هذه الملفات في التطبيق، ويقرأ التطبيق البيانات من الدليل. انتقِل إلى تطبيق قياس الأداء على iOS للحصول على تعليمات مفصّلة.

مقاييس الأداء للنماذج المعروفة

يسرد هذا القسم مقاييس أداء LiteRT عند تشغيل نماذج معروفة على بعض أجهزة Android وiOS.

مقاييس أداء Android

تم إنشاء أرقام مقياس الأداء هذه باستخدام ملف ثنائي أصلي لمقياس الأداء.

بالنسبة إلى مقاييس الأداء على Android، يتم ضبط تقارب وحدة المعالجة المركزية (CPU) لاستخدام النوى الكبيرة على الجهاز للحد من التباين (راجِع التفاصيل).

ويفترض أنّه تم تنزيل النماذج وفك ضغطها في الدليل /data/local/tmp/tflite_models. يتم إنشاء الرمز الثنائي الخاص بمقياس الأداء باستخدام هذه التعليمات ويُفترض أن يكون في الدليل /data/local/tmp.

لإجراء قياس الأداء، اتّبِع الخطوات التالية:

adb shell /data/local/tmp/benchmark_model \
  --num_threads=4 \
  --graph=/data/local/tmp/tflite_models/${GRAPH} \
  --warmup_runs=1 \
  --num_runs=50

للتشغيل باستخدام وحدة معالجة الرسومات، اضبط --use_gpu=true.

يتم قياس قيم الأداء أدناه على نظام التشغيل Android 10.

اسم النموذج الجهاز وحدة معالجة مركزية (CPU) بها 4 سلاسل محادثات وحدة معالجة الرسومات
Mobilenet_1.0_224(float) Pixel 3 ‫23.9 ملي ثانية ‫6.45 ملي ثانية
Pixel 4 ‫14.0 ملي ثانية ‫9.0 ملي ثانية
Mobilenet_1.0_224 (quant) Pixel 3 ‫13.4 ملي ثانية ---
Pixel 4 ‫5.0 ملي ثانية ---
NASNet mobile Pixel 3 ‫56 ملي ثانية ---
Pixel 4 ‫34.5 ملي ثانية ---
SqueezeNet Pixel 3 ‫35.8 ملي ثانية ‫9.5 ملي ثانية
Pixel 4 ‫23.9 ملي ثانية ‫11.1 ملي ثانية
Inception_ResNet_V2 Pixel 3 ‫422 ملي ثانية ‫99.8 ملي ثانية
Pixel 4 ‫272.6 ملي ثانية ‫87.2 ملي ثانية
Inception_V4 Pixel 3 ‫486 ملي ثانية ‫93 ملي ثانية
Pixel 4 ‫324.1 ملي ثانية ‫97.6 ملي ثانية

مقاييس الأداء على أجهزة iOS

تم إنشاء أرقام مقياس الأداء هذه باستخدام تطبيق مقياس الأداء على iOS.

لتنفيذ مقاييس أداء على أجهزة iOS، تم تعديل تطبيق قياس الأداء ليشمل الطراز المناسب، وتم تعديل benchmark_params.json لضبط num_threads على 2. لاستخدام مفوّض وحدة معالجة الرسومات، تمت إضافة الخيارَين "use_gpu" : "1" و"gpu_wait_type" : "aggressive" أيضًا إلى benchmark_params.json.

اسم النموذج الجهاز وحدة معالجة مركزية (CPU) بها خيطا تنفيذ وحدة معالجة الرسومات
Mobilenet_1.0_224(float) iPhone XS ‫14.8 ملي ثانية ‫3.4 ملي ثانية
Mobilenet_1.0_224 (quant) iPhone XS ‫11 ملي ثانية ---
NASNet mobile iPhone XS ‫30.4 ملي ثانية ---
SqueezeNet iPhone XS ‫21.1 ملي ثانية ‫15.5 ملي ثانية
Inception_ResNet_V2 iPhone XS ‫261.1 ملي ثانية ‫45.7 ملي ثانية
Inception_V4 iPhone XS ‫309 ملي ثانية ‫54.4 ملي ثانية

التفاصيل الداخلية لـ Trace LiteRT

تتبُّع الأجزاء الداخلية من LiteRT في Android

يمكن لأدوات تتبُّع Android تسجيل الأحداث الداخلية من مفسّر LiteRT لتطبيق Android. وهي الأحداث نفسها التي يتم تسجيلها باستخدام واجهة برمجة التطبيقات Trace في Android، لذا تظهر الأحداث التي تم تسجيلها من رمز Java/Kotlin معًا مع الأحداث الداخلية في LiteRT.

في ما يلي بعض الأمثلة على الأحداث:

  • استدعاء المشغّل
  • تعديل الرسم البياني من قِبل مستخدم مفوَّض
  • تخصيص المتّجه

من بين الخيارات المختلفة لتسجيل عمليات التتبُّع، يغطّي هذا الدليل أداة "محلّل استخدام وحدة المعالجة المركزية" في Android Studio وتطبيق "تتبُّع النظام". يُرجى الرجوع إلى أداة Perfetto لسطر الأوامر أو أداة Systrace لسطر الأوامر للاطّلاع على خيارات أخرى.

إضافة أحداث التتبُّع في رمز Java

هذا مقتطف رمز من تطبيق تصنيف الصور المثالي. يتم تشغيل مترجم LiteRT في القسم recognizeImage/runInference. هذه الخطوة اختيارية، ولكنّها مفيدة للمساعدة في تحديد مكان إجراء طلب الاستنتاج.

  Trace.beginSection("recognizeImage");
  ...
  // Runs the inference call.
  Trace.beginSection("runInference");
  tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
  Trace.endSection();
  ...
  Trace.endSection();

تفعيل تتبُّع LiteRT

لتفعيل تتبُّع LiteRT، اضبط سمة نظام Android debug.tflite.trace على 1 قبل بدء تطبيق Android.

adb shell setprop debug.tflite.trace 1

إذا تم ضبط هذه السمة عند بدء تشغيل برنامج LiteRT، سيتم تتبُّع الأحداث الرئيسية (مثل استدعاء المشغّل) من البرنامج.

بعد تسجيل جميع عمليات التتبُّع، أوقِف التتبُّع من خلال ضبط قيمة السمة على 0.

adb shell setprop debug.tflite.trace 0

أداة "محلّل وحدة المعالجة المركزية" في "استوديو Android"

يمكنك تسجيل عمليات التتبُّع باستخدام أداة تحليل وحدة المعالجة المركزية في "استوديو Android" باتّباع الخطوات التالية:

  1. انقر على تشغيل (Run) > إنشاء ملف شخصي للتطبيق (Profile 'app') من القوائم العلوية.

  2. انقر في أي مكان في المخطط الزمني لوحدة المعالجة المركزية (CPU) عند ظهور نافذة Profiler.

  3. اختَر "تتبُّع طلبات النظام" من بين أوضاع "تحليل أداء وحدة المعالجة المركزية".

    اختَر "تتبُّع طلبات النظام".

  4. اضغط على زر "تسجيل".

  5. اضغط على زر "إيقاف".

  6. تحقَّق من نتيجة التتبُّع.

    تتبُّع "استوديو Android"

في هذا المثال، يمكنك الاطّلاع على التسلسل الهرمي للأحداث في سلسلة محادثات والإحصاءات الخاصة بكل وقت تشغيل، كما يمكنك الاطّلاع على تدفق البيانات للتطبيق بأكمله بين سلاسل المحادثات.

تطبيق "تتبُّع النظام"

يمكنك تسجيل عمليات التتبُّع بدون "استوديو Android" باتّباع الخطوات الموضّحة بالتفصيل في تطبيق "تتبُّع النظام".

في هذا المثال، تم تسجيل أحداث TFLite نفسها وحفظها بتنسيق Perfetto أو Systrace استنادًا إلى إصدار جهاز Android. يمكن فتح ملفات بيانات التتبُّع التي تم تسجيلها في واجهة مستخدم Perfetto.

تتبُّع Perfetto

تتبُّع الأجزاء الداخلية من Trace LiteRT في iOS

يمكن تسجيل الأحداث الداخلية من برنامج LiteRT لتفسير تطبيقات iOS باستخدام أداة Instruments المضمّنة في Xcode. وهي أحداث signpost في نظام التشغيل iOS، لذا تظهر الأحداث التي تم تسجيلها من رمز Swift/Objective-C معًا مع الأحداث الداخلية في LiteRT.

في ما يلي بعض الأمثلة على الأحداث:

  • استدعاء المشغّل
  • تعديل الرسم البياني من قِبل مستخدم مفوَّض
  • تخصيص المتّجه

تفعيل تتبُّع LiteRT

اضبط متغيّر البيئة debug.tflite.trace باتّباع الخطوات التالية:

  1. انقر على المنتج (Product) > المخطّط (Scheme) > تعديل المخطّط… (Edit Scheme…‎) من القوائم العلوية في Xcode.

  2. انقر على "الملف الشخصي" في اللوحة اليمنى.

  3. ألغِ تحديد مربّع الاختيار "استخدام وسيطات إجراء التشغيل ومتغيّرات البيئة".

  4. أضِف debug.tflite.trace ضمن قسم "متغيّرات البيئة".

    ضبط متغيّر البيئة

إذا كنت تريد استبعاد أحداث LiteRT عند إنشاء ملف تعريف لتطبيق iOS، عليك إيقاف التتبُّع من خلال إزالة متغيّر البيئة.

XCode Instruments

يمكنك تسجيل عمليات التتبُّع باتّباع الخطوات التالية:

  1. انقر على المنتج (Product) > الملف الشخصي (Profile) من القوائم العلوية في Xcode.

  2. انقر على تسجيل البيانات ضمن نماذج إنشاء الملفات الشخصية عند تشغيل أداة Instruments.

  3. اضغط على زر "بدء".

  4. اضغط على زر "إيقاف".

  5. انقر على os_signpost لتوسيع عناصر نظام التسجيل الفرعي لنظام التشغيل.

  6. انقر على نظام التسجيل الفرعي لنظام التشغيل "org.tensorflow.lite".

  7. تحقَّق من نتيجة التتبُّع.

    تتبُّع Xcode Instruments

في هذا المثال، يمكنك الاطّلاع على التسلسل الهرمي للأحداث والإحصاءات الخاصة بكل وقت تشغيل.

استخدام بيانات التتبُّع

تتيح لك بيانات التتبُّع تحديد المؤثّرات السلبية في الأداء.

في ما يلي بعض الأمثلة على الإحصاءات التي يمكنك الحصول عليها من أداة Profiler والحلول المحتملة لتحسين الأداء:

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