TensorFlow 模型优化工具包:模型大小减半,精度几乎不变!
雷锋网 AI 开发者按:
近日,TensorFlow 强势推出能将模型规模压缩却几乎不影响精度的半精度浮点量化(float16 quantization)工具。小体积、高精度,还能够有效的改善 CPU 和硬件加速器延迟。TensorFlow 发出相应的文章对该工具做了简要的说明,雷锋网
(公众号:雷锋网)
AI 开发者将其整理编译如下。
Float16 Quantization
我们非常高兴能够将训练后的 float16 quantization 作为模型优化工具包(Model Optimization Toolkit)的一部分。这套工具包括了:
-
混合量化( https://medium.com/tensorflow/introducing-the-model-optimization-toolkit-for-tensorflow-254aca1ba0a3 )
-
全整数量化( https://medium.com/tensorflow/tensorflow-model-optimization-toolkit-post-training-integer-quantization-b4964a1ea9ba )
-
修剪( https://medium.com/tensorflow/tensorflow-model-optimization-toolkit-pruning-api-42cac9157a6a )
在计算中,半精度是二进制浮点计算机数字格式,占用计算机存储器中的 16 位。在 IEEE 754-2008 标准中,16 位 base-2 格式称为 binary16。它用于在高精度对于执行算术计算不是必需的应用中存储浮点值,并且 IEEE 754 标准将 binary16 指定为具有以下格式:
-
Sign bit(符号位): 1 bit
-
Exponent width(指数位宽): 5 bits
-
Significand precision(尾数精度): 11 bits (有10位被显式存储)
图 1 IEEE 754 标准下 binary16 的格式
训练后的 float16 quantization 减少了 TensorFlow Lite 模型的大小(高达 50%),同时以少量的精度损失为代价。它将模型常量(如权重和偏差值)从全精度浮点(32 位)量化为减少精度的浮点数据类型(IEEE FP16)。
训练后的 float16 quantization 是量化 TensorFlow Lite 模型很好的方法,因为它对精度的影响极小并且能够使得模型大小显著减小。在这里可以通过查看该文档(包括一个新的浮动图表, https://www.tensorflow.org/lite/performance/post_training_quantization ),以帮助你了解不同的量化选项和场景。
图 2 帮助确定合适量化场景的决策树
降低精度的收益
尤其是在部署到边缘时,降低精度将产生很大的收益。
-
模型尺寸减少 2 倍。 模型中的所有常量值都存储在 16 位浮点数而不是 32 位浮点数中;由于这些常量值通常在整个模型尺寸中占主导地位,因此通常会将模型的尺寸减小约一半。
-
精确度损失可忽略不计。 深度学习模型通常能够在使用相较于最初训练时更少精确度的情况下,产生良好的推理结果。并且在我们对多个模型的实验中,我们发现推理质量几乎没有损失。例如图 4 中,MobileNet V2 top 1 的测试结果显示,其精度降低值小于 0.03%。
模型尺寸测试结果
训练后的 float16 quantization 对精度的影响很小,并可以使得深度学习模型的大小减小约 2 倍。
以下是在 MobileNet V1 和 V2 模型以及 MobileNet SSD 模型的一些测试结果。其中,MobileNet v1 和 v2 的结果基于 ImageNet 图像识别任务测得,而 MobileNet SSD 模型则在 COCO 目标检测任务上评估而得。
图 3 不同模型下模型大小变化
模型精度测试结果
在 ILSVRC 2012 图像分类任务中,我们评估了标准 Mobilenet Float32 模型(和 FP16 变体)。在 COCO 目标检测任务中,我们对 Mobilenet SSD float32 模型及其 fp16 变体进行了评估。
图 4 不同模型下精度损失测试结果
如何使用 float16 quantization 工具
用户可以在 TensorFlow Lite converter 上指定训练后的 float16 quantization,即使用经过训练的 float32 模型,将优化设置为 DEFAULT,然后再将目标规范支持的类型设置为 float16 常量。
图 5 模型参数相关设置
转换模型后,用户就可以像任何其它 TensorFlow Lite 模型那样直接运行该模型了。默认情况下,模型将在 CPU 上运行,通过将 16 位参数「上采样」为 32 位,然后在标准 32 位浮点运算中执行操作。在今后的优化过程中,我们也希望能够有更多的硬件支持加速 fp16 计算,这样半精度值就不再需要进行「上采样」的操作,而是直接进行计算。
同时,用户还可以在 GPU 上运行模型。我们已经增强了 TensorFlow Lite GPU 代理,以接收 16 位精度参数并直接运行(而无需像在 CPU 上那样先进行转换)。
在应用程序中,用户可以通过 TfLiteGpuDelegateCreate 函数(文档)创建 GPU 代理。需要注意的是在为代理指定选项时,请确保将 precision_loss_allowed 设置为 1,从而使其能够在 GPU 上直接使用 float16 操作。
图 6 在 GUP 上运行模型的参数设置
有关 GPU 委托的概述,可以参阅我们之前的帖子( https://medium.com/tensorflow/tensorflow-lite-now-faster-with-mobile-gpus-developer-preview-e15797e6dee7 );如果想进一步了解该工具,可以在 CoLab 教程中查看 float16 quantization 工具的使用示例。
原文链接:
https://medium.com/tensorflow/tensorflow-model-optimization-toolkit-float16-quantization-halves-model-size-cc113c75a2fa
CoLab 教程:
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/g3doc/performance/post_training_float16_quant.ipynb
雷锋网 AI 开发者
。