Google I/O הוא עטיפה! התעדכן בהפעלות של TensorFlow. צפה בהפעלות

נציגי TensorFlow Lite

מבוא

נציגים מאפשרים האצת חומרה של דגמי TensorFlow Lite על ידי מינוף מאיצים במכשיר כמו ה- GPU ומעבד האותות הדיגיטלי (DSP) .

כברירת מחדל, TensorFlow Lite משתמש בגרעיני מעבד המותאמים לערכת ההוראות של ARM Neon . עם זאת, המעבד הוא מעבד רב-תכליתי שאינו מותאם בהכרח לחשבון הכבד שנמצא בדרך כלל במודלים של Machine Learning (למשל, המתמטיקה של המטריצה ​​הכרוכה בפיתול ושכבות צפופות).

מצד שני, רוב הטלפונים הניידים המודרניים מכילים שבבים הטובים יותר להתמודד עם פעולות כבדות אלה. השימוש בהם לצורך פעולות רשת עצביות מספק יתרונות עצומים מבחינת חביון ויעילות חשמל. לדוגמא, GPUs יכולים לספק עד 5x מהירות בהשהיה, בעוד ש- Qualcomm® Hexagon DSP הראה כי הוא מפחית את צריכת החשמל עד 75% בניסויים שלנו.

לכל אחד מהאיצים הללו יש ממשקי API המשויכים המאפשרים חישובים מותאמים אישית, כגון OpenCL או OpenGL ES עבור GPU נייד ו- Qualcomm® Hexagon SDK עבור DSP. בדרך כלל, יהיה עליכם לכתוב הרבה קוד מותאם אישית להפעלת רשת עצבית דרך ממשקים אלה. העניינים מסתבכים עוד יותר כאשר לוקחים בחשבון שלכל מאיץ יש את היתרונות והחסרונות שלו ואינם יכולים לבצע כל פעולה ברשת עצבית. ה- Delegate API של TensorFlow Lite פותר בעיה זו על ידי פעולה כגשר בין זמן הריצה של TFLite לבין ממשקי ה- API ברמה נמוכה יותר.

זמן ריצה עם נציגים

בחירת נציג

TensorFlow Lite תומך במספר נציגים, שכל אחד מהם מותאם לפלטפורמות מסוימות (ים) וסוגים מסוימים של דגמים. בדרך כלל, יהיו מספר נציגים החלים על מקרה השימוש שלך, בהתאם לשני קריטריונים עיקריים: הפלטפורמה (אנדרואיד או iOS?) אליה אתה מכוון, וסוג המודל (נקודה צפה או כמותית?) שאתה מנסה להאיץ. .

צירים לפי פלטפורמה

פלטפורמות שונות (אנדרואיד ו- iOS)

  • נציג GPU - ניתן להשתמש בנציג ה- GPU גם ב- Android וגם ב- iOS. זה מותאם להפעלת דגמים מבוססי צף של 32 סיביות ו -16 סיביות שבהם זמין GPU. הוא תומך גם במודלים מכמתים של 8 סיביות ומספק ביצועי GPU באופן שווה לגרסאות הצף שלהם. לפרטים על נציג ה- GPU, ראה TensorFlow Lite ב- GPU . לקבלת הדרכות שלב אחר שלב בנושא שימוש בנציג GPU עם אנדרואיד ו- iOS, עיין בהדרכה של נציגי GPU של TensorFlow Lite .

דְמוּי אָדָם

  • נציג NNAPI למכשירי אנדרואיד חדשים יותר - ניתן להשתמש בנציג NNAPI כדי להאיץ דגמים במכשירי Android עם GPU, DSP ו / או NPU זמינים. זה זמין ב- Android 8.1 (API 27+) ומעלה. לקבלת סקירה כללית של נציג NNAPI, הוראות מפורטות ושיטות עבודה מומלצות, ראה TensorFlow Lite NNAPI .
  • נציג משושים למכשירי אנדרואיד ישנים יותר - ניתן להשתמש בנציג המשושה להאצת דגמים במכשירי אנדרואיד באמצעות Qualcomm Hexagon DSP. ניתן להשתמש בו במכשירים שמריצים גרסאות ישנות יותר של Android שאינם תומכים ב- NNAPI. ראה נציג TensorFlow Lite משושה לפרטים נוספים.

iOS

  • נציג Core Core לאייפונים ואייפדים חדשים יותר - עבור מכשירי אייפון ואייפד חדשים יותר שבהם זמין Neural Engine, ניתן להשתמש בנציג Core ML כדי להאיץ את ההסקה עבור דגמי 32 סיביות או 16 סיביות. מנוע עצבי זמין מכשירים ניידים של אפל עם A12 SoC ומעלה. לסקירה כללית על נציג Core ML והוראות מפורטות, ראה TensorFlow Lite Core ML delegate .

צירים לפי סוג דגם

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

סוג הדגם GPU NNAPI מְשׁוּשֶׁה CoreML
נקודה צפה (32 סיביות) כן כן לא כן
כימות float16 לאחר אימון כן לא לא כן
כימות טווח דינמי לאחר אימון כן כן לא לא
כימות שלמה לאחר אימון כן כן כן לא
אימון מודע לכימות כן כן כן לא

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

