כלי השוואה לשוק
הכלים להשוואה של LiteRT מודדים ומחשבים כרגע נתונים סטטיסטיים של מדדי הביצועים החשובים הבאים:
- זמן האתחול
- זמן ההסקה של מצב החימום
- זמן ההסקה של מצב יציב
- שימוש בזיכרון במהלך זמן האתחול
- שימוש כולל בזיכרון
כלי ההשוואה זמינים כאפליקציות להשוואה ל-Android ול-iOS, וכקבצים בינאריים מוכנים מראש של שורת פקודה. לכל הכלים האלה יש את אותה לוגיקה בסיסית למדידת הביצועים. שימו לב: האפשרויות הזמינות ופורמטי הפלט שונים מעט בגלל ההבדלים בסביבת זמן הריצה.
קובץ בינארי מוכן מראש של נקודת השוואה (באמצעות CompiledModel API)
יש שתי אפשרויות לשימוש בכלי ההשוואה לשוק עם Android. אחד מהם הוא קובץ בינארי של מדד ביצועים מקורי (מבוסס על CompiledModel API) והשני הוא אפליקציית מדד ביצועים ל-Android (מבוססת על Interpreter API). כלי ההשוואה LiteRT מסופק כקובץ בינארי מובנה
benchmark_model. אפשר להריץ את הכלי הזה משורת פקודה של מעטפת ב-Linux, macOS, Windows, Raspberry Pi, במכשירים מוטמעים ובמכשירי Android עם הפעלת האצת GPU.
הורדה או בנייה של הקובץ הבינארי
מורידים את הקבצים הבינאריים המוכנים מראש של שורת הפקודה מהקישורים הבאים:
אפשר גם ליצור את קובץ ההפעלה של ההשוואה ממקור במחשב.
bazel build -c opt //litert/tools:benchmark_model
כדי לבצע build באמצעות ערכת הכלים של Android NDK, צריך להגדיר קודם את סביבת ה-build לפי המדריך הזה, או להשתמש בקובץ האימג' של 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 Accelerator
הקבצים הבינאריים המוכנים מראש כוללים את LiteRT GPU Accelerator החדש. הוא תומך ב-OpenCL וב-WebGPU שמגובה על ידי Vulkan (Linux), Metal (MacOS) ו-Direct3D (Windows).
כדי להשתמש ב-GPU Accelerator, מעבירים את הדגל --use_gpu=true.
תפעול של מודלים של פרופילים
קובץ הבינארי של מודל ההשוואה מאפשר גם ליצור פרופיל של פעולות המודל ולקבל את זמני הביצוע של כל אופרטור. כדי לעשות את זה, מעבירים את הדגל
--use_profiler=true אל benchmark_model במהלך ההפעלה.
אפליקציית השוואה (benchmark) ל-Android (באמצעות Interpreter API)
מסופקת גם אפליקציית השוואה (benchmark) ל-Android שמבוססת על v1 Interpreter API. המדד הזה משקף בצורה טובה יותר את הביצועים של המודל באפליקציית Android. המספרים מכלי ההשוואה עדיין יהיו שונים מעט מהמספרים שיתקבלו כשמריצים הסקה עם המודל באפליקציה בפועל.
לאפליקציית ההשוואה הזו ל-Android אין ממשק משתמש. מתקינים ומריצים אותו באמצעות הפקודה adb ומאחזרים את התוצאות באמצעות הפקודה adb logcat.
הורדה או פיתוח של האפליקציה
אפשר להוריד את אפליקציות ההשוואה (benchmark) ל-Android שנוצרות מראש מדי לילה באמצעות הקישורים הבאים:
לגבי אפליקציות להשוואה (benchmark) ל-Android שתומכות בפעולות TF באמצעות 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)
שימוש בנציג GPU. -
use_xnnpack:bool(ברירת מחדל=false)
שימוש בXNNPACK delegate.
יכול להיות שחלק מהאפשרויות האלה לא יהיו זמינות או שלא תהיה להן השפעה, בהתאם למכשיר שבו אתם משתמשים. במאמר בנושא פרמטרים מפורטים פרמטרים נוספים של ביצועים שאפשר להריץ באמצעות אפליקציית ההשוואה.
מציגים את התוצאות באמצעות הפקודה 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
כדי להפעיל עם גישת GPU, מגדירים את --use_gpu=true.
ערכי הביצועים שלמטה נמדדו ב-Android 10.
| שם דגם | מכשיר | מעבד (CPU) עם 4 שרשורים | GPU |
|---|---|---|---|
| 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.
כדי להריץ בדיקות השוואה (benchmark) ב-iOS, האפליקציה לבדיקת ההשוואה שונתה כך שתכלול את המודל המתאים, ו-benchmark_params.json שונה כך שהערך של num_threads יהיה 2. כדי להשתמש ב-GPU delegate, נוספו גם האפשרויות "use_gpu" : "1" ו-"gpu_wait_type" : "aggressive" ל-benchmark_params.json.
| שם דגם | מכשיר | מעבד (CPU), 2 threads | GPU |
|---|---|---|---|
| Mobilenet_1.0_224(float) | iPhone XS | 14.8 אלפיות השנייה | 3.4 ms |
| 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 אלפיות השנייה |
מעקב אחר הפעולות הפנימיות של LiteRT
מעקב אחר רכיבי LiteRT פנימיים ב-Android
אפשר לתעד אירועים פנימיים מהמתורגמן LiteRT של אפליקציית Android באמצעות כלי המעקב של Android. אלה אותם אירועים עם Android Trace API, כך שהאירועים שתועדו מקוד Java/Kotlin מוצגים יחד עם אירועים פנימיים של LiteRT.
דוגמאות לאירועים:
- הפעלת אופרטור
- שינוי הגרף על ידי נציג
- הקצאת טנסור
במדריך הזה מוסבר על כלי פרופיל המעבד (CPU) של Android Studio ועל אפליקציית מעקב המערכת. כדי לקבל מידע על אפשרויות אחרות, אפשר לעיין בכלי שורת הפקודה של Perfetto או בכלי שורת הפקודה של Systrace.
הוספת אירועי מעקב בקוד Java
זהו קטע קוד מאפליקציית הדוגמה Image Classification. מפענח 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
כלי לניתוח ביצועי ה-CPU ב-Android Studio
כדי ללכוד עקבות באמצעות כלי הפרופילים של CPU ב-Android Studio, פועלים לפי השלבים הבאים:
בתפריטים העליונים, בוחרים באפשרות Run > Profile 'app' (הפעלה > פרופיל 'אפליקציה').
כשחלון הכלי ליצירת פרופילים מופיע, לוחצים על ציר הזמן של CPU.
בוחרים באפשרות Trace System Calls (מעקב אחרי קריאות למערכת) מבין מצבי פרופיל ה-CPU.

