Ver en TensorFlow.org | Ejecutar en Google Colab | Ver fuente en GitHub | Descargar cuaderno |
TensorFlow Lite Autoría API proporciona una forma de mantener sus tf.function
modelos compatibile con TensorFlow Lite.
Configuración
import tensorflow as tf
Problema de compatibilidad de TensorFlow a TensorFlow Lite
Si desea usar su modelo TF en dispositivos, debe convertirlo a un modelo TFLite para usarlo desde el intérprete TFLite. Durante la conversión, es posible que encuentre un error de compatibilidad debido a operaciones de TensorFlow no admitidas por el conjunto de operaciones integrado de TFLite.
Este es un problema molesto. ¿Cómo puede detectarlo antes, como el tiempo de creación del modelo?
Tenga en cuenta que el siguiente código fallará en la converter.convert()
llamada.
@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 simple de Target Aware Authoring
Introdujimos la API de creación para detectar el problema de compatibilidad de TensorFlow Lite durante el tiempo de creación del modelo.
Sólo tiene que añadir @tf.lite.experimental.authoring.compatible
decorador para envolver su tf.function
modelo para comprobar la compatibilidad TFLite.
Después de esto, la compatibilidad se verificará automáticamente cuando evalúe su 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 = ""}
Si no se encuentra ningún problema de compatibilidad TensorFlow Lite, se mostrará COMPATIBILITY WARNING
o COMPATIBILITY ERROR
con la localización exacta del op problemática. En este ejemplo, se muestra la ubicación de tf.Cosh
op en su modelo tf.function.
También puede comprobar el registro de compatibilidad con el <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
Plantee una excepción por una incompatibilidad
Puede proporcionar una opción para el @tf.lite.experimental.authoring.compatible
decorador. El raise_exception
opción le da una excepción cuando se está tratando de evaluar el modelo decorado.
@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 = ""}
Especificar el uso de "Seleccionar operaciones de TF"
Si ya está al tanto de Selección TF operaciones de uso, se puede decir esto a la API de creación mediante el establecimiento de converter_target_spec
. Es lo mismo tf.lite.TargetSpec objeto que va a utilizar 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
Comprobando la compatibilidad de la GPU
Si desea asegurarse de que su modelo es compatibile con el delegado de la GPU de TensorFlow Lite, se puede establecer experimental_supported_backends
de tf.lite.TargetSpec .
El siguiente ejemplo muestra cómo garantizar la compatibilidad de delegado de GPU de su modelo. Tenga en cuenta que este modelo tiene problemas de compatibilidad, ya que utiliza un tensor 2D con el operador tf.slice y el operador tf.cosh no admitido. Verás dos COMPATIBILITY WARNING
con la información de ubicación.
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.
Lee mas
Para obtener más información, consulte: