דף זה תורגם על ידי Cloud Translation API.
Switch to English

כימות לאחר אימון

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

שיטות אופטימיזציה

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

טֶכנִיקָה יתרונות חוּמרָה
כימות טווח דינמי פי 4 קטן יותר, מהירות 2x-3x מעבד
כימות שלם שלם פי 4 קטן יותר, פי 3 מהירות + מעבד, Edge TPU, מיקרו-בקרים
כימות Float16 האצת GPU קטנה יותר מעבד, GPU

עץ ההחלטות הבא יכול לעזור לקבוע איזו שיטת כימות לאחר אימון מתאימה ביותר למקרה השימוש שלך:

אפשרויות אופטימיזציה לאחר אימון

כימות טווח דינמי

הצורה הפשוטה ביותר של כימות לאחר אימון מכמתת סטטית רק את המשקולות מנקודה צפה למספר שלם, שיש לה 8 סיביות של דיוק:

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tflite_quant_model = converter.convert()

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

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

כימות שלם שלם

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

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

def representative_dataset():
  for data in tf.data.Dataset.from_tensor_slices((images)).batch(1).take(100):
    yield [data.astype(tf.float32)]

למטרות בדיקה, תוכלו להשתמש במערך דמה כדלקמן:

def representative_dataset():
    for _ in range(100):
      data = np.random.rand(1, 244, 244, 3)
      yield [data.astype(np.float32)]
 

מספר שלם עם ציפה חזרה (באמצעות קלט / פלט צף ברירת מחדל)

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

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset
tflite_quant_model = converter.convert()

מספר שלם בלבד

יצירת מודלים שלמים בלבד היא מקרה נפוץ עבור TensorFlow Lite עבור מיקרו - בקרים ו- TPU של Coral Edge .

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

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8  # or tf.uint8
converter.inference_output_type = tf.int8  # or tf.uint8
tflite_quant_model = converter.convert()

כימות Float16

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

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [tf.float16]
tflite_quant_model = converter.convert()

היתרונות של כימות float16 הם כדלקמן:

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

החסרונות של כימות float16 הם כדלקמן:

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

מספר שלם בלבד: הפעלות של 16 ביט עם משקולות של 8 ביט (ניסיוני)

זוהי תוכנית כימות ניסיונית. זה דומה לתכנית "מספר שלם בלבד", אך ההפעלות מכמתות על סמך הטווח שלהן ל -16 סיביות, המשקולות מכמתות במספר שלם של 8 סיביות והטיה מכמתה למספר שלם של 64 סיביות. זה נקרא כימות 16x8 עוד יותר.

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

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.representative_dataset = representative_dataset
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8]
tflite_quant_model = converter.convert()

אם כימות 16x8 אינה נתמכת עבור חלק מהמפעילים במודל, עדיין ניתן לכמת את המודל, אך מפעילים שאינם נתמכים נשמרים בתנופה. יש להוסיף את האפשרות הבאה ל- target_spec כדי לאפשר זאת.

import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.representative_dataset = representative_dataset
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.EXPERIMENTAL_TFLITE_BUILTINS_ACTIVATIONS_INT16_WEIGHTS_INT8,
tf.lite.OpsSet.TFLITE_BUILTINS]
tflite_quant_model = converter.convert()

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

החיסרון של כימות זה הוא:

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

הדרכה למצב כימות זה ניתן למצוא כאן .

דיוק המודל

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

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

ייצוג עבור טנסורים מכמתים

כימות של 8 סיביות מתקרבת לערכי נקודה צפה בעזרת הנוסחה הבאה.

$$real\_value = (int8\_value - zero\_point) \times scale$$

לייצוג שני חלקים עיקריים:

  • משקולות לכל ציר (aka לכל ערוץ) או משקולות פר טנסור המיוצגות על ידי ערכי השלמה של int8 two בטווח [-127, 127] עם נקודת אפס שווה ל- 0.

  • הפעלות / כניסות פר טנסור המיוצגות על ידי ערכי השלמה של int8 two בטווח [-128, 127], עם נקודת אפס בטווח [-128, 127].

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