TensorFlow 模型优化工具包 — 训练后整型量化
模型优化工具包是一套先进的技术工具包,可协助新手和高级开发者优化待部署和执行的机器学习模型。自推出该工具包以来, 我们一直努力降低机器学习模型量化的复杂性
(https://www.tensorflow.org/lite/performance/post_training_quantization)。
最初,我们通过“混合运算”为训练后量化提供支持,该方法可量化模型参数(例如权重),但以浮点方式执行部分计算。今天,我们很高兴宣布推出一款新工具:训练后整型量化。整型量化是一种通用技术,可降低模型权重和激活函数的数值精度,从而减少内存并缩短延迟时间。
优化模型以缩减尺寸、延时和功耗,使准确率损失不明显
为何应使用训练后整型量化
我们之前发布的“混合”训练后量化方法可在许多情况下减少模型大小和延迟时间,但却必须进行浮点计算,这可能不适用于所有硬件加速器(如 Edge TPU, https://cloud.google.com/edge-tpu/),而只适用于 CPU。
注:“混合”训练后量化 链接
https://www.tensorflow.org/lite/performance/post_training_quantization
我们已推出全新的训练后整型量化方法,可让用户使用已经过训练的浮点模型,并对其进行充分量化,仅使用 8 位带符号整数(即“int8”)。凭借这一量化方案,我们可以在许多模型中获得合理的量化模型准确率,而不必重新训练依靠量化感知 (quantization-aware) 训练的模型。借助这一新工具,模型大小将缩小为原来的 1/4,却能得到更大的 CPU 速度提升。此外,Edge TPU 等固定点硬件 (fixed point hardware) 加速器也将能运行这些模型。
与量化感知训练相比,此工具更易于使用,并可在大多数模型中实现出色的准确率。目前可能仍存在需要进行量化感知训练的用例,但我们希望随着训练后工具的不断改进,这种情况会越来越少。
注:量化感知训练 链接https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/quantize
总之,如果用户希望减少 CPU 大小和延迟时间,即应使用“混合”训练后量化工具。如果旨在大幅改进 CPU 或兼容固定点加速器,则应使用此训练后整型量化工具;若会影响模型准确率,则可能还需使用量化感知训练。
如何启用训练后整型量化
我们的整型量化工具需要使用一个小型代表性数据校正集。只需为转换器提供 representative_dataset 生成器,优化参数便会对输入模型执行整型量化。
1def representative_dataset_gen(): 2 data = tfds.load(...) 3 4 for _ in range(num_calibration_steps): 5 image, = data.take(1) 6 yield [image] 7 8converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) 9converter.optimizations = [tf.lite.Optimize.DEFAULT]10converter.representative_dataset = tf.lite.RepresentativeDataset(11 representative_dataset_gen)def representative_dataset_gen():
2 data = tfds.load(...)
3
4 for _ in range(num_calibration_steps):
5 image, = data.take(1)
6 yield [image]
7
8converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
9converter.optimizations = [tf.lite.Optimize.DEFAULT]
10converter.representative_dataset = tf.lite.RepresentativeDataset(
11 representative_dataset_gen)
模型是否经过完全量化?
与现有的训练后量化功能类似,默认情况下,未进行量化操作的算子将自动以浮点方式执行。这样可使转换过程顺利进行,并会生成始终在常规移动 CPU 上执行的模型,鉴于 TensorFlow Lite 将在只使用整型的加速器中执行整型运算,并在执行浮点运算时回退到 CPU。 若要在完全不支持浮点运算的专用硬件(如某些机器学习加速器,包括 Edge TPU)上完整执行运算,您可以指定标记以仅输出整型运算:
1converter.target_ops = [tf.lite.OpSet.TFLITE_BUILTINS_INT8]converter.target_ops = [tf.lite.OpSet.TFLITE_BUILTINS_INT8]
当使用此标记且运算没有可量化的整型对应项时,TensorFlow Lite 转换器将报错。
模型仅需少量数据
实验中发现,使用数十个可表明模型在执行期间所见内容的代表性示例,足以获得最佳准确率。例如,我们仅使用 ImageNet 数据集中的 100 张图像对模型进行校准后,即得出了以下准确率。
结果
延时
与浮点模型相比,量化模型在 CPU 上的运行速度提升了2到4倍,模型压缩提升4倍。我们还希望通过硬件加速器(如 Edge TPU)进一步提速。
准确率
仅使用 ImageNet 数据集中的 100 张校准图像,完全量化的整型模型便获得了与浮点模型相当的准确率(MobileNet v1 损失了 1% 的准确率)。
整型模型的工作原理
记录动态范围
以上新工具的工作原理是:记录动态范围,在浮点 TensorFlow Lite 模型上运行多个推理,并将用户提供的代表性数据集用作输入。我们会使用所记录的推理值,以确定在整型算法中执行模型全部张量所需的缩放比例参数。
Int8 量化方案
需要注意的是,我们的全新量化规范已实现这一训练后用例,且该用例可针对某些运算使用每轴量化。在我们新增每轴量化之前,由于准确率下降,训练后整型量化并不实用;但每轴量化却具有准确率优势,能够为许多模型实现更接近于浮动模型的准确率。
8 位量化使用以下公式得出的值近似于浮点值:
real_value = (sint8_value — zero_point) * scale.
每轴(也称为“每通道”)或每层权重以 int8 二进制补码表示,数值范围为 [-127, 127],零点时则等于 0。
每层激活函数/输入以 int8 二进制补码表示,数值范围为 [-128, 127],零点范围为 [-128, 127]。如需了解更多详情,请参阅完整量化规范(https://www.tensorflow.org/lite/performance/quantization_spec)。
量化感知训练方面有何打算?
我们希望尽可能简化量化方法。因此,我们很期待能够通过某种方法在训练后实现模型的量化!但是,我们也明白,某些模型在通过量化进行训练时已经拥有最佳质量。所以,我们也在致力开发量化感知训练 API。同时,我们也鼓励您尝试使用训练后量化法,因为它也许能满足模型的所有需求!
文档和教程
您可以在 TensorFlow 网站上找到关于训练后整型量化、新量化规范以及训练后整型量化教程的详细信息。我们非常乐于了解您对此工具的使用情况 — 欢迎您分享自己的案例!
训练后整型量化
(https://www.tensorflow.org/model_optimization/guide/quantization)
新量化规范
(https://www.tensorflow.org/lite/performance/quantization_spec)
训练后整型量化教程
(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/tutorials/post_training_integer_quant.ipynb)
案例分享
(https://services.google.com/fb/forms/tensorflowcasestudy/)
致谢
感谢 TensorFlow 模型优化团队: Suharsh Sivakumar、Jian Li、Shashi Shekhar、Yunlu Li、Alan Chiao、Raziel Alvarez、Lawrence Chan、Daniel Situnayake、Tim Davis、Sarah Sirajuddin
Reviewed by:linsong
欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/
欢迎关注PyTorch官方中文教程站:
http://pytorch.panchuang.net/
TensorFlow 模型优化工具包 — 训练后整型量化的更多相关文章
- 用C++调用tensorflow在python下训练好的模型(centos7)
本文主要参考博客https://blog.csdn.net/luoyexuge/article/details/80399265 [1] bazel安装参考:https://blog.csdn.net ...
- [翻译] Tensorflow模型的保存与恢复
翻译自:http://cv-tricks.com/tensorflow-tutorial/save-restore-tensorflow-models-quick-complete-tutorial/ ...
- tflearn 中文汉字识别,训练后模型存为pb给TensorFlow使用——模型层次太深,或者太复杂训练时候都不会收敛
tflearn 中文汉字识别,训练后模型存为pb给TensorFlow使用. 数据目录在data,data下放了汉字识别图片: data$ ls0 1 10 11 12 13 14 15 ...
- 使用GPU训练TensorFlow模型
查看GPU-ID CMD输入: nvidia-smi 观察到存在序号为0的GPU ID 观察到存在序号为0.1.2.3的GPU ID 在终端运行代码时指定GPU 如果电脑有多个GPU,Tensorfl ...
- 搭建 MobileNet-SSD 开发环境并使用 VOC 数据集训练 TensorFlow 模型
原文地址:搭建 MobileNet-SSD 开发环境并使用 VOC 数据集训练 TensorFlow 模型 0x00 环境 OS: Ubuntu 1810 x64 Anaconda: 4.6.12 P ...
- 编译器是如何实现32位整型的常量整数除法优化的?[C/C++]
引子 在我之前的一篇文章[ ThoughtWorks代码挑战——FizzBuzzWhizz游戏 通用高速版(C/C++ & C#) ]里曾经提到过编译器在处理除数为常数的除法时,是有优化的,今 ...
- 使用TensorFlow Serving优化TensorFlow模型
使用TensorFlow Serving优化TensorFlow模型 https://www.tensorflowers.cn/t/7464 https://mp.weixin.qq.com/s/qO ...
- 整型转字符串(convert int to char)优化实践——一个意外的BUG
convert_int_to_char函数在使用时出现过一个BUG. 当使用值是13200020099时,返回的字符串是"13200020111",结果是错误的. 在gcc编译器里 ...
- 移动端目标识别(1)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之TensorFlow Lite简介
平时工作就是做深度学习,但是深度学习没有落地就是比较虚,目前在移动端或嵌入式端应用的比较实际,也了解到目前主要有 caffe2,腾讯ncnn,tensorflow,因为工作用tensorflow比较多 ...
随机推荐
- 达拉草201771010105《面向对象程序设计(java)》第四周学习总结
实验四类与对象的定义及使用 实验时间 2018-9-20 第一部分:理论知识 1.类与对象概念 (1)类是具有相同属性和方法的一类事物的抽象,是构造对象的模板或蓝图,由类构造对象的过程称为创建类的实例 ...
- Spring Cloud Eureka整合使用和配置
遵循SpringBoot三板斧 服务端 第一步加依赖 <dependency> <groupId>org.springframework.cloud</groupId&g ...
- C++对拍
作为一名OIer,比赛时,对拍是必须的 不对拍,有时可以悔恨终身 首先,对拍的程序 一个是要交的程序 另一个可以是暴力.搜索等,可以比较慢,但是必须正确 下面是C++版对拍程序(C++ & c ...
- 获取的ajax方法return的返回值的问题解析
今天刚上班就偶遇关于获取Ajax方法return的返回值的问题,这里小记一下. 在使用jquery中,如果获取不到ajax返回值,原因有二: 一.ajax未使用同步 ajax未使用同步,导致数据未加载 ...
- 基于FPGA的三段式状态机
状态机分类: 通常, 状态机的状态数量有限, 称为有限状态机(FSM) .由于状态机所有触发器的时钟由同一脉冲边沿触发, 故也称之为同步状态机. 根据状态机的输出信号是否与电路的输入有关分为 Meal ...
- MongoDB复制集概念架构浅析
一.复制集的作用 (1) 高可用 防止设备(服务器.网络)故障. 提供自动failover 功能. 技术来保证数 (2) 灾难恢复 当发生故障时,可以从其他节点恢复. (3) 功能隔离 用于分析.报表 ...
- Windows下EDK2环境的搭建以及经典的程序设计Print Hello World !-----(Linux下的待后续熟练了再更新)
很久没有更新博客了,之前的博客末尾有提到过要写有关EDK2环境搭建的博客,现在就是完成的时候了,后续博客更新会比较规律(大概每周一篇?) 本人博客仅仅发表于博客园,本人主页为 http ...
- Upload-labs 测试笔记
Upload-labs 测试笔记 By:Mirror王宇阳 2019年11月~ 文件上传解析学习 环境要求 若要自己亲自搭建环境,请按照以下配置环境,方可正常运行每个Pass. 配置 项 配置 描述 ...
- 01.UNIX基础知识
1.UNIX体系结构 什么叫做内核? 内核是一种软件,它控制计算机硬件资源,并提供程序的运行环境. 什么叫操作系统? 在广义上,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,如可以 ...
- JavaScript 基础知识汇总目录
一.标签.代码结构.现代模式.变量.数据类型.类型转换 GO 二.运算符.值的比较.交互.条件运算符.逻辑运算符 GO 三.循环 while 和 for .switch语句.函数.函数表达式和箭头函数 ...