如何确保 TFLite 解释器仅使用 int8 运算?

Gus*_*ter 4 python quantization keras tensorflow tensorflow-lite

我一直在使用 Tensorflow 的 TFLite 研究量化。据我了解,可以量化我的模型权重(以便使用更少的 4 倍内存来存储它们),但这并不一定意味着模型不会将其转换回浮点数来运行它。我还了解到,要仅使用 int 运行我的模型,我需要设置以下参数:

converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
Run Code Online (Sandbox Code Playgroud)

我想知道tf.lite.Interpreter设置了这些参数的加载模型与未设置这些参数的加载模型之间有什么区别。我试图对此进行调查.get_tensor_details(),但没有发现任何差异。

Vis*_*ati 5

根据您的要求(性能、内存和运行时间),训练后量化可以通过两种方式完成。

方法#1:训练后权重量化(仅量化权重) 在这种情况下,仅权重被量化为 int8,但激活保持原样。推理输入和输出是浮点的。

converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.experimental_new_converter = True
# Post training quantization
converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE]
tflite_quant_model = converter.convert()
tflite_model_quant_file = tflite_models_dir/"lstm_model_quant.tflite"
tflite_model_quant_file.write_bytes(tflite_quant_model)
Run Code Online (Sandbox Code Playgroud)

方法#2:全整数量化(量化权重和激活) 在这种情况下,权重和激活被量化为 int8。首先,我们需要遵循方法#1 来量化权重,然后实现以下代码来进行完全整数量化。它使用量化的输入和输出,使其与更多加速器兼容,例如 Coral Edge TPU。推理输入和输出都是整数。

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

tflite_model_quant = converter.convert()
tflite_model_quant_file = tflite_models_dir/"lstm_model_quant_io.tflite"
tflite_model_quant_file.write_bytes(tflite_model_quant)
Run Code Online (Sandbox Code Playgroud)

有关权重量化的更多详细信息请参见此处,您可以在此处找到有关全整数量化的更多详细信息。