המרת RNN ב-TensorFlow Lite ל-TensorFlow Lite

סקירה כללית

ב-TensorFlow Lite יש תמיכה בהמרת מודלים של RNN ב-TensorFlow Lite לפעולות LSTM המשולבות ב-TensorFlow Lite. פעולות משולבות נועדו להשיג ביצועים מקסימליים של הטמעות הליבה (kernel) שבבסיסן, וכן לספק ממשק ברמה גבוהה יותר להגדרת טרנספורמציות מורכבות כמו קונטיזציה.

מכיוון שיש ב-TensorFlow וריאנטים רבים של ממשקי API של RNN, הגישה שלנו הייתה כפולה:

  1. לספק תמיכה מובנית בממשקי API סטנדרטיים של TensorFlow RNN, כמו Keras LSTM. זאת האפשרות המומלצת.
  2. יצירת ממשק בתשתית ההמרות עבור הטמעות של RNN בהגדרת המשתמש, כדי להתחבר ולהמיר ל-TensorFlow Lite. אנחנו מספקים כמה דוגמאות ייחודיות להמרה כזו באמצעות ממשקי LSTMCellSimple ו-LayerNormalizedLSTMCellSimple של lingvo.

ממשק API של Converter

התכונה היא חלק מגרסת TensorFlow 2.3. היא זמינה גם דרך tf-nightly Pip או מהראש.

פונקציונליות ההמרה הזו זמינה כשממירים ל-TensorFlow Lite באמצעות 'מודל שמירה' או ישירות ממודל Keras. דוגמאות לשימושים.

מהמודל שנשמר

# build a saved model. Here concrete_function is the exported function
# corresponding to the TensorFlow model containing one or more
# Keras LSTM layers.
saved_model, saved_model_dir = build_saved_model_lstm(...)
saved_model.save(saved_model_dir, save_format="tf", signatures=concrete_func)

# Convert the model.
converter = TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()

ממודל Keras

# build a Keras model
keras_model = build_keras_lstm(...)

# Convert the model.
converter = TFLiteConverter.from_keras_model(keras_model)
tflite_model = converter.convert()

דוגמה

Keras LSTM ל-TensorFlow Lite Colab ממחיש את השימוש מקצה לקצה באמצעות המתרגם TensorFlow Lite.

תמיכה בממשקי API של TensorFlow RNNs

אנחנו תומכים בהמרה מתוך Keras LSTM ל-TensorFlow Lite. איך זה עובד? תוכלו להיעזר בממשק Keras LSTM ובלוגיקת ההמרות כאן.

חשוב גם להדגיש את חוזה ה-LSTM של TensorFlow Lite ביחס להגדרת הפעולה של Keras:

  1. המאפיין 0 של ה-tensor input הוא גודל האצווה.
  2. המאפיין 0 של ה-tensor recurrent_weight הוא מספר הפלטים.
  3. רכיבי ה-tensor של weight ו-recurrent_kernel מתחלפים.
  4. המשקל המוחלף, גורמי ה-tensor recurrent_kernel ו-bias שעברו טרנספורמציה מפוצלים ל-4 טנטים בגודל שווה לאורך המאפיין 0. הסוגים האלה מתאימים לשער קלט, שער זכרון, תא ושער פלט.

וריאנטים של Keras LSTM

זמן

המשתמשים יכולים לבחור 'גדול' או 'ללא 'יותר זמן'. Keras LSTM מוסיף מאפיין עיקרי במאפיינים של הפונקציה def. עבור LSTM של רצף חד-כיווני, אנחנו יכולים למפות בקלות אל מאפיין זמן ראשי של unidirecional_sequence_lstm's.

BiDirectional LSTM

אפשר להטמיע LSTM דו-כיווני באמצעות שתי שכבות Keras LSTM – אחת קדימה ואחת אחורה, כאן אפשר לראות דוגמאות. כשאנחנו רואים את המאפיין go_backward, אנחנו מזהים אותו כ-LSTM לאחור, ואז אנחנו מקבצים יחד את LSTM קדימה ואחורה. זו עבודה עתידית. בשלב הזה, נוצרות שתי פעולות UnidirectionalSequenceLSTM במודל TensorFlow Lite.

דוגמאות להמרות LSTM שהוגדרו על ידי המשתמש

ב-TensorFlow Lite יש גם דרך להמיר הטמעות LSTM בהגדרת המשתמש. בדוגמה הזו, אנחנו משתמשים ב-LSTM של Lingvo. פרטים נוספים זמינים בממשק lingvo.LSTMCellSimple ובלוגיקת ההמרות כאן. כאן מוצגת דוגמה נוספת להגדרות LSTM של Lingvo בממשק lingvo.LayerNormalizedLSTMCellSimple.

