Android NNAPI 即将在 Android Q 迎来大更新( 四 )

新的量化方法

NNAPI 从 1.0 版本开始就支持 int8 量化 。 int8 量化是将原先由浮点数表示的权重和中间特征替换成 8-bit 的整数格式 , 将 float32 运算替换为 int8 运算 , 这样减小了内存访问量 , 也能一次计算更多组数据 , 所以会大大加速模型的运行速度 。 但具体如何描述 float 和 8-bit integer 之间的映射关系则有不同的手段 , TensorFlow/TensorFlow Lite 一直使用的是包含 zero point 的非对称量化方式 ,

, 这篇 Google 的 paper 有详细的描述 , Tensor RT 使用的是不含 zero point 的对称量化 ,

对称量化因为不含涉及到 zero point 的计算 , 速度会稍快一些 。

NNAPI 1.2 也支持了这种对称量化方式 , 不过 NNAPI 的实现只会包含某种量化方法下的具体运算的实现 , 至于如何获取每个 8-bit tensor 的 scale 和 zero point 就需要上游的库的配合 , 例如 DNNLibrary 提供了一个脚本生成非对称量化需要的 scale 和 zero point

此外 , NNAPI 1.2 也加入了对分通道量化的支持 , 即每个通道都有一个自己的 scale , 而不是整个 tensor 使用同一个 scale , 在这种分通道的情况下 float 和 int8 之间的映射会更精确 , 量化模型的准确率也就会更高一些 。

推荐阅读