מדידת ביצועים

כלי בנצ'מרק

כלי ההשוואה של TensorFlow Lite כיום מודדים ומחשבים נתונים סטטיסטיים עבור מדדי הביצועים החשובים הבאים:

  • זמן אתחול
  • זמן מסקנות של מצב חימום
  • זמן מסקנות של מצב יציב
  • שימוש בזיכרון בזמן האתחול
  • שימוש כללי בזיכרון

כלי ההשוואה זמינים כאפליקציות בנצ'מרק עבור אנדרואיד ו-iOS וכקבצים בינאריים של שורת פקודה מקוריים, וכולם חולקים את אותה היגיון ליבה למדידת ביצועים. שים לב שהאפשרויות הזמינות ותבניות הפלט שונות במקצת בגלל ההבדלים בסביבת זמן הריצה.

אפליקציית benchmark של אנדרואיד

ישנן שתי אפשרויות לשימוש בכלי ההשוואה עם אנדרואיד. אחת מהן בינארית בנצ'מרק מקורית ואחרת היא אפליקציית בנצ'מרק לאנדרואיד, מדד טוב יותר לביצועי המודל באפליקציה. כך או כך, המספרים מכלי הבנצ'מרק עדיין יהיו שונים במקצת מהמסק עם הדגם באפליקציה בפועל.

לאפליקציית הבנצ'מרק הזו לאנדרואיד אין ממשק משתמש. התקן והפעל אותו באמצעות פקודת adb ואחזר תוצאות באמצעות פקודת adb logcat .

הורד או בנה את האפליקציה

הורד את אפליקציות הבנצ'מרק הליליות שנבנו מראש לאנדרואיד באמצעות הקישורים למטה:

באשר לאפליקציות בנצ'מרק לאנדרואיד התומכות ב-TF ops באמצעות Flex delegate , השתמש בקישורים למטה:

אתה יכול גם לבנות את האפליקציה ממקור על ידי ביצוע הוראות אלה.

הכן benchmark

לפני הפעלת אפליקציית הבנצ'מרק, התקן את האפליקציה ודחף את קובץ הדגם למכשיר באופן הבא:

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

הפעל benchmark

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.

אתה יכול לציין פרמטרים אופציונליים נוספים להפעלת ה-benchmark.

  • num_threads : int (ברירת מחדל=1)
    מספר השרשורים לשימוש להפעלת מתורגמן TFLite.
  • use_gpu : bool (default=false)
    השתמש בנציג GPU .
  • use_nnapi : bool (default=false)
    השתמש בנציג NNAPI .
  • use_xnnpack : bool (default= false )
    השתמש בנציג XNNPACK .
  • use_hexagon : bool (default= false )
    השתמש בנציג משושה .

בהתאם למכשיר שבו אתה משתמש, ייתכן שחלק מהאפשרויות הללו לא יהיו זמינות או שלא ישפיעו. עיין בפרמטרים לפרמטרים נוספים של ביצועים שתוכל להפעיל עם אפליקציית ההשוואה.

הצג את התוצאות באמצעות הפקודה logcat :

adb logcat | grep "Inference timings"

תוצאות ההשוואה מדווחות כך:

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

Benchmark בינארי מקורי

כלי Benchmark מסופק גם בתור benchmark_model בינארי מקורי. אתה יכול להפעיל את הכלי הזה משורת פקודה של מעטפת ב-Linux, Mac, מכשירים משובצים ומכשירי אנדרואיד.

הורד או בנה את הבינארי

הורד את הקבצים הבינאריים של שורת הפקודה הלילית שנבנו מראש על ידי ביצוע הקישורים למטה:

לגבי קבצים בינאריים שנבנו מראש ליליים התומכים ב-TF ops באמצעות Flex delegate , השתמש בקישורים למטה:

כדי למדוד עם TensorFlow Lite Hexagon delegate , בנינו מראש גם את הקבצים הנדרשים libhexagon_interface.so (ראה כאן לפרטים על קובץ זה). לאחר הורדת הקובץ של הפלטפורמה המתאימה מהקישורים למטה, אנא שנה את שם הקובץ ל- libhexagon_interface.so .

אתה יכול גם לבנות את ה-Native benchmark בינארי ממקור במחשב שלך.

bazel build -c opt //tensorflow/lite/tools/benchmark:benchmark_model

כדי לבנות עם אנדרואיד NDK Toolchain, עליך להגדיר תחילה את סביבת הבנייה על ידי ביצוע מדריך זה, או להשתמש בתמונת docker כמתואר במדריך זה.

bazel build -c opt --config=android_arm64 \
  //tensorflow/lite/tools/benchmark:benchmark_model

הפעל benchmark

כדי להפעיל מדדים במחשב שלך, הפעל את הקובץ הבינארי מהמעטפת.

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

אתה יכול להשתמש באותה סט של פרמטרים כפי שהוזכר לעיל עם שורת הפקודה הבינארי המקורית.

אופציות של מודל פרופילים

המודל הבינארי של מודל ההשוואה מאפשר לך גם ליצור פרופיל אופציות של מודלים ולקבל את זמני הביצוע של כל מפעיל. כדי לעשות זאת, העבירו את הדגל --enable_op_profiling=true ל- benchmark_model במהלך הפנייה. פרטים מוסברים כאן .

Benchmark בינארי מקורי עבור אפשרויות ביצועים מרובות בהרצה אחת

בינארי C++ נוח ​​ופשוט מסופק גם כדי למדוד אפשרויות ביצועים מרובות בהפעלה אחת. בינארי זה בנוי על בסיס כלי ההשוואה שהוזכר לעיל שיכול היה לסמן רק אפשרות ביצועים בודדת בכל פעם. הם חולקים את אותו תהליך בנייה/התקנה/הפעלה, אבל שם היעד BUILD של הבינארי הזה הוא benchmark_model_performance_options והוא דורש כמה פרמטרים נוספים. פרמטר חשוב עבור בינארי זה הוא:

perf_options_list : string (default='all')
רשימה מופרדת בפסיקים של אפשרויות ביצועים של TFLite להשוואה.

אתה יכול לקבל מדי לילה בינאריים מובנים מראש עבור הכלי הזה, כמפורט להלן:

אפליקציית benchmark של iOS

כדי להפעיל מדדים במכשיר iOS, עליך לבנות את האפליקציה ממקור . שים את קובץ המודל TensorFlow Lite בספריית benchmark_data של עץ המקור ושנה את הקובץ benchmark_params.json . קבצים אלה נארזים באפליקציה והאפליקציה קוראת נתונים מהספרייה. בקר באפליקציית benchmark של iOS לקבלת הוראות מפורטות.

מדדי ביצועים עבור דגמים ידועים

סעיף זה מפרט את מדדי הביצועים של TensorFlow Lite בעת הפעלת דגמים ידועים בחלק ממכשירי Android ו- iOS.

מדדי ביצועים של אנדרואיד

מספרי השוואת ביצועים אלה נוצרו עם ה- Native Benchmark בינארי .

עבור מדדי אנדרואיד, זיקת ה-CPU מוגדרת להשתמש בליבות גדולות במכשיר כדי להפחית את השונות (ראה פרטים ).

היא מניחה שהמודלים הורדו ונפתחו לספריית /data/local/tmp/tflite_models . ה-Benchmark הבינארי נבנה באמצעות הוראות אלה , ובהנחה שהוא נמצא בספריית /data/local/tmp .

כדי להפעיל את ה-benchmark:

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

כדי להפעיל עם napi delegate, הגדר --use_nnapi=true . כדי להפעיל עם GPU Delegate, הגדר --use_gpu=true .

ערכי הביצועים שלהלן נמדדים באנדרואיד 10.

