Ferramenta de autoria TFLite

Ver no TensorFlow.org Executar no Google Colab Ver fonte no GitHub Baixar caderno

TensorFlow Lite Authoring API fornece uma maneira de manter seus tf.function modelos compatibile com TensorFlow Lite.

Configurar

import tensorflow as tf

Problema de compatibilidade entre TensorFlow e TensorFlow Lite

Se quiser usar seu modelo TF em dispositivos, você precisa convertê-lo em um modelo TFLite para usá-lo a partir do intérprete TFLite. Durante a conversão, você pode encontrar um erro de compatibilidade devido a operações do TensorFlow incompatíveis com o conjunto de operações integradas TFLite.

Este é um tipo de problema irritante. Como você pode detectá-lo mais cedo, como no momento da criação do modelo?

Note-se que o seguinte código irá falhar na converter.convert() chamada.

@tf.function(input_signature=[
    tf.TensorSpec(shape=[None], dtype=tf.float32)
])
def f(x):
  return tf.cosh(x)

# Evaluate the tf.function
result = f(tf.constant([0.0]))
print (f"result = {result}")
result = [1.]
# Convert the tf.function
converter = tf.lite.TFLiteConverter.from_concrete_functions(
    [f.get_concrete_function()], f)
try:
  fb_model = converter.convert()
except Exception as e:
  print(f"Got an exception: {e}")
Got an exception: /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py:746:0: error: 'tf.Cosh' op is neither a custom op nor a flex op
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py:2538:0: note: called from
/tmp/ipykernel_11095/885400331.py:5:0: note: called from
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/func_graph.py:1125:0: note: called from
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py:672:0: note: called from
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/func_graph.py:1143:0: note: called from
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py:3402:0: note: called from
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py:3557:0: note: called from
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py:3157:0: note: called from
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py:781:0: note: called from
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py:746:0: note: Error code: ERROR_NEEDS_FLEX_OPS
<unknown>:0: error: failed while converting: 'main': 
Some ops are not supported by the native TFLite runtime, you can enable TF kernels fallback using TF Select. See instructions: https://www.tensorflow.org/lite/guide/ops_select 
TF Select ops: Cosh
Details:
    tf.Cosh(tensor<?xf32>) -> (tensor<?xf32>) : {device = ""}
