בדף הזה נסביר איך להמיר מודל TensorFlow
למודל LiteRT (מודל שעבר אופטימיזציה
פורמט FlatBuffer מזוהה על ידי
.tflite
) באמצעות ממיר LiteRT.
תהליך עבודה של המרות
התרשים הבא ממחיש את תהליך העבודה הכללי להמרה של המודל:
איור 1. תהליך עבודה של ממיר.
אפשר להמיר את המודל באחת מהדרכים הבאות:
- Python API (מומלץ): כך אפשר לשלב את ההמרה בצינור עיבוד הנתונים לפיתוח, להחיל אופטימיזציות, להוסיף מטא-נתונים ועוד משימות רבות שמפשטות את התהליך תהליך ההמרה.
- שורת פקודה: תמיכה זו תומכת רק בהמרה בסיסית של מודל.
API בשפת Python
קוד עזרה: למידע נוסף על ממיר LiteRT
API, מריצים את print(help(tf.lite.TFLiteConverter))
.
המרת מודל TensorFlow באמצעות
tf.lite.TFLiteConverter
מודל TensorFlow מאוחסן בפורמט SaveModel
נוצרו באמצעות ממשקי ה-API ברמה הכללית tf.keras.*
(מודל Keras) או
את ממשקי ה-API ברמה הנמוכה של tf.*
(שממנו יוצרים פונקציות קונקרטיות). בתור
כתוצאה מכך, יש לכם את שלוש האפשרויות הבאות (דוגמאות
):
tf.lite.TFLiteConverter.from_saved_model()
(מומלץ): המרה SavedModel.tf.lite.TFLiteConverter.from_keras_model()
: הפונקציה ממירה מודל Keras.tf.lite.TFLiteConverter.from_concrete_functions()
: השלים המרה פונקציות בטון.
המרת 'מודל שמור' (מומלץ)
הדוגמה הבאה מראה איך להמיר SavedModel ב-TensorFlow מודל Lite.
import tensorflow as tf
# Convert the model
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) # path to the SavedModel directory
tflite_model = converter.convert()
# Save the model.
with open('model.tflite', 'wb') as f:
f.write(tflite_model)
המרת מודל Keras
הדוגמה הבאה מראה איך להמיר מודל Keras ל-TensorFlow מודל Lite.
import tensorflow as tf
# Create a model using high-level tf.keras.* APIs
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(units=1, input_shape=[1]),
tf.keras.layers.Dense(units=16, activation='relu'),
tf.keras.layers.Dense(units=1)
])
model.compile(optimizer='sgd', loss='mean_squared_error') # compile the model
model.fit(x=[-1, 0, 1], y=[-3, -1, 1], epochs=5) # train the model
# (to generate a SavedModel) tf.saved_model.save(model, "saved_model_keras_dir")
# Convert the model.
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
# Save the model.
with open('model.tflite', 'wb') as f:
f.write(tflite_model)
המרת פונקציות בטון
בדוגמה הבאה אפשר לראות איך לבצע המרה פונקציות קונקרטיות מודל LiteRT.
import tensorflow as tf
# Create a model using low-level tf.* APIs
class Squared(tf.Module):
@tf.function(input_signature=[tf.TensorSpec(shape=[None], dtype=tf.float32)])
def __call__(self, x):
return tf.square(x)
model = Squared()
# (ro run your model) result = Squared(5.0) # This prints "25.0"
# (to generate a SavedModel) tf.saved_model.save(model, "saved_model_tf_dir")
concrete_func = model.__call__.get_concrete_function()
# Convert the model.
converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func],
model)
tflite_model = converter.convert()
# Save the model.
with open('model.tflite', 'wb') as f:
f.write(tflite_model)
תכונות אחרות
להפעיל אופטימיזציות. האופטימיזציה שבה נעשה שימוש היא קונטיזציה של אימון פוסט, מה שיכול לצמצם עוד יותר את זמן האחזור והגודל של המודל, עם הפסד מינימלי מדויקות.
להוסיף מטא-נתונים, כדי שיהיה קל יותר ליצור פלטפורמה קוד wrapper ספציפי במהלך פריסת מודלים במכשירים.
שגיאות שקשורות להמרות
ריכזנו כאן שגיאות נפוצות שקשורות להמרות והפתרונות שלהן:
שגיאה:
Some ops are not supported by the native TFLite runtime, you can enable TF kernels fallback using TF Select.
פתרון: השגיאה מתרחשת כשלמודל יש פעולות TF שאין להן בהטמעה תואמת של TFLite. אפשר לפתור את הבעיה עד באמצעות הפעלה של TF במודל TFLite (מומלץ). אם רוצים ליצור מודל באמצעות פעולות TFLite בלבד, אפשר להוסיף בקשה לתפעול TFLite החסר ב- בעיה מס' 21526 ב-GitHub (יש להוסיף תגובה אם הבקשה עדיין לא הוזכרה) או יצירת פעולה של TFLite בעצמך.
שגיאה:
.. is neither a custom op nor a flex op
פתרון: אם פעולת TF זו היא:
נתמך ב-TF: השגיאה מתרחשת מכיוון שההפעלה של TF חסרה רשימת היתרים (רשימה מקיפה של פעולות TF שנתמכות על ידי TFLite). אפשר לפתור את הבעיה באופן הבא:
לא נתמך ב-TF: השגיאה מתרחשת מכיוון ש-TFLite לא מודע ל אופרטור TF בהתאמה אישית שהגדרתם. אפשר לפתור את הבעיה באופן הבא:
- יצירת תפעול TF.
- להמיר את מודל ה-TF למודל TFLite.
- יצירת פעולה של TFLite ולהריץ את ההֶקֵּשׁ על ידי קישור שלו לסביבת זמן הריצה של TFLite.
כלי שורת הפקודה
אם
התקנת TensorFlow 2.x מ-pip, צריך להשתמש
הפקודה tflite_convert
. כדי להציג את כל הדגלים הזמינים צריך להשתמש
הפקודה הבאה:
$ tflite_convert --help
`--output_file`. Type: string. Full path of the output file.
`--saved_model_dir`. Type: string. Full path to the SavedModel directory.
`--keras_model_file`. Type: string. Full path to the Keras H5 model file.
`--enable_v1_converter`. Type: bool. (default False) Enables the converter and flags used in TF 1.x instead of TF 2.x.
You are required to provide the `--output_file` flag and either the `--saved_model_dir` or `--keras_model_file` flag.
אם יש לך את
מקור TensorFlow 2.x
שאני רוצה להפעיל את הממיר מהמקור הזה בלי ליצור
בתהליך התקנה של החבילה,
אפשר להחליף את 'tflite_convert
' עם
bazel run tensorflow/lite/python:tflite_convert --
בפקודה.
המרה של מודל שמור
tflite_convert \
--saved_model_dir=/tmp/mobilenet_saved_model \
--output_file=/tmp/mobilenet.tflite
המרת מודל Keras H5
tflite_convert \
--keras_model_file=/tmp/mobilenet_keras_model.h5 \
--output_file=/tmp/mobilenet.tflite