שם המודל התקן מעבד, 4 חוטים GPU NNAPI
Mobilenet_1.0_224(צף) פיקסל 3 23.9 אלפיות השנייה 6.45 אלפיות השנייה 13.8 אלפיות השנייה
פיקסל 4 14.0 אלפיות השנייה 9.0 אלפיות השנייה 14.8 אלפיות השנייה
Mobilenet_1.0_224 (כמותי) פיקסל 3 13.4 אלפיות השנייה --- 6.0 אלפיות השנייה
פיקסל 4 5.0 אלפיות השנייה --- 3.2 אלפיות השנייה
NASNet נייד פיקסל 3 56 אלפיות השנייה --- 102 אלפיות השנייה
פיקסל 4 34.5 אלפיות השנייה --- 99.0 אלפיות השנייה
SqueezeNet פיקסל 3 35.8 אלפיות השנייה 9.5 אלפיות השנייה 18.5 אלפיות השנייה
פיקסל 4 23.9 אלפיות השנייה 11.1 אלפיות השנייה 19.0 אלפיות השנייה
Inception_ResNet_V2 פיקסל 3 422 אלפיות השנייה 99.8 אלפיות השנייה 201 אלפיות השנייה
פיקסל 4 272.6 אלפיות השנייה 87.2 אלפיות השנייה 171.1 אלפיות השנייה
Inception_V4 פיקסל 3 486 אלפיות השנייה 93 אלפיות השנייה 292 אלפיות השנייה
פיקסל 4 324.1 אלפיות השנייה 97.6 אלפיות השנייה 186.9 אלפיות השנייה

מדדי ביצועים של iOS

מספרי השוואת ביצועים אלה נוצרו עם אפליקציית ה-benchmark של iOS .

כדי להפעיל מדדי ביצועים של iOS, אפליקציית ה-benchmark שונתה כך שתכלול את הדגם המתאים, ו- benchmark_params.json שונה כדי להגדיר num_threads ל-2. כדי להשתמש ב-GPU delegate, "use_gpu" : "1" ו- "gpu_wait_type" : "aggressive" היו נוסף גם ל- benchmark_params.json .

שם המודל התקן מעבד, 2 חוטים GPU
Mobilenet_1.0_224(צף) אייפון XS 14.8 אלפיות השנייה 3.4 אלפיות השנייה
Mobilenet_1.0_224 (כמותי) אייפון XS 11 אלפיות השנייה ---
NASNet נייד אייפון XS 30.4 אלפיות השנייה ---
SqueezeNet אייפון XS 21.1 אלפיות השנייה 15.5 אלפיות השנייה
Inception_ResNet_V2 אייפון XS 261.1 אלפיות השנייה 45.7 אלפיות השנייה
Inception_V4 אייפון XS 309 אלפיות השנייה 54.4 אלפיות השנייה

עקבו אחר חלקים פנימיים של TensorFlow Lite

עקבו אחר חלקים פנימיים של TensorFlow Lite באנדרואיד

ניתן ללכוד אירועים פנימיים מהמתורגמן TensorFlow Lite של אפליקציית אנדרואיד על ידי כלי מעקב של אנדרואיד . הם אותם אירועים עם Android Trace API, כך שהאירועים שנלכדו מקוד Java/Kotlin נראים יחד עם אירועים פנימיים של TensorFlow Lite.

כמה דוגמאות לאירועים הם:

  • הזמנת מפעיל
  • שינוי גרף על ידי נציג
  • הקצאת טנזור

בין האפשרויות השונות ללכידת עקבות, מדריך זה מכסה את פרופיל המעבד של Android Studio ואת אפליקציית מעקב המערכת. עיין בכלי שורת הפקודה Perfetto או בכלי שורת הפקודה של Systrace לאפשרויות אחרות.

הוספת אירועי מעקב בקוד Java

זהו קטע קוד מאפליקציית דוגמה לסיווג תמונות . מתורגמן TensorFlow Lite פועל בסעיף recognizeImage/runInference . שלב זה הוא אופציונלי אך הוא שימושי כדי לעזור להבחין היכן מתבצעת שיחת ההסקה.

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

אפשר מעקב של TensorFlow Lite

כדי להפעיל מעקב של TensorFlow Lite, הגדר את מאפיין מערכת Android debug.tflite.trace ל-1 לפני הפעלת אפליקציית Android.

adb shell setprop debug.tflite.trace 1

אם מאפיין זה הוגדר כאשר מתורגמן TensorFlow Lite מאותחל, יתבצע מעקב אחר אירועי מפתח (למשל, הפעלת מפעיל) מהמפרש.

לאחר שתפסת את כל העקבות, השבת את המעקב על ידי הגדרת ערך המאפיין ל-0.

adb shell setprop debug.tflite.trace 0

Android Studio CPU Profiler

לכיד עקבות עם Android Studio CPU Profiler על ידי ביצוע השלבים הבאים:

  1. בחר הפעלה > פרופיל 'אפליקציה' מהתפריטים העליונים.

  2. לחץ במקום כלשהו בציר הזמן של CPU כאשר חלון Profiler מופיע.

  3. בחר 'מעקב אחר שיחות מערכת' בין מצבי פרופיל המעבד.

    בחר 'מעקב אחר שיחות מערכת'

  4. לחץ על כפתור 'הקלט'.

  5. לחץ על כפתור 'עצור'.

  6. חקור את תוצאת המעקב.

    מעקב אנדרואיד סטודיו

בדוגמה זו, אתה יכול לראות את ההיררכיה של אירועים בשרשור וסטטיסטיקות עבור כל זמן מפעיל וגם לראות את זרימת הנתונים של האפליקציה כולה בין השרשורים.

אפליקציית מעקב אחר מערכת

צלם עקבות ללא Android Studio על ידי ביצוע השלבים המפורטים באפליקציית מעקב מערכת .

בדוגמה זו, אותם אירועי TFLite נלכדו ונשמרו בפורמט Perfetto או Systrace בהתאם לגרסת מכשיר האנדרואיד. ניתן לפתוח את קבצי המעקב שנלכדו בממשק המשתמש של Perfetto .

עקבות פרפטו

עקבו אחר חלקים פנימיים של TensorFlow Lite ב-iOS

ניתן ללכוד אירועים פנימיים מהמתורגמן TensorFlow Lite של אפליקציית iOS באמצעות כלי Instruments הכלול ב-Xcode. הם אירועי השלט של iOS, כך שהאירועים שנלכדו מקוד Swift/Objective-C נראים יחד עם אירועים פנימיים של TensorFlow Lite.

כמה דוגמאות לאירועים הם:

  • הזמנת מפעיל
  • שינוי גרף על ידי נציג
  • הקצאת טנזור

אפשר מעקב של TensorFlow Lite

הגדר את משתנה הסביבה debug.tflite.trace על ידי ביצוע השלבים הבאים:

  1. בחר מוצר > תכנית > ערוך תכנית... מהתפריטים העליונים של Xcode.

  2. לחץ על 'פרופיל' בחלונית השמאלית.

  3. בטל את הסימון בתיבת הסימון 'השתמש בארגומנטים ומשתני הסביבה של הפעולה הרץ'.

  4. הוסף את debug.tflite.trace בקטע 'משתני סביבה'.

    הגדר משתנה סביבה

אם ברצונך לא לכלול אירועים של TensorFlow Lite בעת יצירת פרופיל של אפליקציית iOS, השבת את המעקב על ידי הסרת משתנה הסביבה.

XCode Instruments

ללכוד עקבות על ידי ביצוע השלבים הבאים:

  1. בחר מוצר > פרופיל מהתפריטים העליונים של Xcode.

  2. לחץ על רישום בין תבניות פרופיל כאשר הכלי Instruments מופעל.

  3. לחץ על כפתור 'התחל'.

  4. לחץ על כפתור 'עצור'.

  5. לחץ על 'os_signpost' כדי להרחיב את פריטי תת-מערכת רישום מערכת ההפעלה.

  6. לחץ על 'org.tensorflow.lite' מערכת תת-מערכת רישום מערכת הפעלה.

  7. חקור את תוצאת המעקב.

    מעקב אחר Xcode Instruments

בדוגמה זו, אתה יכול לראות את ההיררכיה של אירועים וסטטיסטיקות עבור כל זמן מפעיל.

שימוש בנתוני המעקב

נתוני המעקב מאפשרים לך לזהות צווארי בקבוק בביצועים.

הנה כמה דוגמאות לתובנות שתוכלו לקבל מהפרופילים ופתרונות פוטנציאליים לשיפור הביצועים:

  • אם מספר ליבות ה-CPU הזמינות קטן ממספר פתילי ההסקה, תקורה של תזמון ה-CPU יכולה להוביל לביצועים נמוכים יותר. אתה יכול לתזמן מחדש משימות אינטנסיביות אחרות של CPU ביישום שלך כדי למנוע חפיפה להסקת המודל שלך או לצבוט את מספר שרשורי המתורגמנים.
  • אם המפעילים אינם מואצים במלואם, אז חלקים מסוימים של גרף המודל מבוצעים על ה-CPU ולא על מאיץ החומרה הצפוי. אתה יכול להחליף את האופרטורים הלא נתמכים באופרטורים נתמכים דומים.