כלים להשוואה
כלים להשוואת ביצועים של LiteRT מודדים ומחושבים כרגע נתונים סטטיסטיים עבור מדדי הביצוע החשובים הבאים:
- זמן האתחול
- שעת ההסקה של מצב החימום
- זמן הסקת מסקנות במצב יציב
- השימוש בזיכרון במהלך זמן האתחול
- שימוש כולל בזיכרון
הכלים להשוואה זמינים כאפליקציות השוואה לשוק עבור Android ו-iOS קבצים בינאריים של שורת הפקודה נייטיב, וכולם חולקים אותם ביצועים מרכזיים בלוגיקה של מדידה. חשוב לשים לב שהאפשרויות הזמינות והפורמטים של הפלט הם שונה מעט בגלל ההבדלים בסביבת זמן הריצה.
אפליקציית בנצ'מרק ל-Android
יש שתי דרכים להשתמש בכלי ההשוואה לשוק ב-Android. האחד הוא קובץ בינארי מקורי של בנצ'מרק והשני הוא Android אפליקציית השוואה לשוק, מדד טוב יותר של ביצועי המודל באפליקציה. אחד משני הערכים הנתונים מהכלי להשוואת ביצועים עדיין יהיו שונים מעט שהסקת מסקנות מהמודל באפליקציה עצמה.
לאפליקציה הזו לבנצ'מרק של Android אין ממשק משתמש. אפשר להתקין ולהפעיל אותו באמצעות adb
ומאחזרים את התוצאות באמצעות הפקודה adb logcat
.
הורדה או פיתוח של האפליקציה
אפשר להוריד את אפליקציות ההשוואה לשוק של Android מראש ל-Android באמצעות הקישורים הבאים:
לגבי אפליקציות בנצ'מרק ל-Android שתומכות בפעולות TF דרך Flex נציג, השתמשו בקישורים הבאים:
אפשר גם ליצור אפליקציות מקוד המקור על ידי ביצוע הפעולות הבאות הוראות להגדרה.
הכנת נקודת ההשוואה
לפני הרצת אפליקציית ההשוואה לשוק, צריך להתקין את האפליקציה ולהעביר את קובץ המודל אל המכשיר באופן הבא:
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
(ברירת המחדל)
שימוש בהענקת גישה ל-GPU.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
קובץ בינארי מקורי של בנצ'מרק
כלי ההשוואה לשוק מסופק גם בתור benchmark_model
בינארי מקורי. אפשר
להפעיל את הכלי משורת הפקודה של מעטפת ב-Linux, ב-Mac, במכשירים מוטמעים
מכשירי Android
הורדה או יצירה של הקובץ הבינארי
מורידים את הקבצים הבינאריים של שורת הפקודה המקורית שנבנו מראש מדי לילה על ידי ביצוע הפעולות הבאות הקישורים הבאים:
לגבי קבצים בינאריים מוכנים מראש ללילה שתומכים בפעולות TF דרך Flex נציג, השתמשו בקישורים הבאים:
אפשר גם לפתח את הקובץ הבינארי המקורי של נקודת ההשוואה מ- מקור במחשב.
bazel build -c opt //tensorflow/lite/tools/benchmark:benchmark_model
כדי לפתח באמצעות מערכת הכלים של Android NDK, צריך להגדיר את סביבת ה-build קודם כול צריך לעקוב guide, או להשתמש את קובץ האימג' של ה-Docker כמו שמתואר guide.
bazel build -c opt --config=android_arm64 \
//tensorflow/lite/tools/benchmark:benchmark_model
הפעלת נקודת ההשוואה
כדי להריץ נקודות השוואה במחשב, מריצים את הקובץ הבינארי מהמעטפת.
path/to/downloaded_or_built/benchmark_model \
--graph=your_model.tflite \
--num_threads=4
אפשר להשתמש באותה קבוצה של פרמטרים כפי שהוזכר למעלה באמצעות קובץ הבינארי המקורי של שורת הפקודה.
פעולות של יצירת מודלים ליצירת פרופילים
הקובץ הבינארי של מודל ההשוואה לשוק מאפשר גם ליצור פרופילים של פעולות ולקבל
של כל אופרטור. כדי לעשות את זה, מעבירים את הדגל
--enable_op_profiling=true
עד benchmark_model
במהלך ההפעלה. הפרטים הם
להסבר
כאן.
קובץ בינארי מקורי של בנצ'מרק למספר אפשרויות של ביצועים בהרצה אחת
קובץ בינארי נוח ופשוט של C++ מסופק גם כדי
לבצע השוואה בין כמה אפשרויות של ביצועים לתמחור בתעשייה
בהפעלה אחת. הקוד הבינארי הזה מבוסס על כלי בנצ׳מרק שהוזכר קודם לכן
שיכול להשוות רק לאפשרות ביצועים אחת בכל פעם. הם חולקים את
אותו תהליך build/התקנה/הרצה, אבל שם היעד של BUILD של הקובץ הבינארי הזה הוא
benchmark_model_performance_options
והוא מצריך כמה פרמטרים נוספים.
פרמטר חשוב בקובץ הבינארי הזה הוא:
perf_options_list
: string
(ברירת המחדל 'הכול')
רשימה מופרדת בפסיקים של אפשרויות ביצועים של TFLite להשוואה.
אפשר לקבל קבצים בינאריים מוכנים מראש לכלי הזה באופן הבא:
אפליקציית בנצ'מרק ל-iOS
כדי להפעיל נקודות השוואה במכשירי iOS, צריך ליצור את האפליקציה מ:
source.
למקם את קובץ המודל LiteRT
benchmark_data
של עץ המקור ולשנות את הקובץ benchmark_params.json
. האלה
הקבצים נארזים באפליקציה והאפליקציה קוראת נתונים מהספרייה. כניסה לאתר
ה
אפליקציית השוואה לשוק ל-iOS
לקבלת הוראות מפורטות.
נקודות השוואה לביצועים של מודלים ידועים
בקטע הזה מפורטות נקודות השוואה לביצועי LiteRT כשהביצועים טובים מוכרים מסוימים במכשירי Android ו-iOS מסוימים.
נקודות השוואה לביצועים ב-Android
הנתונים של נקודת ההשוואה לביצועים נוצרו באמצעות קובץ בינארי מקורי של בנצ'מרק.
ביחס למתחרים של Android, תחום העניין המשותף של המעבד (CPU) מוגדר לשימוש בליבות גדולות במכשיר כדי לצמצם את השונות (ראו פרטים).
ההנחה היא שהמודלים הורדו וחולצו אל קובץ ה-ZIP
ספריית /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 לניידים | 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. כדי להשתמש ב-
בעל הגישה ל-GPU, אפשרויות "use_gpu" : "1"
ו-"gpu_wait_type" : "aggressive"
נוספו גם אל benchmark_params.json
.
שם דגם | מכשיר | מעבד (CPU), 2 שרשורים | GPU |
---|---|---|---|
Mobilenet_1.0_224(float) | iPhone XS | 14.8 אלפיות השנייה | 3.4 אלפיות השנייה |
Mobilenet_1.0_224 (quant) | iPhone XS | 11 אלפיות השנייה | --- |
NASNet לניידים | 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 את ה-API של Trace, כך אירועים שתועדו מקוד Java/Kotlin מוצגים יחד עם LiteRT אירועים פנימיים.
דוגמאות לאירועים:
- הפעלת המפעיל
- שינוי בגרף על ידי משתמש שקיבל הרשאה
- הקצאת Tensor
המדריך הזה עוסק באפשרויות השונות לתיעוד מעקבים, הכלי לניתוח ביצועי המעבד (CPU) ב-Studio ואפליקציית System Tracing. פרטים נוספים כלי שורת הפקודה 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
הכלי לניתוח ביצועי המעבד (CPU) ב-Android Studio
אפשר לתעד מעקב באמצעות הכלי לבדיקת ביצועי המעבד (CPU) ב-Android Studio כך תעשו את זה:
בוחרים באפשרות הפעלה > פרופיל 'אפליקציה' מהתפריטים העליונים.
לוחצים במקום כלשהו בציר הזמן של ה-CPU כשחלון Profiler מופיע.
בוחרים באפשרות 'Trace System Calls' (שיחות מערכת מעקב) בין המצבים של יצירת פרופילים עבור המעבד (CPU).
לוחצים על 'הקלטה' לחצן.
לוחצים על 'עצירה'. לחצן.
בודקים את תוצאת המעקב.
בדוגמה הזו ניתן לראות את ההיררכיה של אירועים בשרשור ונתונים סטטיסטיים לגבי כל זמן של מפעיל וגם לראות את זרימת הנתונים של האפליקציה כולה שרשורים.
אפליקציית מעקב המערכת
אפשר לתעד מעקבים ללא Android Studio לפי השלבים שמפורטים בקטע אפליקציית System Tracing.
בדוגמה הזו, אותם אירועי TFLite תועדו ונשמרו בקובץ Perfetto. או בפורמט Systrace, בהתאם לגרסה של מכשיר Android. המצולמים ניתן לפתוח קובצי מעקב בממשק המשתמש של Perfetto.
מעקב אחר רכיבים פנימיים של LiteRT ב-iOS
אירועים פנימיים מתרגום ב-LiteRT של אפליקציה ל-iOS יכולים להיות צולם על ידי כלי נגינה בכלי שכלול ב-Xcode. אלה ה-iOS signpost אפשר לראות יחד את האירועים שתועדו מקוד SWIFT/Objective-C עם אירועים פנימיים של LiteRT.
דוגמאות לאירועים:
- הפעלת המפעיל
- שינוי בגרף על ידי משתמש שקיבל הרשאה
- הקצאת Tensor
הפעלה של מעקב LiteRT
מגדירים את משתנה הסביבה debug.tflite.trace
באופן הבא:
בוחרים באפשרות מוצר > סכימה > עריכת סכימה... בתפריטים העליונים של Xcode.
לוחצים על 'פרופיל' בחלונית הימנית.
מבטלים את הסימון של האפשרות 'שימוש בארגומנטים ובמשתני הסביבה של הפעולה 'הרצה'. תיבת הסימון.
מוסיפים את המאפיין
debug.tflite.trace
בקטע 'משתני סביבה' .
אם רוצים להחריג אירועי LiteRT במהלך הפרופיילינג של האפליקציה ל-iOS: להשבית את המעקב על ידי הסרת משתנה הסביבה.
כלי XCode
כדי לתעד מעקבים, פועלים לפי השלבים הבאים:
בוחרים באפשרות מוצר > Profile (פרופיל) מהתפריטים המובילים של Xcode.
לוחצים על Logging בין תבניות הפרופיילינג כאשר הכלי Instrument.
לוחצים על 'התחלה' לחצן.
לוחצים על 'עצירה'. לחצן.
לוחצים על 'os_signpost' כדי להרחיב את פריטי מערכת המשנה של OS Logging.
לוחצים על 'org.tensorflow.lite' מערכת המשנה OS Logging.
בודקים את תוצאת המעקב.
בדוגמה הזו ניתן לראות את ההיררכיה של אירועים ונתונים סטטיסטיים עבור כל בזמן ההפעלה.
שימוש בנתוני המעקב
נתוני המעקב מאפשרים לכם לזהות צווארי בקבוק בביצועים.
הנה כמה דוגמאות לתובנות שאפשר לקבל מכלי הפרופיל, פתרונות פוטנציאליים לשיפור הביצועים:
- אם מספר ליבות המעבד (CPU) הזמינות קטן ממספר ההסקה אז התקורה של התזמון של המעבד (CPU) עלולה להוביל לביצועים נמוכים. אתם יכולים לתזמן מחדש משימות אחרות שצורכות הרבה מעבד (CPU) באפליקציה שלכם, כדי להימנע לחפוף עם ההֶקֵּשׁ של המודל או לשנות את מספר התרגום שרשורים.
- אם האופרטורים לא מוקצים באופן מלא, אז חלקים מסוימים בתרשים המודל מופעלות על המעבד (CPU) ולא על מאיץ החומרה הצפוי. שלך יכול להחליף את האופרטורים שלא נתמכים באופרטורים נתמכים דומים.