בדף הזה מוסבר איך להמיר מודל TensorFlow למודל LiteRT (פורמט FlatBuffer שעבר אופטימיזציה ומזוהה על ידי סיומת הקובץ .tflite) באמצעות כלי ההמרה של LiteRT.
תהליך העבודה של ההמרה
בתרשים הבא מוצגת זרימת העבודה הכללית להמרת המודל:

איור 1. תהליך העבודה של המשתמש שביצע המרה.
אפשר להמיר את המודל באמצעות אחת מהאפשרויות הבאות:
- Python API (מומלץ): מאפשר לשלב את ההמרה בצינור הפיתוח, להחיל אופטימיזציות, להוסיף מטא-נתונים ולבצע משימות רבות אחרות שמפשטות את תהליך ההמרה.
- שורת פקודה: האפשרות הזו תומכת רק בהמרת מודל בסיסי.
Python API
קוד עזר: כדי לקבל מידע נוסף על LiteRT converter API, מריצים את הפקודה
print(help(tf.lite.TFLiteConverter)).
המרת מודל TensorFlow באמצעות
tf.lite.TFLiteConverter. מודל TensorFlow מאוחסן בפורמט SavedModel ונוצר באמצעות ממשקי 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 (מומלץ)
בדוגמה הבאה אפשר לראות איך ממירים 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 op במודל 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 -- בפקודה.
המרת SavedModel
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