将 tf.keras 模型转换为 TFLite:模型速度很慢,不适用于 XNN Pack



直到最近,我一直在使用基于MobileNetV2的TF 1.15训练模型。

经过培训,我一直能够运行这些命令来生成TFLite版本:

tf.keras.backend.set_learning_phase(0)
converter = tf.lite.TFLiteConverter.from_keras_model_file(
tf_keras_path)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [
tf.lite.constants.FLOAT16]
tflite_model = converter.convert()

由此产生的模型足够快,可以满足我们的需求,当我们的Android开发人员使用XNN Pack时,我们可以额外减少30%的推理时间。

最近,我使用TF2.4.1开发了一个替换模型,该模型基于efficientnet-b2的内置keras实现。

该新模型具有更大的输入图像大小((260260(vs(224224((,并且其keras推断时间约为旧模型的1.5倍

但是,当我使用以下命令转换到TFLite时:

converter = tf.lite.TFLiteConverter.from_keras_model(newest_v3)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [tf.float16]
tflite_model = converter.convert()

有许多问题:

  • 推理时间比旧模型慢5倍
  • 在Android上,我们的开发者看到了这样的错误:;未能应用XNNPACK委托:正在尝试将仅支持静态大小张量的委托与具有动态大小张量的图一起使用">
  • 当我运行转换时,我可以看到一条消息,上面写着:";function_optimizer:function_optimizer什么也没做。时间=9.854ms

我还尝试过保存为SavedModel并转换保存的模型。

我做的另一个尝试是使用带有这些参数的命令行工具(据我所知,几乎所有可能的参数排列(:

tflite_convert --saved_model_dir newest_v3/ 
--enable_v1_converter 
--experimental_new_converter True 
--input-shape=1,260,260,3 
--input-array=input_1:0 
--post_training_quantize 
--quantize_to_float16 
--output_file newest_v3d.tflite
--allow-custom-ops

如果有人能告诉我这里发生了什么,我将不胜感激。

Tensorflow lite目前确实支持具有动态形状的张量(默认情况下启用,并通过转换时的"experimental_new_converter True"选项显式启用(,但下面的问题指出XNNPack不支持:

https://github.com/tensorflow/tensorflow/issues/42491

由于XNNPack无法优化EfficientNet模型的图形,因此您的推理速度比以前慢了5倍,而不是1.5倍左右。

就我个人而言,我只建议转移到EfficientNet lite,因为它是EfficientNet的移动/TPU对应产品,并且在设计时考虑到了Tensorflow lite:中可用的受限操作集

https://blog.tensorflow.org/2020/03/higher-accuracy-on-vision-models-with-efficientnet-lite.html

最新更新