נציגי GPU עבור TensorFlow Lite

שימוש ביחידות עיבוד גרפיות (GPU) להפעלת מודלים של למידת מכונה (ML) שלך יכול לשפר באופן דרמטי את הביצועים של המודל שלך ואת חווית המשתמש של היישומים התומכים ב-ML שלך. TensorFlow Lite מאפשר שימוש במעבדי GPU ומעבדים מיוחדים אחרים באמצעות מנהל התקן חומרה הנקרא Delegates . הפעלת שימוש ב-GPUs עם יישומי TensorFlow Lite ML שלך יכולה לספק את היתרונות הבאים:

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

מסמך זה מספק סקירה כללית של תמיכה ב-GPUs ב-TensorFlow Lite, וכמה שימושים מתקדמים עבור מעבדי GPU. למידע ספציפי יותר על הטמעת תמיכת GPU בפלטפורמות ספציפיות, עיין במדריכים הבאים:

תמיכה בפעולות GPU ML

ישנן מגבלות מסוימות לאיזה פעולות של TensorFlow ML, או פעולות , יכולות להיות מואצות על ידי הנציג של TensorFlow Lite GPU. הנציג תומך בפעולות הבאות בדיוק ציפה של 16 סיביות ו-32 סיביות:

  • ADD
  • AVERAGE_POOL_2D
  • CONCATENATION
  • CONV_2D
  • DEPTHWISE_CONV_2D v1-2
  • EXP
  • FULLY_CONNECTED
  • LOGICAL_AND
  • LOGISTIC
  • LSTM v2 (Basic LSTM only)
  • MAX_POOL_2D
  • MAXIMUM
  • MINIMUM
  • MUL
  • PAD
  • PRELU
  • RELU
  • RELU6
  • RESHAPE
  • RESIZE_BILINEAR v1-3
  • SOFTMAX
  • STRIDED_SLICE
  • SUB
  • TRANSPOSE_CONV

כברירת מחדל, כל הפעולות נתמכות רק בגרסה 1. הפעלת תמיכת הקוונטיזציה מאפשרת את הגרסאות המתאימות, למשל, ADD v2.

פתרון בעיות תמיכה ב-GPU

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

WARNING: op code #42 cannot be handled by this delegate.

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

דגמים לדוגמה

הדגמים הבאים לדוגמה בנויים כדי לנצל את האצת GPU עם TensorFlow Lite ומסופקים לעיון ובדיקה:

אופטימיזציה עבור GPUs

הטכניקות הבאות יכולות לעזור לך להשיג ביצועים טובים יותר בעת הפעלת דגמים על חומרת GPU באמצעות נציג TensorFlow Lite GPU:

  • פעולות צורה מחדש - לחלק מהפעולות המהירות במעבד עשויות להיות עלות גבוהה עבור ה-GPU במכשירים ניידים. פעולות עיצוב מחדש יקרות במיוחד להפעלה, כולל BATCH_TO_SPACE , SPACE_TO_BATCH , SPACE_TO_DEPTH , וכן הלאה. עליך לבחון מקרוב את השימוש בפעולות צורה מחדש, ולשקול שאולי יושמו רק עבור חקירת נתונים או עבור איטרציות מוקדמות של המודל שלך. הסרתם יכולה לשפר משמעותית את הביצועים.

  • ערוצי נתוני תמונה - ב-GPU, נתוני טנזור מחולקים ל-4 ערוצים, ולכן חישוב על טנזור עם הצורה [B,H,W,5] מבצע בערך אותו דבר על טנסור של צורה [B,H,W,8] , אך גרוע משמעותית מ [B,H,W,4] . אם חומרת המצלמה שבה אתה משתמש תומכת במסגרות תמונה ב-RGBA, הזנת קלט 4 ערוצים זו מהירה משמעותית, מכיוון שהיא מונעת העתקת זיכרון מ-3 ערוצים RGB ל-4 ערוצים RGBX.

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

תמיכה מתקדמת ב-GPU

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

שימוש במודלים כמותיים

סעיף זה מסביר כיצד נציג ה-GPU מאיץ דגמים קוונטיים של 8 סיביות, כולל את הדברים הבאים:

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

איך זה עובד?

מכיוון שה-GPU העורפי תומך רק בביצוע של נקודה צפה, אנו מריצים מודלים כמותיים על ידי מתן 'תצוגה בנקודה צפה' של הדגם המקורי. ברמה גבוהה, זה כרוך בפעולות הבאות:

  • טנסורים קבועים (כגון משקלים/הטיות) מובטלים פעם אחת לתוך זיכרון ה-GPU. פעולה זו מתרחשת כאשר הנציג מופעל עבור TensorFlow Lite.

  • כניסות ויציאות לתוכנית ה-GPU, אם 8-bit מכומדים, עוברים דה-quantized ו-quantized (בהתאמה) עבור כל מסקנות. פעולה זו נעשית על ה-CPU באמצעות הגרעינים המותאמים של TensorFlow Lite.

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

למידע על הפעלת תכונה זו עם נציג ה-GPU, ראה את הפרטים הבאים:

צמצום זמן האתחול בעזרת סדרה

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

C++

    TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default();
    options.experimental_flags |= TFLITE_GPU_EXPERIMENTAL_FLAGS_ENABLE_SERIALIZATION;
    options.serialization_dir = kTmpDir;
    options.model_token = kModelToken;

    auto* delegate = TfLiteGpuDelegateV2Create(options);
    if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
      

Java

    GpuDelegate delegate = new GpuDelegate(
      new GpuDelegate.Options().setSerializationParams(
        /* serializationDir= */ serializationDir,
        /* modelToken= */ modelToken));

    Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
      

בעת שימוש בתכונת הסידרה, ודא שהקוד שלך תואם לכללי היישום הבאים:

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