2021 年 9 月 9 日 - 发布者 Marat Dukhan 和 Frank Barchard,软件工程师 量化是加速 CPU 上神经网络推理最常用的方法之一。一年前,TensorFlow Lite 通过集成 XNNPACK 后端,提高了浮点模型的性能。今天,我们将 XNNPACK 后端扩展到量化模型,在计算机视觉模型的平均性能上,在 ARM64 移动电话上速度提高了 30%…
发布者 Marat Dukhan 和 Frank Barchard,软件工程师
量化是加速 CPU 上神经网络推理最常用的方法之一。一年前,TensorFlow Lite 通过集成 XNNPACK 后端,提高了浮点模型的性能。今天,我们将 XNNPACK 后端扩展到量化模型,在计算机视觉模型的平均性能上,在 ARM64 移动电话上速度提高了 30%,在 x86-64 笔记本电脑和台式机系统上速度提高了 5 倍,在使用 WebAssembly SIMD 的浏览器内推理速度提高了 20 倍,与默认的 TensorFlow Lite 量化内核相比。
XNNPACK 中的量化推理针对 对称量化模式 进行了优化,该模式由 TensorFlow 模型优化工具包 使用。XNNPACK 支持 传统的每张量量化模式 和更新的精度优化 模式,该模式使用权重的每个通道量化和激活的每张量量化。此外,XNNPACK 支持非对称量化模式,但效率降低。
我们评估了在多个边缘设备和神经网络架构上加速的 XNNPACK 量化推理。下面,我们在涵盖常见计算机视觉任务的四个公开模型和两个内部量化模型上展示了基准测试。
XNNPACK 在 Android/ARM64 移动电话上对量化计算机视觉模型的单线程推理带来的加速。 |
在六款 Android ARM64 移动设备上,XNNPACK 的平均速度比默认的 TensorFlow Lite 量化内核快 30%。
XNNPACK 在 x86-64 笔记本电脑和台式机系统上对量化计算机视觉模型的单线程推理带来的加速。 |
XNNPACK 在使用 x86 处理器的笔记本电脑和台式机系统上提供了更大的改进。在我们基准测试的 5 个 x86 处理器上,XNNPACK 平均将推理速度提高了 5 倍。值得注意的是,不支持 AVX 指令的低端和老式处理器在将量化推理切换到 XNNPACK 后,速度提高了 20 倍以上:之前的 TensorFlow Lite 推理后端只为 AVX、AVX2 和 AVX512 指令集优化了实现,而 XNNPACK 为所有 x86-64 处理器提供了优化的实现。
XNNPACK 在通过 V8 运行时,在移动电话、笔记本电脑和台式机上对量化计算机视觉模型的单线程 WebAssembly SIMD 推理带来的加速。 |
除了传统的移动设备和笔记本电脑/台式机平台之外,XNNPACK 还通过 TensorFlow Lite Web API 为 Web 平台带来了加速的量化推理。上面的图表显示了在 3 个 x86-64 和 2 个 ARM64 系统上通过 V8 JavaScript 引擎运行 WebAssembly SIMD 基准测试时,与默认的 TensorFlow Lite 实现相比,几何平均速度提高了 20 倍。
XNNPACK 最初是 QNNPACK 库 的一个分支,但由于 XNNPACK 的第一个版本专注于浮点推理,而 QNNPACK 专注于量化推理,因此无法比较两者。现在 XNNPACK 引入了对量化推理的支持,我们可以直接评估并归因于这两年来的性能优化。
为了比较这两个量化推理后端,我们将随机化的 MobileNet v1 和 MobileNet v2 模型从 XNNPACK API 移植到 QNNPACK API,并在两款 ARM64 Android 手机和两款 x86-64 系统上对其单线程性能进行了基准测试。上面的图表显示了结果,以及 XNNPACK 在两年中取得的显著进步。XNNPACK 在较旧的 Pixel 3a 手机上快了 50%,在更新的 Pixel 4a 手机上快了 4-5 倍,在 x86-64 笔记本电脑上快了 2.5 倍,在 x86-64 工作站上快了 3 倍以上。这些改进是 XNNPACK 在自 QNNPACK 分支后的两年中获得的多个优化的结果。
[-127, 127]
范围内(即使 -128
可以表示为有符号 8 位整数,也将其排除在外)。对称量化提供了 XNNPACK 中利用的两个计算优势。首先,当滤波器权重是静态的时,将输入零点乘以滤波器权重的结果可以完全融合到卷积、反卷积和全连接运算符中的偏差项中。因此,零点参数完全不存在于推理计算中。其次,有符号 8 位输入元素与限制在 [-127, 127]
范围内的权重元素的乘积适合 15 位。这使得卷积、反卷积和全连接运算符的微内核能够在 16 位变量上执行一半的累积,而不是始终将乘积扩展到 32 位。这些优化共同使 XNNPACK 成为量化推理的最新技术,并将 TensorFlow Lite 变成了最通用的量化推理解决方案,涵盖从树莓派零到 Chromebook 到使用服务器级处理器的 workstations 的系统。
量化 XNNPACK 推理在 TensorFlow Lite 的所有平台的 CMake 构建中默认启用,在 TensorFlow Lite Web 平台的 Bazel 构建中默认启用,并将作为 TensorFlow Lite Web API 的 2.7 版本发布。在其他平台的 Bazel 构建中,量化 XNNPACK 推理通过构建时选择机制启用。使用 Bazel 构建 TensorFlow Lite 时,添加 --define tflite_with_xnnpack=true --define xnn_enable_qs8=true
,TensorFlow Lite 解释器将默认情况下使用 XNNPACK 后端,为使用对称量化的受支持的运算符提供支持。对使用非对称量化的运算符的支持有限,可以通过 Bazel 选项 --define xnn_enable_qu8=true
获得。
XNNPACK 后端目前支持量化 TensorFlow Lite 运算符的一个子集(有关详细信息和限制,请参阅 文档)。XNNPACK 支持通过训练后整数量化和量化感知训练生成的模型,但不支持训练后动态范围量化。
这是 XNNPACK 集成到 TensorFlow Lite 的第三个版本,继 浮点实现的初始发布 和 随后带来稀疏推理支持的版本 之后。在接下来的版本中,我们计划添加以下改进。
我们鼓励您在我们的 GitHub 和 StackOverflow 页面上留下您的想法和评论,您可以在 discuss.tensorflow.org 上提问。
2021 年 9 月 9 日 — 作者:Marat Dukhan 和 Frank Barchard,软件工程师 量化是加速 CPU 上神经网络推理的最流行方法之一。一年前,TensorFlow Lite 通过集成 XNNPACK 后端 提高了浮点模型的性能。今天,我们将 XNNPACK 后端扩展到量化模型,在计算机视觉模型上的平均加速率为 30%,在 AR…