המרת TensorFlow RNN ל- TensorFlow Lite

סקירה כללית

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

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

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

ממיר API

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

פונקציונליות המרה זו זמינה בעת המרה ל-TensorFlow Lite באמצעות SavedModel או ישירות מדגם 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()

מדגם קרס

# 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 RNN נתמכים

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

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

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

גרסאות LSTM של קרס

ראשי זמן

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

LSTM דו כיווני

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

דוגמאות להמרת LSTM בהגדרת משתמש

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

"תביא את TensorFlow RNN משלך" ל-TensorFlow Lite

אם ממשק ה-RNN של משתמש שונה מהממשק הנתמך הסטנדרטי, ישנן כמה אפשרויות:

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

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

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

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

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

    חוזה ההמרה:

  3. טנסורי משקל והקרנה מועברים.

  4. ה- {input, recurrent} ל- {cell, input gate, forget gate, output gate} נשלפים על ידי חיתוך טנזור המשקל שעבר טרנספוזיציה.

  5. ה- {הטיה} ל- {תא, שער כניסה, שער שכח, שער פלט} נשלפים על ידי חיתוך טנסור ההטיה.

  6. ההקרנה נחלצת על ידי חיתוך טנזור ההקרנה שעבר טרנספוזיציה.

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

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

בעיות/מגבלות ידועות

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