使用OpenCL实现更快的移动GPU推断-TensorFlow博客

2020-08-19 13:18:17

在TensorFlow Lite(TFLite)GPU团队不断改进现有的基于OpenGL的移动GPU推理引擎的同时,我们也在不断研究其他技术。其中一个实验被证明是相当成功的,我们很兴奋地宣布,Android版基于OpenCL的移动GPU推理引擎正式推出,它在具有足够GPU工作负载的合理大小的神经网络上,提供了比我们现有的OpenGL后端高达~2倍的速度。从历史上看,OpenGL是为渲染矢量图形而设计的API。计算着色器是在OpenGL ES 3.1中添加的,但其向后兼容的API设计决策限制了我们充分发挥GPU的潜力。另一方面,OpenCL从一开始就是为使用各种加速器进行计算而设计的,因此与我们的移动GPU推理领域更相关。因此,我们研究了一个基于OpenCL的推理机,它带来了相当多的功能,可以让我们优化我们的移动GPU推理机。性能分析:优化OpenCL后端比优化OpenGL容易得多,因为OpenCL提供了很好的分析特性,而Adreno也很好地支持它们。使用这些性能分析API,我们能够非常精确地测量每个内核分派的性能。优化的工作组大小:我们观察到高通Adreno GPU上的TFLite 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(Large)这两个知名神经网络上使用OpenCL的精选Android设备上推理机的性能。每组3个条形图将独立观察,显示设备上TFLite后端之间的相对加速比。我们新的OpenCL后端的速度大约是OpenGL后端的两倍,但在Adreno设备(标有SD)上做得特别好,因为我们已经使用前面提到的Adreno的性能分析器调整了工作组大小。此外,图2和图3之间的区别还显示了OpenCL在更大的网络上执行得更好。采用OpenCL推理引擎的一个主要障碍是OpenCL不是标准Android发行版的一部分。虽然主要的Android供应商将OpenCL作为其系统库的一部分,但有些用户可能无法使用OpenCL。对于这些设备,需要后退到每台Android设备上都可以使用的OpenGL后端。为了方便开发人员,我们对TFLite GPU委托做了一些修改。我们首先在运行时检查OpenCL的可用性。如果它可用,我们使用新的OpenCL后端,因为它比OpenGL后端快得多;如果它不可用或无法加载,我们将后退到现有的OpenGL后端。事实上,OpenCL后端自2019年年中以来就一直在TensorFlow存储库中,并通过TFLite GPU委托v2无缝集成,因此您可能已经通过委托的后备机制使用它了。安德烈·库利克、马蒂亚斯·格伦德曼、贾里德·杜克、莎拉·西拉贾丁,特别感谢萨钦·乔格勒卡尔为这篇博客所做的贡献。