Migrer votre code TFLite vers TF2

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 : remplacer tf.lite.constants.INT8 par tf.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 .