Voir sur TensorFlow.org | Exécuter dans Google Colab | Voir la source sur GitHub | Télécharger le cahier |
TensorFlow Lite (TFLite) est un ensemble d'outils qui aide les développeurs à exécuter l'inférence ML sur l'appareil (appareils mobiles, intégrés et IoT). Le convertisseur TFLite est l'un de ces outils qui convertit les modèles TF existants en un format de modèle TFLite optimisé pouvant être exécuté efficacement sur l'appareil.
Dans ce document, vous apprendrez quelles modifications vous devez apporter à votre code de conversion TF vers TFLite, suivi de quelques exemples qui font la même chose.
Modifications de votre code de conversion TF en TFLite
Si vous utilisez un ancien format de modèle TF1 (fichier Keras, GraphDef gelé, points de contrôle, tf.Session, etc.), mettez-le à jour vers TF1/TF2 SavedModel et utilisez l'API de conversion TF2
tf.lite.TFLiteConverter.from_saved_model(...)
pour le convertir en un modèle TFLite (reportez-vous au tableau 1).Mettez à jour les drapeaux de l'API du convertisseur (reportez-vous au tableau 2).
Supprimez les API héritées telles que
tf.lite.constants
. (par exemple : remplacertf.lite.constants.INT8
partf.int8
)
// Tableau 1 // Mise à jour de l'API TFLite Python Converter
API TF1 | API TF2 |
---|---|
tf.lite.TFLiteConverter.from_saved_model('saved_model/',..) | prise en charge |
tf.lite.TFLiteConverter.from_keras_model_file('model.h5',..) | supprimé (mise à jour au format SavedModel) |
tf.lite.TFLiteConverter.from_frozen_graph('model.pb',..) | supprimé (mise à jour au format SavedModel) |
tf.lite.TFLiteConverter.from_session(sess,...) | supprimé (mise à jour au format SavedModel) |
// Tableau 2 // Mise à jour des drapeaux de l'API TFLite Python Converter
API TF1 | API TF2 |
---|---|
allow_custom_ops optimizations representative_dataset target_spec inference_input_type inference_output_type experimental_new_converter experimental_new_quantizer | prise en charge |
input_tensors output_tensors input_arrays_with_shape output_arrays experimental_debug_info_func | supprimé (arguments d'API de convertisseur non pris en charge) |
change_concat_input_ranges default_ranges_stats get_input_arrays() inference_type quantized_input_stats reorder_across_fake_quant | supprimé (workflows de quantification non pris en charge) |
conversion_summary_dir dump_graphviz_dir dump_graphviz_video | supprimé (au lieu de cela, visualisez les modèles à l'aide de Netron ou visualize.py ) |
output_format drop_control_dependency | supprimé (fonctionnalités non prises en charge dans TF2) |
Exemples
Vous allez maintenant parcourir quelques exemples pour convertir les anciens modèles TF1 en TF1/TF2 SavedModels, puis les convertir en modèles TF2 TFLite.
Installer
Commencez par les importations TensorFlow nécessaires.
import tensorflow as tf
import tensorflow.compat.v1 as tf1
import numpy as np
import logging
logger = tf.get_logger()
logger.setLevel(logging.ERROR)
import shutil
def remove_dir(path):
try:
shutil.rmtree(path)
except:
pass
Créez tous les formats de modèles TF1 nécessaires.
# Create a TF1 SavedModel
SAVED_MODEL_DIR = "tf_saved_model/"
remove_dir(SAVED_MODEL_DIR)
with tf1.Graph().as_default() as g:
with tf1.Session() as sess:
input = tf1.placeholder(tf.float32, shape=(3,), name='input')
output = input + 2
# print("result: ", sess.run(output, {input: [0., 2., 4.]}))
tf1.saved_model.simple_save(
sess, SAVED_MODEL_DIR,
inputs={'input': input},
outputs={'output': output})
print("TF1 SavedModel path: ", SAVED_MODEL_DIR)
# Create a TF1 Keras model
KERAS_MODEL_PATH = 'tf_keras_model.h5'
model = tf1.keras.models.Sequential([
tf1.keras.layers.InputLayer(input_shape=(128, 128, 3,), name='input'),
tf1.keras.layers.Dense(units=16, input_shape=(128, 128, 3,), activation='relu'),
tf1.keras.layers.Dense(units=1, name='output')
])
model.save(KERAS_MODEL_PATH, save_format='h5')
print("TF1 Keras Model path: ", KERAS_MODEL_PATH)
# Create a TF1 frozen GraphDef model
GRAPH_DEF_MODEL_PATH = tf.keras.utils.get_file(
'mobilenet_v1_0.25_128',
origin='https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_0.25_128_frozen.tgz',
untar=True,
) + '/frozen_graph.pb'
print("TF1 frozen GraphDef path: ", GRAPH_DEF_MODEL_PATH)
TF1 SavedModel path: tf_saved_model/ TF1 Keras Model path: tf_keras_model.h5 Downloading data from https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_0.25_128_frozen.tgz 2621440/2617289 [==============================] - 0s 0us/step 2629632/2617289 [==============================] - 0s 0us/step TF1 frozen GraphDef path: /home/kbuilder/.keras/datasets/mobilenet_v1_0.25_128/frozen_graph.pb
1. Convertir un TF1 SavedModel en un modèle TFLite
Avant : Convertir avec TF1
Il s'agit d'un code typique pour la conversion TFlite de style TF1.
converter = tf1.lite.TFLiteConverter.from_saved_model(
saved_model_dir=SAVED_MODEL_DIR,
input_arrays=['input'],
input_shapes={'input' : [3]}
)
converter.optimizations = {tf.lite.Optimize.DEFAULT}
converter.change_concat_input_ranges = True
tflite_model = converter.convert()
# Ignore warning: "Use '@tf.function' or '@defun' to decorate the function."
2021-09-22 20:02:56.143221: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format. 2021-09-22 20:02:56.143267: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency. 2021-09-22 20:02:56.143274: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.
Après : Conversion avec TF2
Convertissez directement le TF1 SavedModel en un modèle TFLite, avec un jeu d'indicateurs de convertisseur v2 plus petit.
# Convert TF1 SavedModel to a TFLite model.
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir=SAVED_MODEL_DIR)
converter.optimizations = {tf.lite.Optimize.DEFAULT}
tflite_model = converter.convert()
2021-09-22 20:02:56.207882: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format. 2021-09-22 20:02:56.207923: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency. 2021-09-22 20:02:56.207930: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.
2. Convertir un fichier de modèle TF1 Keras en modèle TFLite
Avant : Convertir avec TF1
Il s'agit d'un code typique pour la conversion TFlite de style TF1.
converter = tf1.lite.TFLiteConverter.from_keras_model_file(model_file=KERAS_MODEL_PATH)
converter.optimizations = {tf.lite.Optimize.DEFAULT}
converter.change_concat_input_ranges = True
tflite_model = converter.convert()
2021-09-22 20:02:56.608343: W tensorflow/python/util/util.cc:348] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them. 2021-09-22 20:02:57.119836: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format. 2021-09-22 20:02:57.119881: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency. 2021-09-22 20:02:57.119888: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.
Après : Conversion avec TF2
Tout d'abord, convertissez le fichier de modèle TF1 Keras en un TF2 SavedModel, puis convertissez-le en un modèle TFLite, avec un jeu d'indicateurs de convertisseur v2 plus petit.
# Convert TF1 Keras model file to TF2 SavedModel.
model = tf.keras.models.load_model(KERAS_MODEL_PATH)
model.save(filepath='saved_model_2/')
# Convert TF2 SavedModel to a TFLite model.
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir='saved_model_2/')
tflite_model = converter.convert()
2021-09-22 20:02:57.943564: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format. 2021-09-22 20:02:57.943608: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency. 2021-09-22 20:02:57.943614: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.
3. Convertir un GraphDef gelé TF1 en un modèle TFLite
Avant : Convertir avec TF1
Il s'agit d'un code typique pour la conversion TFlite de style TF1.
converter = tf1.lite.TFLiteConverter.from_frozen_graph(
graph_def_file=GRAPH_DEF_MODEL_PATH,
input_arrays=['input'],
input_shapes={'input' : [1, 128, 128, 3]},
output_arrays=['MobilenetV1/Predictions/Softmax'],
)
converter.optimizations = {tf.lite.Optimize.DEFAULT}
converter.change_concat_input_ranges = True
tflite_model = converter.convert()
2021-09-22 20:02:58.139650: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format. 2021-09-22 20:02:58.139707: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency. 2021-09-22 20:02:58.139721: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.
Après : Conversion avec TF2
Tout d'abord, convertissez le GraphDef gelé TF1 en un SavedModel TF1, puis convertissez-le en un modèle TFLite, avec un jeu d'indicateurs de convertisseur v2 plus petit.
## Convert TF1 frozen Graph to TF1 SavedModel.
# Load the graph as a v1.GraphDef
import pathlib
gdef = tf.compat.v1.GraphDef()
gdef.ParseFromString(pathlib.Path(GRAPH_DEF_MODEL_PATH).read_bytes())
# Convert the GraphDef to a tf.Graph
with tf.Graph().as_default() as g:
tf.graph_util.import_graph_def(gdef, name="")
# Lookup the input and output tensors.
input_tensor = g.get_tensor_by_name('input:0')
output_tensor = g.get_tensor_by_name('MobilenetV1/Predictions/Softmax:0')
# Save the graph as a TF1 Savedmodel
remove_dir('saved_model_3/')
with tf.compat.v1.Session(graph=g) as s:
tf.compat.v1.saved_model.simple_save(
session=s,
export_dir='saved_model_3/',
inputs={'input':input_tensor},
outputs={'output':output_tensor})
# Convert TF1 SavedModel to a TFLite model.
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir='saved_model_3/')
converter.optimizations = {tf.lite.Optimize.DEFAULT}
tflite_model = converter.convert()
2021-09-22 20:02:58.874490: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:351] Ignored output_format. 2021-09-22 20:02:58.874538: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:354] Ignored drop_control_dependency. 2021-09-22 20:02:58.874545: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:360] Ignored change_concat_input_ranges.
Lectures complémentaires
- Reportez-vous au guide TFLite pour en savoir plus sur les flux de travail et les dernières fonctionnalités.
- Si vous utilisez du code TF1 ou des formats de modèle hérités de TF1 (fichiers Keras
.h5
, GraphDef.pb
, etc.), veuillez mettre à jour votre code et migrer vos modèles au format TF2 SavedModel .