https://blog.tensorflowcn.cn/2019/08/tensorflow-model-optimization-toolkit_5.html
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8z10Myto4Wrft2QtaivpPFK41_9fela5y4qzPaP4EPhXUiBy2quCJCof3tLsVa7YCmqBowL7MtompHzTGblM4zkwP-nPw3coqsZfgf7hLnYdBeJ3ykkrlSF0Zl80yA3J_VLM2IkDQahM/s1600/q1.gif
TensorFlow 团队发布
我们非常高兴地宣布在
模型优化工具包 中添加了训练后
float16 量化。这是一个包含
混合量化、
全整数量化 和
剪枝 的工具集。查看
路线图 上还有什么其他功能。
训练后 float16 量化减少了 TensorFlow Lite 模型的大小(最多 50%),同时几乎不会牺牲精度。它
量化 模型常数(例如权重和偏差值)从全精度浮点数(32 位)到降低精度的浮点数数据类型(IEEE FP16)。
训练后 float16 量化是开始量化 TensorFlow Lite 模型的好方法,因为它对精度的影响最小,并且可以显著减小模型大小。您可以查看我们的文档
此处(包括一个新的浮点图表!),以帮助您了解不同的量化选项和场景。
降低精度的优势
降低精度有多种好处,尤其是在部署到边缘设备时。
- 模型大小减少 2 倍。模型中的所有常数值都以 16 位浮点数存储,而不是 32 位浮点数。由于这些常数值通常占模型总大小的主要部分,因此这通常会使模型的大小减少大约一半。
- 精度损失可忽略不计。深度学习模型通常能够在推断时使用比训练时更少的精度位数产生良好的结果。在我们对多个模型的实验中,我们发现推断质量几乎没有损失。例如,在下面,我们展示了 MobileNet V2 的 Top 1 精度下降了 <0.03%。(参见以下结果)。
大小减少 2 倍,精度损失可忽略不计
训练后 float16 量化对精度的影响最小,并且可以将深度学习模型的大小减少约 2 倍。例如,以下是一些关于 MobileNet V1 和 V2 模型以及 MobileNet SSD 模型的结果。MobileNet v1 和 v2 的精度结果基于
ImageNet 图像识别任务。SSD 模型是在
COCO 对象识别任务上评估的。
模型精度
标准的 Mobilenet float32 模型(以及 fp16 变体)是在
ILSVRC 2012 图像分类任务 上评估的。Mobilenet SSD float32 模型及其 fp16 变体是在
COCO 对象检测任务 上评估的。
如何启用训练后 float16 量化
您可以通过在 TensorFlow Lite 转换器上指定训练后 float16 量化来实现,方法是获取您训练好的 float32 模型,将优化设置为 DEFAULT,并将目标规范支持的类型设置为 float16 常数。
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_types = [tf.lite.constants.FLOAT16]
Tflite_quanit_model = converter.convert()
转换完模型后,您可以直接运行它,就像任何其他 TensorFlow Lite 模型一样。默认情况下,模型将通过将 16 位参数“上采样”到 32 位,然后在标准的 32 位浮点算术中执行操作,在 CPU 上运行。随着时间的推移,我们希望看到更多硬件支持加速的 fp16 计算,从而使我们能够放弃上采样到 float32,并在这些半精度值中直接进行计算。
您也可以在 GPU 上运行模型。我们已增强了 TensorFlow Lite GPU 代理,使其能够直接接收降低精度的参数并使用它们运行(而不是像在 CPU 上那样转换为 float32)。在您的应用程序中,您可以通过
TfLiteGpuDelegateCreate 函数创建 GPU 代理 (
文档)。在为代理指定选项时,请确保将
precision_loss_allowed 设置为 1,以便在 GPU 上使用 float16 操作。
//Prepare GPU delegate.
const TfLiteGpuDelegateOptions options = {
.metadata = NULL,
.compile_options = {
.precision_loss_allowed = 1, // FP16
.preferred_gl_object_type = TFLITE_GL_OBJECT_TYPE_FASTEST,
.dynamic_batch_enabled = 0, // Not fully functional yet
},
};
有关 GPU 代理的概述,请参见我们之前的
帖子。查看在此
colab 教程 中使用 float16 量化的工作示例。
致谢
T.J. Alumbaugh、Andrei Kulik、Juhyun Lee、Jared Duke、Raziel Alvarez、Sachin Joglekar、Jian Li、Yunlu Li、Suharsh Sivakumar、Nupur Garg、Lawrence Chan、Andrew Selle。