https://blog.tensorflowcn.cn/2020/08/faster-mobile-gpu-inference-with-opencl.html
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLYfwV1bkYdAAMegQoYFHR1V47tXLk9swUUXP5LNMICxZcXhNl0V0ttDHF2o3lTTdpzp3Z9dzSPunFqfSfGmhSdjAwaJKFWtSDJ9Xi1k0Cz6tzKcQ0vzgIAF_YNivQv5p9SQzik6gnhlI/s1600/gpu.gif
作者:Juhyun Lee 和 Raman Sarokin,软件工程师
虽然 TensorFlow Lite (TFLite) GPU 团队一直在不断改进现有的基于 OpenGL 的移动 GPU 推理引擎,但我们也一直在探索其他技术。其中一项实验取得了相当大的成功,我们很高兴地宣布正式推出基于 OpenCL 的移动 GPU 推理引擎,用于 Android,它可以比我们现有的 OpenGL 后端快约 2 倍,适用于神经网络,这些网络具有足够的工作负载以充分利用 GPU。
|
图 1. Duo 的 AR 效果由我们的 OpenCL 后端提供支持。 |
OpenGL 后端的改进
从历史上看,
OpenGL 是一个旨在渲染矢量图形的 API。计算着色器是与 OpenGL ES 3.1 一起添加的,但其向后兼容的 API 设计决策限制了我们充分利用 GPU 的潜力。另一方面,
OpenCL 从一开始就设计用于使用各种加速器进行计算,因此与我们移动 GPU 推理领域的应用更加相关。因此,我们研究了基于 OpenCL 的推理引擎,它带来了许多功能,使我们能够优化移动 GPU 推理引擎。
性能分析:优化 OpenCL 后端比优化 OpenGL 后端容易得多,因为 OpenCL 提供了良好的性能分析功能,而
Adreno 也很好地支持了这些功能。通过这些分析 API,我们可以非常精确地测量每个内核调度的性能。
优化的工作组大小:我们观察到,TFLite GPU 在 Qualcomm Adreno GPU 上的性能对工作组大小非常敏感;选择正确的工作组大小可以提高性能,而选择错误的工作组大小则会使性能下降同样的幅度。不幸的是,对于具有复杂内存访问模式的复杂内核来说,选择正确的工作组大小并非易事。借助 OpenCL 中提到的性能分析功能,我们能够实现工作组大小的优化器,这使得平均性能提高了 50%。
原生 16 位精度浮点 (FP16):OpenCL 原生支持 FP16,并要求加速器指定数据类型的可用性。作为官方规范的一部分,即使是一些较旧的 GPU,例如 2012 年的 Adreno 305,也能充分发挥其性能。另一方面,OpenGL 依赖于提示,供应商可以选择在其实现中忽略这些提示,从而导致没有性能保证。
常量内存:OpenCL 有一个常量内存的概念。
高通添加了一种物理内存,其特性使其非常适合与 OpenCL 的常量内存一起使用。这对于某些特殊情况非常有效,例如神经网络开头或结尾的非常薄的层。Adreno 上的 OpenCL 能够通过与这种物理常量内存和前面提到的原生 FP16 支持相结合,大大优于 OpenGL 的性能。
性能评估
下面,我们展示了 TFLite 在 CPU(大核心上单线程)、使用我们现有的 OpenGL 后端的 GPU 和使用我们新的 OpenCL 后端的 GPU 上的性能。图 2 和图 3 分别描述了推理引擎在几个流行的神经网络(MNASNet 1.3 和 SSD MobileNet v3(大型))上,在选定 Android 设备上的 OpenCL 性能。每组 3 个条形图应独立观察,它们显示了 TFLite 后端在设备上的相对加速。我们的新 OpenCL 后端大约是 OpenGL 后端的两倍快,但在 Adreno 设备(带 SD 注释)上表现更好,因为我们使用前面提到的 Adreno 性能分析器调整了工作组大小。此外,图 2 和图 3 之间的差异表明,OpenCL 在较大的网络上表现更好。
|
图 2. MNASNet 1.3 在选定 Android 设备上的 OpenCL 推理延迟。 |
|
图 3. SSD MobileNet v3(大型)在选定 Android 设备上的 OpenCL 推理延迟。 |
通过 GPU 代理实现无缝集成
采用 OpenCL 推理引擎的一个主要障碍是,OpenCL 不是标准 Android 发行版的一部分。虽然主要的 Android 供应商将 OpenCL 作为其系统库的一部分,但 OpenCL 可能无法用于某些用户。对于这些设备,需要回退到 OpenGL 后端,该后端在每台 Android 设备上都可用。
为了使开发人员的生活更轻松,我们对 TFLite GPU 代理进行了一些修改。我们首先在运行时检查 OpenCL 的可用性。如果它可用,我们使用新的 OpenCL 后端,因为它比 OpenGL 后端快得多;如果它不可用或无法加载,我们回退到现有的 OpenGL 后端。事实上,OpenCL 后端自 2019 年年中以来一直在 TensorFlow 存储库中,并通过 TFLite GPU 代理 v2 无缝集成,因此您可能已经在通过代理的回退机制使用它。
致谢
Andrei Kulik、Matthias Grundmann、Jared Duke、Sarah Sirajuddin,以及对 Sachin Joglekar 对这篇博文的贡献表示特别感谢。