TensorFlow 团队近日在博客上发布了 TensorFlow Lite 开发者预览版,据介绍,新的版本可以让模型推理速度提升至原来的 4~6 倍。
以下为博客全文
由于设备的处理和能力有限,在移动设备上的计算密集型机器学习模型上运行推理,对资源的要求很高。虽然转换为定点模型是一种加速的方法,但我们的用户已经要求我们提供 GPU 支持作为加速原始浮点模型推理的选项,且不增加量化的额外复杂性和潜在的准确性损失。
我们很高兴地宣布,随着 TensorFlow Lite GPU 后端开发者预览版的发布,你将能够利用移动 GPU 来选择模型训练(如下所示),对于不支持的部分,将自动使用 CPU 进行推理。在未来的几个月里,我们将继续增加额外的操作系统,并改善 GPU 整体的后端产品。
新的后端利用了:
OpenGL ES 3.1 在 Android 设备上计算着色器
iOS 设备上的金属计算着色器
今天,我们发布了新的 GPU 后端的预编译二进制预览版,让开发人员和机器学习研究人员可以尽早尝试这种令人兴奋的新技术。我们计划在 2019 年晚些时候发布一个完整的开源版本,包含我们从开发者的经验中收集的反馈。
目前 TensorFlow Lite 仍使用 CPU 浮点推断进行人脸轮廓检测(非人脸识别)。未来我们会利用新的 GPU 后端,可以将 Pixel 3 和三星 S9 的推理速度提升 4~6 倍。
GPU 与 CPU 性能
我们已经在谷歌的产品中进行了几个月新的 GPU 后端测试,加速了计算密集型网络,为我们的用户提供了重要的用例。
对于 Pixel 3 的人像模式,Tensorflow Lite GPU 让前景-背景分割模型的速度提高了 4 倍以上,新的深度预估模型的推理速度提高了 10 倍以上,同时还对 CPU 推理浮点精度提高。在 YouTube 上的 YouTube Stories 和 Playground Stickers 中,实时视频分割模型在各种手机上的测试加速 5~10 倍。
我们发现,对于各种深度神经网络模型,新的 GPU 后端通常比浮点 CPU 速度快 2~7 倍。我们对 4 个公共模型和 2 个内部模型进行了基准测试,涵盖了开发人员和研究人员在一系列 Android 和 Apple 设备上遇到的常见用例:
公共模型:
(基于移动和嵌入式视觉应用的图像分类模型)
(图像或视频中估计人体姿势的视觉模型)
(图像分割模型,将语义标签(如狗、猫、车)分配给输入图像中的每个像素)
(检测带有边框的多个对象的图像分类模型)
谷歌专有用例:
1.MLKit
2.实时视频分割
表 1:在 GPU 上的平均性能提高,相比之下,在不同的 Android 和 Apple 设备上的 6 种型号的基准 CPU 性能均有提升。
在更加复杂的神经网络模型上 GPU 加速效果最显著,这些模型本身更有利于 GPU 的利用,例如密集的预测/分割或分类任务。在小型模型中,加速效果效果可能略差,但 CPU 的使用可以降低内存传输固有的延迟成本。
如何使用?
教程
最简单的入门方法是按照我们的教程使用带有 GPU 委托的 TensorFlow Lite 演示应用程序。下面简要介绍了这种方法。有关更多信息,请参阅我们的完整文档:https://www.tensorflow.org/lite/performance/gpu_advanced。
使用 Java for Android
我们已经准备了一个完整的 Android 存档(AAR),包括带有 GPU 后端的 TensorFlow Lite。编辑 gradle 文件替换当前版本,以包含这个 AAR,并将此代码片段添加到 Java 初始化代码中。
使用 C ++ for iOS
步骤 1.下载 TensorFlow Lite 的二进制版本。
步骤 2.更改代码,以便在创建模型之后调用 ModifyGraphWithDelegate()。
如何加速?
GPU 后端目前支持 select 操作(请参阅文档)。当只包含这些操作时,你的模型运行速度将最快;不支持的 GPU 操作将自动退回到 CPU 进行操作。
它是如何工作的?
深度神经网络按顺序运行数百个操作,这使得它们非常适合针对吞吐量的并行工作负载而设计的 GPU。
Objective-C++可通过调用 Interpreter::ModifyGraphWithDelegate(),或者通过 Interpreter.Options 间接调用 Interpreter 的构造函数来初始化 GPU。在初始化阶段,基于从框架接收的执行计划,构建输入神经网络的规范表示。使用此新表示,可应用一组转换规则,包括但不限于:
剔除不需要的 ops
将 ops 替换为性能更好的等效 ops
合并 ops,以减少最终生成的着色程序的数量
基于此优化图(optimized graph),生成并编译计算着色器。我们目前在 Android 上使用 OpenGL ES 3.1 计算着色器,在 iOS 上使用 Metal 计算着色器。在创建这些计算着色器时,我们还采用了各种特定于体系结构的优化,例如:
进行某些操作特殊化而不是较慢的通用实现
释放寄存器压力
选择最佳工作组大小
安全地调整精度
重新排序显式数学操作
在这些优化结束后,编译着色程序可能需要几毫秒到半秒,就像手机游戏一样。一旦着色程序编译完成,新的 GPU 推理引擎就可以开始工作了。
在推断每个输入时:
如有必要,输入将移至 GPU:如果输入张量还没有存储为 GPU 内存,那么通过创建 GL 缓冲区/texture 或 mtlbuffer(同时还可能复制数据),GPU 可以访问输入张量。由于 GPU 在 4 通道数据结构中效率最高,因此通道大小不等于 4 的张量将被重新塑造成更适合 GPU 的布局。
执行着色器程序:将上述着色器程序插入命令缓冲区队列中,GPU 将这些程序输出。在这一步中,我们还为中间张量管理 GPU 内存,以尽可能减少后端的内存占用。
必要时将输出移动到 CPU:一旦深度神经网络完成处理,框架就会将结果从 GPU 内存复制到 CPU 内存,除非网络的输出可以直接在屏幕上呈现,不需要这样的传输。
为了获得最佳体验,我们建议优化输入/输出张量副本和/或网络架构。有关此类优化的详细信息,可以在TensorFlow Lite GPU文档中找到。有关性能最佳实践,请阅读本指南。
它有多大?
GPU 委托将为 Android armeabi-v7a APK 增加 270KB 的内存,为 iOS 增加 212KB 的内存。但后端是可选的,因此,如果不使用 GPU 委托,就不需要包含它。
未来的工作
这只是我们 GPU 支持工作的开始。除了社区反馈外,我们还打算进行以下改进:
扩大运营范围
进一步优化性能
发展并最终确定 API
我们欢迎你在GitHub和StackOverflow页面上留下你的想法和评论。
原文链接:
评论