המידע בסעיף זה משמש קו מנחה גס לרשימת המועמדים הקצרה של הנציגים שיכולים לשפר את בקשתך. עם זאת, חשוב לציין שלכל נציג יש קבוצה מוגדרת מראש של פעולות שהוא תומך בהן, ועשויות לבצע ביצועים שונים בהתאם לדגם ולמכשיר; למשל, נציג ה- NNAPI עשוי לבחור להשתמש ב- Edge-TPU של גוגל בטלפון פיקסל תוך שימוש ב- DSP במכשיר אחר. לכן, בדרך כלל מומלץ לבצע ביצוע אמות מידה כדי לאמוד עד כמה נציג שימושי לצרכים שלך. זה גם מסייע בהצדקת הגדלת גודל הבינארי הקשורה לצירוף נציג לזמן הריצה של TensorFlow Lite.

ל- TensorFlow Lite כלים נרחבים להערכת ביצועים ודיוק שיכולים לאפשר למפתחים להיות בטוחים בשימוש בצירים ביישום שלהם. כלים אלה נדונים בחלק הבא.

כלים להערכה

חביון וטביעת רגל זיכרון

ניתן להשתמש בכלי המדד של TensorFlow Lite עם פרמטרים מתאימים להערכת ביצועי הדגם, כולל חביון הסקה ממוצע, תקצוב אתחול, טביעת רגל זיכרון וכו '. כלי זה תומך במספר דגלים בכדי להבין את תצורת הנציגים הטובה ביותר עבור הדגם שלך. לדוגמה, ניתן לציין --gpu_backend=gl באמצעות --use_gpu כדי למדוד ביצוע GPU עם OpenGL. הרשימה המלאה של הפרמטרים הנציגים הנתמכים מוגדרת בתיעוד המפורט .

הנה דוגמה להפעלת מודל מכמת עם GPU באמצעות adb :

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

תוכלו להוריד גרסה שנבנתה מראש של כלי זה לאנדרואיד, ארכיטקטורת ARM של 64 סיביות כאן ( פרטים נוספים ).

דיוק ונכונות

נציגים בדרך כלל מבצעים חישובים בדיוק אחר מאשר עמיתיהם למעבד. כתוצאה מכך, קיים פשרה מדויקת (לרוב מינורית) הקשורה לשימוש בציר להאצת חומרה. שים לב שזה לא תמיד נכון; לדוגמא, מכיוון שה- GPU משתמש בדיוק בנקודות צפות להפעלת מודלים מכמתים, יכול להיות שיפור דיוק קל (למשל, <1% שיפור Top-5 בסיווג תמונות ILSVRC).

ל- TensorFlow Lite שני סוגי כלים כדי למדוד עד כמה נציג מתנהג באופן מדויק עבור מודל נתון: מבוסס משימות ואגנוסטי . כל הכלים המתוארים בסעיף זה תומכים בפרמטרי ההאצלה המתקדמים המשמשים את כלי המידוד מהסעיף הקודם. שים לב כי חלקי המשנה שלמטה מתמקדים בהערכת נציג (האם הנציג מבצע את אותו הדבר כמו המעבד?) ולא בהערכת מודל (האם המודל עצמו טוב למשימה?).

הערכה מבוססת משימות

ל- TensorFlow Lite כלים להערכת נכונות בשתי משימות מבוססות תמונה:

קבצים בינאריים מובנים מראש של כלים אלה (אנדרואיד, ארכיטקטורת ARM של 64 סיביות), יחד עם תיעוד, ניתן למצוא כאן:

הדוגמה שלהלן מדגימה הערכת סיווג תמונות עם NNAPI תוך שימוש ב- Edge-TPU של גוגל בפיקסל 4:

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_nnapi=true \
  --nnapi_accelerator_name=google-edgetpu

התפוקה הצפויה היא רשימה של מדדי Top-K מ -1 עד 10:

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

הערכת משימות-אגנוסטיות

למשימות שאין כלי הערכה מבוסס על המכשיר, או אם אתה מתנסה במודלים מותאמים אישית, ל- TensorFlow Lite יש את הכלי Inference Diff . (אנדרואיד, ארכיטקטורה בינארית ARM של 64 סיביות כאן )

Inference Diff משווה ביצוע של TensorFlow Lite (במונחים של חביון וסטיית ערך פלט) בשתי הגדרות:

  • הסקת מעבד עם הברגה אחת
  • מסקנה המוגדרת על ידי המשתמש - מוגדרת על ידי פרמטרים אלה

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

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

עבור דגם עם טנסור פלט יחיד, הפלט עשוי להיראות כך:

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

משמעות הדבר היא שעבור טנסור הפלט באינדקס 0 , האלמנטים מהפלט של המעבד שונים מפלט הנציג בממוצע של 1.96e-05 .

שים לב כי פרשנות מספרים אלה מצריכה ידע מעמיק יותר במודל ומה שמסמן כל טנסור פלט. אם מדובר ברגרסיה פשוטה שקובעת איזשהו ציון או הטבעה, ההבדל צריך להיות נמוך (אחרת זו שגיאה אצל הנציג). עם זאת, פלטים כמו 'מחלקת הזיהוי' ממודלים של SSD מעט קשה יותר לפרשנות. לדוגמה, זה עשוי להראות הבדל בעזרת הכלי הזה, אבל זה לא יכול להיות שמשהו ממש לא בסדר עם הנציג: שקול שני שיעורים (מזויפים): "TV (ID: 10)", "Monitor (ID: 20)" - אם נציג נמצא מעט מהאמת המוזהבת ומציג צג במקום טלוויזיה, ההבדל בפלט עבור טנסור זה עשוי להיות גבוה ככל 20-10 = 10.