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

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

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

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

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

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

אפשר להמיר את המודל באמצעות אחת מהאפשרויות הבאות:

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

Python API

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

ממירים מודל TensorFlow באמצעות tf.lite.TFLiteConverter. מודל TensorFlow מאוחסן בפורמט savedModel, והוא נוצר באמצעות ממשקי ה-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)

המרת פונקציות בטון

הדוגמה הבאה ממחישה איך להמיר פונקציות בטון למודל TensorFlow Lite.

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