发新帖

tensorflowLite的量化使用问题

[复制链接]
2648 8

快来加入 TensorFlowers 大家庭!

您需要 登录 才可以下载或查看,没有帐号?加入社区

x
我想问下,现在很多企业都说使用了tensorflow lite,但他们使用的tensorflow lite是经过量化的吗?因为现在好多操作都不支持量化操作,比如tf.Abs,tf.tf.Square等等.如果是使用未量化的tensorflow lite,那这样速度比起量化后的pb文件在android手机上使用,速度有提高吗?提高多少?        还有一个问题.就是要使用toco工具生成量化的lite文件,是不是要求在训练过程中得先使用tf.contrib.quantize.create_training_graph和tf.contrib.quantize.create_eval_graph()进行伪量化训练?
麻烦各位大佬解答下.有没有大佬量化自己模型真正测试成功过的,回答下疑惑.或者能写下量化具体步骤教程.这还有一个我的相同的贴,可以一并回答 https://www.tensorflowers.cn/t/7084

Zongjun已获得悬赏 10 金币+24 金币

最佳答案

以下是我的个人理解,如果是在android 上,Tensorflow Lite (tflite) 可以利用hardware accelerator,应该是更快的。量化只是一个float32到uint8的过程,本质上是weights\bias大小的变化(是原来的25%),有的microc ...
本楼点评(0) 收起

精彩评论8

TF学委  TF荚荚  发表于 2018-10-18 14:57:12 | 显示全部楼层
坐等答案
本楼点评(0) 收起
TF学委  TF荚荚  发表于 2018-10-18 14:57:25 | 显示全部楼层
求大佬回复
本楼点评(0) 收起
Zongjun  TF豆豆  发表于 2018-10-24 05:47:30 | 显示全部楼层
本帖最后由 Zongjun 于 2018-10-24 07:58 编辑

以下是我的个人理解,如果是在android 上,Tensorflow Lite (tflite) 可以利用hardware accelerator,应该是更快的。量化只是一个float32到uint8的过程,本质上是weights\bias大小的变化(是原来的25%),有的microcontroller太小,不量化根本就放不进去,并且mircocontroller大部分是8bit计算,float32非常昂贵,所以需要量化。
用toco生成的量化有两个途径:1.你提到的伪量化,这个确实在training时要调用你说的这两句。具体展开:要生成两个graph,一个用于training,在compute gradients前使用create_training_graph,因为forward和backward都需要模拟量化。这个过程其实是找到需要量化的变量,插入fake quantization nodes 来记录 min-max range information。再具体一点:见(*)。另一个graph用于eval,要在import_graph_def后,saver.restore前插入create_eval_graph。后面如何freeze如何调用toco,按照这个链接上说的即可:https://github.com/tensorflow/te ... ow/contrib/quantize
2. post-training quantization。顾名思义,无需伪量化,是toco拿过来一个pb file,直接把toco的post-training quantization flag设成true完成的。但是注意,这个方法只quantize weights,而1.是一个fully quantized model. 并且2.在inference时,会把uint8的weights再转换回float32来做矩阵乘法。所以,2.这个方法其实依然相当于没做quantization。它的存在应当只是便于用户转移model,计算时依然是个非量化model。链接:https://www.tensorflow.org/performance/post_training_quantization

(*):再往前几个版本,tensorflow其实有自己的量化,就叫做quantize。他不是用伪量化,也无需tflite介入。这个文件在现在的tensorflow github中已经不存在了(半个月前移除的,pete warden决心只搞tflite了)。但是他很好的解释了tensorlow 和 tflite量化的数学原理。如果不加入上述的fake quantize node,tensorflow quantize则需要requantize和dequantize的过程。其中requantize是必须的,因为8bit的两个整数相乘为16bit的数。int8的两个矩阵相乘会得出一个32bit的结果,即一个2d convolution layer的输出结果是int32的。但是下一个quantized op需要一个8bit的输入,这就需要记录float32的min 和max,从而对这个int32的中间结果进行requantization,重新获得8bit的数据继续往下传。当使用了fake quantization后,上述过程在训练过程中被模拟了。于是你会看到训练完了的图,不再存在requantization node和dequantization node。有的只是那些fake quantization nodes。值得注意的是,不加伪量化的量化,不是fully quantized model,因为其涉及到了利用float32 min和max转换。而伪量化不存在该问题。简言之,目前唯一可行的fully quantization method就是在tensorflow 下伪量化训练,再到tflite上转化。
(这里就不说那个graph transform tool了,貌似它是tensorflow mobile旗下的,然而,tensorflow mobile本身都要deprecate了。如图:)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?加入社区

x
本楼点评(4) 收起
  • rainman19您好,请问下int8的两个矩阵相乘会得出一个32bit的结果,这一句是什么原因
    2019-5-9 20:48 回复
  • Zongjun回复 rainman19 :矩阵相乘既要乘又要加,两个8bit相乘就可能必须要用16bit表示了,再相加的话,又可能溢出,比如得了个19 bit。那么最近的2的幂就是用32-bit来表示最终答案了。
    2019-5-10 00:47 回复
  • rainman19回复 Zongjun :原来如此,多谢
    2019-5-16 19:54 回复
  • Zongjun回复 rainman19 :没事
    2019-5-17 00:46 回复
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

快速回复 返回顶部 返回列表