查看原文
其他

TensorFlow 模型优化工具 — float16 量化将模型体积减半

Google TensorFlow 2021-07-27

我们很高兴在模型优化工具包中添加训练后的半精度浮点量化 (float16 quantization),此工具套件包含混合量化 (hybrid quantization)训练后整形量化 (full integer quantization) 和剪枝 (pruning)。点此查看发展蓝图中的其他工具。

训练后的半精度浮点量化可以在损失极少准确度的情况下,缩小 TensorFlow Lite 模型的大小(最高可缩减 50%)。它将模型常量(如权重和偏差值)从全精度浮点(32 位)量化为精度下降的浮点数据类型 (IEEE FP16)。

注:量化 链接

https://tensorflow.google.cn/model_optimization/guide#quantization


训练后的半精度浮点量化不但对准确度的影响很小,而且能显著缩小模型尺寸,因而是初始量化 TensorFlow Lite 模型的好工具。您可在此处查看我们的文档(包含新的浮点图表),了解不同的量化选项和方案。

注:文档 链接

https://tensorflow.google.cn/lite/performance/post_training_quantization



降低精度的益处

精度降低存在诸多益处,尤其是部署在边缘设备时:

  • 模型尺寸缩减一半。模型中的所有常量值均存储在 16 位浮点而非 32 位浮点中。这些常量值通常决定模型的总体尺寸,因此可以将模型尺寸缩减约一半。
  • 精度损失微乎其微。与初始训练精度相比,深度学习模型使用较低精度时通常可以产生良好的推理结果。我们对多个模型进行实验,发现推理质量的损失甚微。在下面的例子中可以看到,MobileNet V2 的 Top 1 准确度下降小于 0.03%(参见下文结果)。



模型大小缩减一半,准确度损失微乎其微

训练后的半精度浮点量化对准确度影响甚小,却可将深度学习模型的尺寸缩减约一半。例如,以下是 MobileNet V1 和 V2 模型以及 MobileNet SSD 模型的一些结果。MobileNet V1 和 V2 的准确度结果基于 ImageNet 图像识别任务,对 SSD 模型的评估则基于 COCO 对象识别任务。

注: ImageNet 链接

http://image-net.org/

 COCO 链接

http://cocodataset.org/


模型准确度

对标准 Mobilenet float32 模型(与 fp16 变体)的评估基于 LSVRC 2012 图像分类任务,对 Mobilenet SSD float32 及其 fp16 变体的评估则基于 COCO 对象检测任务

注:LSVRC 2012 图像分类任务 链接

http://www.image-net.org/challenges/LSVRC/2012/

COCO 对象检测任务 链接

http://cocodataset.org/#detection-eval


如何启用训练后的半精度浮点量化

您可以采用训练好的 float32 模型,将优化设置为“默认”,并将目标规范的支持类型设置为 float16 常量,从而在 TensorFlow Lite 转换器上指定训练后的半精度浮点量化:1import tensorflow as tf
2converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
3converter.optimizations = [tf.lite.Optimize.DEFAULT]
4converter.target_spec.supported_types = [tf.lite.constants.FLOAT16]
5Tflite_quanit_model = converter.convert()
模型转换完成后可直接运行,这与其他 TensorFlow Lite 模型并无二致。默认情况下,模型会将 16 位参数“上采样”为 32 位,接着在标准 32 位浮点运算中执行操作,最终在 CPU 上运行。随着时间推移,我们有望看到有更多的硬件支持加速 fp16 计算,允许我们跳过上采样的步骤,直接使用 float16 精度进行计算


您也可以在 GPU 上运行模型。我们已强化 TensorFlow Lite GPU 委派,以接收精度降低的参数,并直接使用这些参数运行(而非如 CPU 中一般将其转化为 float32)。在您的应用中,您可以通过 TfLiteGpuDelegateCreate 函数创建 GPU 委派(文档)。指定委派选项时,请确保将 precision_loss_allowed 设置为 1,以便在 GPU 中使用16位浮点进行运算:1//Prepare GPU delegate.
2const TfLiteGpuDelegateOptions options = {
3  .metadata = NULL,
4  .compile_options = {
5    .precision_loss_allowed = 1,  // FP16
6    .preferred_gl_object_type = TFLITE_GL_OBJECT_TYPE_FASTEST,
7    .dynamic_batch_enabled = 0,   // Not fully functional yet
8  },
9};
如需 GPU 委派概览,请参阅先前的博文。请在此 Colab 教程中查看使用半精度浮点量化的工作示例。

注:GPU 委派 链接

https://tensorflow.google.cn/lite/performance/gpu_advanced

委派概览 链接

https://medium.com/tensorflow/tensorflow-lite-now-faster-with-mobile-gpus-developer-preview-e15797e6dee7

Colab 链接

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/g3doc/performance/post_training_float16_quant.ipynb


建议您立即试用此工具并提供反馈。直接分享您的用例或在 Twitter 上使用 #TFLite 和 #PoweredByTF 标签分享。

注:提交用例 链接

https://services.google.cn/fb/forms/TFCS/



致谢

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。


更多 TensorFlow Lite 相关阅读:



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存