2021-11-15 12:14:34.777684: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
2021-11-15 12:14:34.777724: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
loc(callsite("Cosh"("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py":746:0) at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py":2538:0 at callsite("/tmp/ipykernel_11095/885400331.py":5:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/func_graph.py":1125:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py":672:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/func_graph.py":1143:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py":3402:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py":3557:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py":3157:0 at "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py":781:0)))))))))): error: 'tf.Cosh' op is neither a custom op nor a flex op
error: failed while converting: 'main': 
Some ops are not supported by the native TFLite runtime, you can enable TF kernels fallback using TF Select. See instructions: https://www.tensorflow.org/lite/guide/ops_select 
TF Select ops: Cosh
Details:
    tf.Cosh(tensor<?xf32>) -> (tensor<?xf32>) : {device = ""}

Uso de autoria com reconhecimento de alvo simples

Introduzimos a API de autoria para detectar o problema de compatibilidade do TensorFlow Lite durante o tempo de criação do modelo.

Você só precisa adicionar @tf.lite.experimental.authoring.compatible decorador de quebrar a tf.function modelo para verificar a compatibilidade TFLite.

Depois disso, a compatibilidade será verificada automaticamente ao avaliar seu modelo.

@tf.lite.experimental.authoring.compatible
@tf.function(input_signature=[
    tf.TensorSpec(shape=[None], dtype=tf.float32)
])
def f(x):
  return tf.cosh(x)

# Evaluate the tf.function
result = f(tf.constant([0.0]))
print (f"result = {result}")
COMPATIBILITY WARNING: op 'tf.Cosh' require(s) "Select TF Ops" for model conversion for TensorFlow Lite. https://www.tensorflow.org/lite/guide/ops_select
Op: tf.Cosh

  - /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py:746
  - /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py:2538
  - /tmp/ipykernel_11095/885400331.py:5

result = [1.]
2021-11-15 12:14:34.816991: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
2021-11-15 12:14:34.817023: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
loc(callsite("Cosh"("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py":746:0) at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py":2538:0 at callsite("/tmp/ipykernel_11095/885400331.py":5:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/func_graph.py":1125:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py":672:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/func_graph.py":1143:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py":3402:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py":3557:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py":3157:0 at "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py":781:0)))))))))): error: 'tf.Cosh' op is neither a custom op nor a flex op
error: failed while converting: 'main': 
Some ops are not supported by the native TFLite runtime, you can enable TF kernels fallback using TF Select. See instructions: https://www.tensorflow.org/lite/guide/ops_select 
TF Select ops: Cosh
Details:
    tf.Cosh(tensor<?xf32>) -> (tensor<?xf32>) : {device = ""}

Se qualquer problema de compatibilidade TensorFlow Lite é encontrado, ele irá mostrar COMPATIBILITY WARNING ou COMPATIBILITY ERROR com a localização exata do op problemático. Neste exemplo, ele mostra a localização dos tf.Cosh op em seu modelo tf.function.

Você também pode verificar o log de compatibilidade com o <function_name>.get_compatibility_log() método.

compatibility_log = '\n'.join(f.get_compatibility_log())
print (f"compatibility_log = {compatibility_log}")
compatibility_log = COMPATIBILITY WARNING: op 'tf.Cosh' require(s) "Select TF Ops" for model conversion for TensorFlow Lite. https://www.tensorflow.org/lite/guide/ops_select
Op: tf.Cosh

  - /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py:746
  - /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py:2538
  - /tmp/ipykernel_11095/885400331.py:5

Crie uma exceção para uma incompatibilidade

Você pode fornecer uma opção para o @tf.lite.experimental.authoring.compatible decorador. O raise_exception opção dá-lhe uma exceção quando você está tentando avaliar o modelo decorados.

@tf.lite.experimental.authoring.compatible(raise_exception=True)
@tf.function(input_signature=[
    tf.TensorSpec(shape=[None], dtype=tf.float32)
])
def f(x):
  return tf.cosh(x)

# Evaluate the tf.function
try:
  result = f(tf.constant([0.0]))
  print (f"result = {result}")
except Exception as e:
  print(f"Got an exception: {e}")
COMPATIBILITY WARNING: op 'tf.Cosh' require(s) "Select TF Ops" for model conversion for TensorFlow Lite. https://www.tensorflow.org/lite/guide/ops_select
Op: tf.Cosh

  - /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py:746
  - /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py:2538
  - /tmp/ipykernel_11095/885400331.py:5

Got an exception: CompatibilityException at <tensorflow.python.eager.def_function.Function object at 0x7ff2e016fc50>
2021-11-15 12:14:34.863629: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
2021-11-15 12:14:34.863657: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
loc(callsite("Cosh"("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py":746:0) at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py":2538:0 at callsite("/tmp/ipykernel_11095/885400331.py":5:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/func_graph.py":1125:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py":672:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/func_graph.py":1143:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py":3402:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py":3557:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py":3157:0 at "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py":781:0)))))))))): error: 'tf.Cosh' op is neither a custom op nor a flex op
error: failed while converting: 'main': 
Some ops are not supported by the native TFLite runtime, you can enable TF kernels fallback using TF Select. See instructions: https://www.tensorflow.org/lite/guide/ops_select 
TF Select ops: Cosh
Details:
    tf.Cosh(tensor<?xf32>) -> (tensor<?xf32>) : {device = ""}

Especificando o uso de "Selecionar operações TF"

Se você já está ciente de Select TF ops uso, você pode dizer isso para o API Authoring definindo converter_target_spec . É o mesmo tf.lite.TargetSpec objeto que você vai usá-lo para tf.lite.TFLiteConverter API.

target_spec = tf.lite.TargetSpec()
target_spec.supported_ops = [
    tf.lite.OpsSet.TFLITE_BUILTINS,
    tf.lite.OpsSet.SELECT_TF_OPS,
]
@tf.lite.experimental.authoring.compatible(converter_target_spec=target_spec, raise_exception=True)
@tf.function(input_signature=[
    tf.TensorSpec(shape=[None], dtype=tf.float32)
])
def f(x):
  return tf.cosh(x)

# Evaluate the tf.function
result = f(tf.constant([0.0]))
print (f"result = {result}")
2021-11-15 12:14:34.921628: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
WARNING:absl:Buffer deduplication procedure will be skipped when flatbuffer library is not properly loaded
result = [1.]
2021-11-15 12:14:34.921661: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
2021-11-15 12:14:34.934915: W tensorflow/compiler/mlir/lite/flatbuffer_export.cc:1891] TFLite interpreter needs to link Flex delegate in order to run the model since it contains the following Select TFop(s):
Flex ops: FlexCosh
Details:
    tf.Cosh(tensor<?xf32>) -> (tensor<?xf32>) : {device = ""}
See instructions: https://www.tensorflow.org/lite/guide/ops_select

Verificando a compatibilidade da GPU

Se você quiser garantir o seu modelo é compatibile com delegado GPU de TensorFlow Lite, você pode definir experimental_supported_backends de tf.lite.TargetSpec .

O exemplo a seguir mostra como garantir a compatibilidade do delegado de GPU do seu modelo. Observe que este modelo tem problemas de compatibilidade, pois usa um tensor 2D com o operador tf.slice e o operador tf.cosh sem suporte. Você vai ver dois COMPATIBILITY WARNING com as informações de localização.

target_spec = tf.lite.TargetSpec()
target_spec.supported_ops = [
    tf.lite.OpsSet.TFLITE_BUILTINS,
    tf.lite.OpsSet.SELECT_TF_OPS,
]
target_spec.experimental_supported_backends = ["GPU"]
@tf.lite.experimental.authoring.compatible(converter_target_spec=target_spec)
@tf.function(input_signature=[
    tf.TensorSpec(shape=[4, 4], dtype=tf.float32)
])
def func(x):
  y = tf.cosh(x)
  return y + tf.slice(x, [1, 1], [1, 1])

result = func(tf.ones(shape=(4,4), dtype=tf.float32))
'tfl.slice' op is not GPU compatible: SLICE supports for 3 or 4 dimensional tensors only, but node has 2 dimensional tensors.

  - /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/util/dispatch.py:1096
  - /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/util/traceback_utils.py:150
  - /tmp/ipykernel_11095/3833138856.py:13

'tf.Cosh' op is not GPU compatible: Not supported custom op FlexCosh

  - /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py:746
  - /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py:2538
  - /tmp/ipykernel_11095/3833138856.py:12

COMPATIBILITY WARNING: op 'tf.Cosh, tfl.slice' aren't compatible with TensorFlow Lite GPU delegate. https://www.tensorflow.org/lite/performance/gpu
2021-11-15 12:14:34.998044: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:363] Ignored output_format.
2021-11-15 12:14:34.998077: W tensorflow/compiler/mlir/lite/python/tf_tfl_flatbuffer_helpers.cc:366] Ignored drop_control_dependency.
2021-11-15 12:14:35.012457: W tensorflow/compiler/mlir/lite/flatbuffer_export.cc:1891] TFLite interpreter needs to link Flex delegate in order to run the model since it contains the following Select TFop(s):
Flex ops: FlexCosh
Details:
    tf.Cosh(tensor<4x4xf32>) -> (tensor<4x4xf32>) : {device = ""}
See instructions: https://www.tensorflow.org/lite/guide/ops_select
loc(callsite("Cosh"("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py":746:0) at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/gen_math_ops.py":2538:0 at callsite("/tmp/ipykernel_11095/3833138856.py":12:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/func_graph.py":1125:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py":672:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/func_graph.py":1143:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py":3402:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py":3557:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py":3157:0 at "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py":781:0)))))))))): error: 'tf.Cosh' op is not GPU compatible: Not supported custom op FlexCosh
loc(callsite("Slice"("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/util/dispatch.py":1096:0) at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/util/traceback_utils.py":150:0 at callsite("/tmp/ipykernel_11095/3833138856.py":13:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/func_graph.py":1125:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py":672:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/framework/func_graph.py":1143:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py":3402:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py":3557:0 at callsite("/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/function.py":3157:0 at "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py":781:0)))))))))): error: 'tfl.slice' op is not GPU compatible: SLICE supports for 3 or 4 dimensional tensors only, but node has 2 dimensional tensors.

Consulte Mais informação

Para obter mais informações, consulte: