Convertisseur TensorFlow Lite

Le convertisseur TensorFlow Lite utilise un modèle TensorFlow et génère un modèle TensorFlow Lite (un format FlatBuffer optimisé, identifié par l'extension de fichier .tflite). Vous disposez des deux options suivantes pour utiliser le convertisseur :

  1. API Python (recommandée) : facilite la conversion de modèles dans le cadre d'un pipeline de développement de modèles, ainsi que l'application d'optimisations et l'ajout de métadonnées. Elle propose également une foule d'autres fonctionnalités.
  2. Ligne de commande : cette option n'accepte que la conversion de modèles de base.

Workflow de conversion TFLite

API Python

Code d'aide : pour identifier la version de TensorFlow installée, exécutez print(tf.__version__). Pour en savoir plus sur l'API de conversion TensorFlow Lite, exécutez print(help(tf.lite.TFLiteConverter)).

Si vous avez installé TensorFlow 2.x, vous avez le choix entre les deux options suivantes : (si vous avez installé TensorFlow 1.x, reportez-vous à GitHub)

L'exemple suivant montre comment convertir un modèle SavedModel en un modèle 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)

Convertir un modèle Keras

L'exemple suivant montre comment convertir un modèle Keras en un modèle 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)

Convertir des fonctions concrètes

L'exemple suivant montre comment convertir des fonctions concrètes en un modèle TensorFlow Lite.

import tensorflow as tf

# Create a model using low-level tf.* APIs
class Squared(tf.Module):
  @tf.function
  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])
tflite_model = converter.convert()

# Save the model.
with open('model.tflite', 'wb') as f:
  f.write(tflite_model)

Autres fonctionnalités

  • Appliquer des optimisations. Une optimisation utilisée couramment est la quantification post-entraînement qui permet de réduire davantage la latence et la taille du modèle avec une perte de justesse minimale.

  • Gérer les opérations non compatibles. Si votre modèle possède des opérateurs, vous disposez des options suivantes :

    1. Compatible dans TensorFlow, mais non compatible avec TensorFlow Lite : s'il existe des contraintes de taille, vous devez créer l'opérateur TensorFlow Lite. Sinon, il vous suffit d'utiliser des opérateurs TensorFlow dans votre modèle TensorFlow Lite.

    2. Non compatible avec TensorFlow : vous devez créer l'opérateur TensorFlow, puis créer l'opérateur TensorFlow Lite. Si la création de l'opérateur TensorFlow a échoué ou si vous ne souhaitez pas en créer un (cela n'étant pas recommandé, procédez avec précaution), vous pouvez toujours effectuer la conversion à l'aide de l'attribut custom_opdefs, puis créer directement l'opérateur TensorFlow Lite. L'attribut custom_opdefs est une chaîne contenant un ou plusieurs OpDef, ou protos de définition d'opérateur. Vous trouverez, ci-dessous, un exemple TFLiteAwesomeCustomOp avec une entrée, une sortie et deux attributs :

  converter.custom_opdefs="""name: 'TFLiteAwesomeCustomOp' input_arg:
  { name: 'In' type: DT_FLOAT } output_arg: { name: 'Out' type: DT_FLOAT }
  attr : { name: 'a1' type: 'float'} attr : { name: 'a2' type: 'list(float)'}"""

Outil de ligne de commande

Dans la mesure du possible, il est vivement recommandé d'utiliser l'API Python répertoriée ci-dessus.

Si vous avez installé TensorFlow 2.x à partir de pip, utilisez la commande tflite_convert comme suit : (si vous avez installé TensorFlow 2.x à partir de la source, vous pouvez remplacer "tflite_convert" par "bazel run //tensorflow/lite/python:tflite_convert --" dans les sections suivantes et si vous avez installé TensorFlow 1.x, reportez-vous à GitHub (référence, exemples))

tflite_convert : pour afficher tous les indicateurs disponibles, exécutez la commande suivante :

$ 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.

Convertir un modèle SavedModel

tflite_convert \
  --saved_model_dir=/tmp/mobilenet_saved_model \
  --output_file=/tmp/mobilenet.tflite

Convertir un modèle Keras H5

tflite_convert \
  --keras_model_file=/tmp/mobilenet_keras_model.h5 \
  --output_file=/tmp/mobilenet.tflite

Étapes suivantes

  • Ajoutez des métadonnées, ce qui facilite la création du code de wrapper spécifique à la plate-forme lors du déploiement de modèles sur les appareils.
  • Utilisez l'interpréteur TensorFlow Lite pour exécuter l'inférence sur un appareil client (mobile, intégré, etc.).