'Bring your your TensorFlow RNN' to TensorFlow Lite

אם ממשק ה-RNN של המשתמש שונה מהממשקים הרגילים שנתמכים, יש לכם כמה אפשרויות:

אפשרות 1: כתיבת קוד מתאם ב-TensorFlow python כדי להתאים את ממשק ה-RNN לממשק ה-RNN של Keras. כלומר, פונקציית tf.function עם הערת tf_embeds בפונקציה של ממשק ה-RNN שנוצרת זהה לזו שנוצרה על ידי שכבת Keras LSTM. לאחר מכן, אותו API של ההמרות שמשמש ל-Keras LSTM יפעל.

אפשרות 2: אם אין אפשרות לעשות זאת (למשל, ב-Keras LSTM חסרה פונקציונליות מסוימת שנחשפת כרגע על ידי פעולת ה-LSTM המשולבת של TensorFlow Lite, כמו נורמליזציה של שכבות), על ידי כתיבה של קוד המרה מותאם אישית וחיבור לפונקציות MLIR-pass של ההכנה לפונקציות מורכב כאן, מרחיבים את ממיר ה-TensorFlow Lite צריך להתייחס לממשק של הפונקציה כמו לחוזה API, ועליו להכיל את הארגומנטים הנדרשים כדי לבצע המרה לפעולות fused TensorFlow Lite LSTM – כלומר קלט, הטיה, משקולות, היטל, נורמליזציה של שכבה וכו'. עדיף שה-tensors שמועברים כארגומנטים לפונקציה הזו יהיו בעלי דירוג ידוע (למשל IRTypes, כלומר IRTypes). כך קל יותר לכתוב קוד המרות שיכול להניח שה-tensors האלה הם RankedTensorType, ועוזר להפוך אותם ל-tensors מדורגים התואמים לאופרנדים של TensorFlow Lite.

דוגמה מלאה לתהליך המרה כזה היא ההמרה LSTMCellSimple ל-TensorFlow Lite של Lingvo.

הרכיב LSTMCellSimple ב-Lingvo מוגדר כאן. אפשר להמיר מודלים שהוכשרו באמצעות תא ה-LSTM הזה ל-TensorFlow Lite באופן הבא:

  1. כוללים את כל השימושים של LSTMCellSimple ב-tf.function עם הערת tf_embeds שמסומנת בתווית כזו (למשל, lingvo.LSTMCellSimple יכול להיות שם תקין להערה). מוודאים שה-tf.function שנוצרת תואם לממשק של הפונקציה שמצופה בקוד ההמרות. זהו חוזה בין מחבר המודל שמוסיף את ההערה לבין קוד ההמרה.
  2. מרחיבים את המעבר של הפונקציות המורכבות מהכנה ומחברים כדי לחבר קובץ פעיל מרוכב בהתאמה אישית אל המרת פעולות ב-TensorFlow Lite משולב של LSTM. למידע נוסף, ראו LSTMCellSimple.

    חוזה ההמרה:

  3. משקל ו-projection מותנים משתנים.

  4. הערכים {input, recurrent} עד {cell, input gate, forget gate, output gate} מחלצים על ידי פריסה של Tensor המשקל המחודש.

  5. מחלצים את הערכים {bias} עד {cell, input gate, forget gate, output gate} על ידי חיתוך של Tensor ההטיה.

  6. ההיטל מחולץ על ידי חיתוך Tensor ההיטל המהופך.

  7. המרה דומה נכתבת עבור LayerNormalizedLSTMCellSimple.

  8. תוכלו לעשות שימוש חוזר בשאר תשתית ההמרות של TensorFlow Lite, כולל כל אישורי ה-MLIR שהוגדרו, והייצוא הסופי אל TensorFlow Lite Flabuffer.

מגבלות/בעיות מוכרות

  1. בשלב הזה יש תמיכה רק בהמרה של Keras LSTM (התנהגות ברירת המחדל ב-Keras) המרת Keras LSTM המציינת היא עבודה עתידית.
  2. עדיין אפשר ליצור מודל של שכבת Keras LSTM באמצעות שכבת Keras LSTM ללא שמירת מצב, ולנהל את המצב באופן מפורש בתוכנית המשתמש. עדיין אפשר להמיר תוכנית TensorFlow כזו ל-TensorFlow Lite באמצעות התכונה שמתוארת כאן.
  3. המודל של LSTM דו-כיווני הוא כרגע שתי פעולות UnidirectionalSequenceLSTM ב-TensorFlow Lite. הוא יוחלף בהפעלה אחת של BidirectionalSequenceLSTM