用于量化感知训练的 TF Lite 的 Toco 转换器参数说明

Posted

技术标签:

【中文标题】用于量化感知训练的 TF Lite 的 Toco 转换器参数说明【英文标题】:Description of TF Lite's Toco converter args for quantization aware training 【发布时间】:2019-11-26 09:54:35 【问题描述】:

这几天,我试图找出一个关于部署支持 TPU 的 TF 模型的错误。

我可以在不支持 TPU 的情况下运行模型,但一旦启用量化,我就会迷路。

我的情况如下:

    创建模型并对其进行训练 创建了模型的评估图 冻结模型并将结果保存为协议缓冲区 在没有 TPU 支持的情况下成功转换和部署它

最后一点,我使用了 TFLiteConverter 的 Python API。生成功能性 tflite 模型的脚本是

import tensorflow as tf

graph_def_file = 'frozen_model.pb'
inputs = ['dense_input']
outputs = ['dense/BiasAdd']

converter = tf.lite.TFLiteConverter.from_frozen_graph(graph_def_file, inputs, outputs)
converter.inference_type = tf.lite.constants.FLOAT
input_arrays = converter.get_input_arrays()

converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE]

tflite_model = converter.convert()

open('model.tflite', 'wb').write(tflite_model)

这告诉我,到目前为止,我的方法似乎还可以。现在,如果我想使用 Coral TPU 棒,我必须量化我的模型(我在训练时考虑到了这一点)。我所要做的就是修改我的转换器脚本。我想我必须将其更改为

import tensorflow as tf

graph_def_file = 'frozen_model.pb'
inputs = ['dense_input']
outputs = ['dense/BiasAdd']

converter = tf.lite.TFLiteConverter.from_frozen_graph(graph_def_file, inputs, outputs)
converter.inference_type = tf.lite.constants.QUANTIZED_UINT8      ## Indicates TPU compatibility
input_arrays = converter.get_input_arrays()

converter.quantized_input_stats = input_arrays[0]: (0., 1.)     ## mean, std_dev
converter.default_ranges_stats = (-128, 127)                      ## min, max values for quantization (?)
converter.allow_custom_ops = True                                 ## not sure if this is needed

## REMOVED THE OPTIMIZATIONS ALTOGETHER TO MAKE IT WORK

tflite_model = converter.convert()

open('model.tflite', 'wb').write(tflite_model)

当使用解释器的 Python API 加载时,此 tflite 模型会产生结果,但我无法理解它们的含义。此外,没有关于如何选择均值、std_dev 和最小/最大范围的文档(或者如果有,则隐藏得很好)。此外,在使用 edgetpu_compiler 编译并部署它(使用 C++ API 加载它)后,我收到一个错误:

INFO: Initialized TensorFlow Lite runtime.
ERROR: Failed to prepare for TPU. generic::failed_precondition: Custom op already assigned to a different TPU.
ERROR: Node number 0 (edgetpu-custom-op) failed to prepare.

Segmentation fault

我想我在转换过程中错过了一个标志或其他东西。但是由于这里也缺少文档,所以我不能肯定。

简而言之:

    参数是什么意思,std_dev、min/max 是做什么的,它们是如何交互的? 在转换过程中我做错了什么?

感谢任何帮助或指导!

编辑:我打开了带有完整测试代码的github issue。随意玩弄这个。

【问题讨论】:

后面可能会解释,但根据我的经验,post-quantization 并不是很好,只能用来查看模型量化后的表现。要充分利用量化例程,您需要执行量化感知训练 @FalconUA:我以为我进行了量化感知训练(参见 github 链接)。如果你决定写一个答案,也许你可以解释训练后量化和量化感知训练之间的主要区别,因为我是这个问题的新手。那太好了! 见medium.com/tensorflow/… 这个例子可能有帮助:github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/… 查看 ***.com/a/58096430/834565 了解均值和标准差的解释 【参考方案1】:

您永远不需要手动设置量化统计信息。

您是否尝试过训练后量化教程?

https://www.tensorflow.org/lite/performance/post_training_integer_quant

基本上他们设置量化选项:

converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8

然后他们将“代表性数据集”传递给转换器,以便转换器可以运行模型几批以收集必要的统计数据:

def representative_data_gen():
  for input_value in mnist_ds.take(100):
    yield [input_value]

converter.representative_dataset = representative_data_gen

虽然有量化训练的选项,但进行训练后量化总是更容易。

【讨论】:

以上是关于用于量化感知训练的 TF Lite 的 Toco 转换器参数说明的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow fake-quantize 层也是从 TF-Lite 调用的

TensorFlow Lite:toco_convert 用于任意大小的输入张量

Tensorflow 量化感知训练

了解 tf.contrib.lite.TFLiteConverter 量化参数

量化如何以及何时在 TFLite 图中起作用?

在 python 中加载 Tensorflow Lite 模型