לוחצים על כפתור ההקלטה.
לוחצים על הלחצן 'עצירה'.
בודקים את תוצאת האיתור.

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

מעקב אחר פרטים פנימיים של LiteRT ב-iOS
אפשר לתעד אירועים פנימיים מהמתורגמן LiteRT של אפליקציית iOS באמצעות הכלי Instruments שכלול ב-Xcode. אלה אירועים של signpost ב-iOS, כך שהאירועים שתועדו מקוד Swift/Objective-C מוצגים יחד עם אירועים פנימיים של LiteRT.
דוגמאות לאירועים:
- הפעלת אופרטור
- שינוי הגרף על ידי נציג
- הקצאת טנסור
הפעלת מעקב LiteRT
כדי להגדיר את משתנה הסביבה debug.tflite.trace, פועלים לפי השלבים הבאים:
בתפריטים העליונים של Xcode, בוחרים באפשרות Product (מוצר) > Scheme (סכימה) > Edit Scheme… (עריכת הסכימה…).
בחלונית הימנית, לוחצים על 'פרופיל'.
מבטלים את הסימון בתיבת הסימון 'שימוש בארגומנטים ובמשתני הסביבה של פעולת ההפעלה'.
מוסיפים את
debug.tflite.traceבקטע 'משתני סביבה'.
אם רוצים להחריג אירועי LiteRT כשיוצרים פרופיל לאפליקציית iOS, צריך להשבית את המעקב על ידי הסרת משתנה הסביבה.
XCode Instruments
כדי ללכוד עקבות, פועלים לפי השלבים הבאים:
בתפריטים העליונים של Xcode, בוחרים באפשרות Product (מוצר) > Profile (פרופיל).
כשכלי Instruments מופעל, לוחצים על Logging (רישום ביומן) בין תבניות הפרופילים.
לוחצים על הכפתור 'התחלה'.
לוחצים על הלחצן 'עצירה'.
לוחצים על os_signpost כדי להרחיב את הפריטים של מערכת המשנה של רישום ב-OS.
לוחצים על מערכת המשנה 'org.tensorflow.lite' של רישום ביומן של מערכת ההפעלה.
בודקים את תוצאת האיתור.

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