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 :
- 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.
- Ligne de commande : cette option n'accepte que la conversion de modèles de base.
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)
Convertissez un modèle TensorFlow 2.x à l'aide de
tf.lite.TFLiteConverter
. Un modèle TensorFlow 2.x est stocké au format SavedModel et généré à l'aide des APItf.keras.*
de haut niveau (un modèle Keras) ou des APItf.*
de bas niveau (à partir desquelles vous générez des fonctions concrètes). Par conséquent, vous disposez des trois options suivantes (vous trouverez des exemples dans les sections suivantes) :tf.lite.TFLiteConverter.from_saved_model()
(recommandé) : convertit un modèle SavedModel.tf.lite.TFLiteConverter.from_keras_model()
: convertit un modèle Keras.tf.lite.TFLiteConverter.from_concrete_functions()
: convertit des fonctions concrètes.
Convertissez un modèle TensorFlow 1.x à l'aide de
tf.compat.v1.lite.TFLiteConverter
(vous trouverez des exemples sur GitHub) :tf.compat.v1.lite.TFLiteConverter.from_saved_model()
: convertit un modèle SavedModel.tf.compat.v1.lite.TFLiteConverter.from_keras_model_file()
: convertit un modèle Keras.tf.compat.v1.lite.TFLiteConverter.from_session()
: convertit un modèle GraphDef à partir d'une session.tf.compat.v1.lite.TFLiteConverter.from_frozen_graph()
: convertit un modèle Frozen GraphDef à partir d'un fichier. Si vous disposez de points de contrôle, convertissez-le d'abord en fichier Frozen GraphDef, puis utilisez cette API comme indiqué ici.
Convertir un modèle SavedModel (recommandé)
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(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.
# Notes that for the versions earlier than TensorFlow 2.7, the
# from_concrete_functions API is able to work when there is only the first
# argument given:
# > converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func])
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)
Autres fonctionnalités
Appliquer des optimisations. Une optimisation couramment utilisée 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.
Ajoutez des métadonnées pour créer plus facilement du code de wrapper spécifique à la plate-forme lorsque vous déployez des modèles sur les appareils.
Erreurs de conversion
Voici les erreurs de conversion fréquentes, accompagnées de leur solution :
Erreur :
Some ops are not supported by the native TFLite runtime, you can enable TF kernels fallback using TF Select. See instructions: <a href="https://www.tensorflow.org/lite/guide/ops_select">https://www.tensorflow.org/lite/guide/ops_select</a> TF Select ops: ..., .., ...
Solution : l'erreur se produit lorsqu'aucune implémentation TFLite ne correspond aux opérations TF du modèle. Pour corriger ccette erreur, utilisez l'opération TF dans le modèle TFLite (recommandé). Si vous voulez générer un modèle avec des opérations TFLite uniquement, vous pouvez soit ajouter une requête pour l'opération TFLite manquante dans Problème GitHub n° 21526 (laissez un commentaire si votre requête n'a pas été déjà mentionnée), soit créer l'opération TFLite vous-même.
Erreur :
.. is neither a custom op nor a flex op
Solution : si cette opération TF est :
Compatible avec TF : l'erreur est due au fait que l'opération TF est absente de la liste d'autorisation (une liste exhaustive des opérations TF compatibles avec TFLite). Pour résoudre le problème, procédez comme suit :
Non compatible avec TF : l'erreur est due au fait que TFLite n'a pas connaissance de l'opérateur TF personnalisé que vous avez défini. Pour résoudre le problème, procédez comme suit :
- Créez l'opération TF.
- Convertissez le modèle TF en modèle TFLite.
- Créez l'opération TFLite et exécutez l'inférence en l'associant à l'environnement d'exécution TFLite.
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
Utilisez l'interpréteur TensorFlow Lite pour exécuter l'inférence sur un appareil client (mobile, intégré, etc.).