המרת מודלים של TensorFlow

בדף הזה נסביר איך להמיר מודל TensorFlow למודל LiteRT (מודל שעבר אופטימיזציה פורמט FlatBuffer מזוהה על ידי .tflite) באמצעות ממיר LiteRT.

תהליך עבודה של המרות

התרשים הבא ממחיש את תהליך העבודה הכללי להמרה של המודל:

תהליך עבודה של ממיר TFLite

איור 1. תהליך עבודה של ממיר.

אפשר להמיר את המודל באחת מהדרכים הבאות:

  1. Python API (מומלץ): כך אפשר לשלב את ההמרה בצינור עיבוד הנתונים לפיתוח, להחיל אופטימיזציות, להוסיף מטא-נתונים ועוד משימות רבות שמפשטות את התהליך תהליך ההמרה.
  2. שורת פקודה: תמיכה זו תומכת רק בהמרה בסיסית של מודל.

API בשפת Python

קוד עזרה: למידע נוסף על ממיר LiteRT API, מריצים את print(help(tf.lite.TFLiteConverter)).

המרת מודל TensorFlow באמצעות tf.lite.TFLiteConverter מודל TensorFlow מאוחסן בפורמט SaveModel נוצרו באמצעות ממשקי ה-API ברמה הכללית tf.keras.* (מודל Keras) או את ממשקי ה-API ברמה הנמוכה של tf.* (שממנו יוצרים פונקציות קונקרטיות). בתור כתוצאה מכך, יש לכם את שלוש האפשרויות הבאות (דוגמאות ):

הדוגמה הבאה מראה איך להמיר 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 ספציפי במהלך פריסת מודלים במכשירים.

שגיאות שקשורות להמרות

ריכזנו כאן שגיאות נפוצות שקשורות להמרות והפתרונות שלהן:

כלי שורת הפקודה

אם התקנת 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