写点什么

谷歌发布 TensorFlow Lite 预览版,推理速度提升 4 到 6 倍

  • 2019-01-17
  • 本文字数:2969 字

    阅读完需:约 10 分钟

谷歌发布TensorFlow Lite预览版,推理速度提升4到6倍

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.MobileNet v1 (224x224)图像分类


(基于移动和嵌入式视觉应用的图像分类模型)


2.用于姿态估计的PoseNet


(图像或视频中估计人体姿势的视觉模型)


3.DeepLab分割(257x257)


(图像分割模型,将语义标签(如狗、猫、车)分配给输入图像中的每个像素)


4.MobileNet SSD对象检测


(检测带有边框的多个对象的图像分类模型)


谷歌专有用例:


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 初始化代码中。


// Initialize interpreter with GPU delegate.GpuDelegate delegate = new GpuDelegate();Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);Interpreter interpreter = new Interpreter(model, options);
// Run inference.while (true) { writeToInputTensor(inputTensor); interpreter.run(inputTensor, outputTensor); readFromOutputTensor(outputTensor);}
// Clean up.delegate.close();

复制代码

使用 C ++ for iOS

步骤 1.下载 TensorFlow Lite 的二进制版本。


步骤 2.更改代码,以便在创建模型之后调用 ModifyGraphWithDelegate()。


// Initialize interpreter with GPU delegate.std::unique_ptr<Interpreter> interpreter;InterpreterBuilder(model, op_resolver)(&interpreter);auto* delegate = NewGpuDelegate(nullptr);  // default configif (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
// Run inference.while (true) { WriteToInputTensor(interpreter->typed_input_tensor<float>(0)); if (interpreter->Invoke() != kTfLiteOk) return false; ReadFromOutputTensor(interpreter->typed_output_tensor<float>(0));}
// Clean up.interpreter = nullptr;DeleteGpuDelegate(delegate);

复制代码

如何加速?

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


我们欢迎你在GitHubStackOverflow页面上留下你的想法和评论。


原文链接:


https://medium.com/tensorflow/tensorflow-lite-now-faster-with-mobile-gpus-developer-preview-e15797e6dee7


2019-01-17 14:307728
用户头像
陈思 InfoQ编辑

发布了 576 篇内容, 共 281.7 次阅读, 收获喜欢 1302 次。

关注

评论

发布
暂无评论
发现更多内容

架构学习(二)

爱晒太阳的大白

5月月更

MobileVIT实战:使用MobileVIT实现图像分类

AI浩

中国信通院发布“可信开源”全景观察 成立三大开源产业组织

中国IDC圈

开源 开源治理

代码之外:谈谈算法该怎么准备,不准备可以吗

宇宙之一粟

算法面试 代码之外 5月月更

Swin Transformer实战: timm使用、Mixup、Cutout和评分一网打尽,图像分类任务

AI浩

图像分类实战:mobilenetv2从训练到TensorRT部署(pytorch)

AI浩

数字化转型背景下,企业如何做好知识管理?

小炮

企业知识管理

数字孪生智慧物流之 Web GIS 地图应用

一只数据鲸鱼

GIS 数据可视化 智慧物流 数字孪生 三维仿真

Linux环境封装静态库

Loken

音视频 5月月更

用IntelliJ IDEA ULTIMATE版看Java类图

程序员欣宸

Java IDEA 5月月更

Kafka 万亿级消息实践之资源组流量掉零故障排查分析

vivo互联网技术

大数据 kafka 监控

EfficientNet实战:tensorflow2.X版本,EfficientNetB0图像分类任务(小数据集)

AI浩

图像分类

如何为服务网格做端到端测试

Flomesh

测试 Service Mesh 服务网格

如何评估服务是否内存泄漏了?

BUG侦探

缓存 容器 内存泄漏

Hyperspace索引系统论文解析

漫长的白日梦

spark 数据湖 索引系统

跨平台应用开发进阶(十三) :uni-app应用异常退出时处理机制探究

No Silver Bullet

uni-app 5月月更 异常退出 处理机制

VIT实战总结:非常简单的VIT入门教程,一定不要错过

AI浩

BladeDISC 0.2.0更新发布

阿里云大数据AI技术

深度学习 存储 并行计算 异构计算 算法框架/工具

深度探索通过数据共享(data sharing)优化 Amazon Redshift 工作负载分解

亚马逊云科技 (Amazon Web Services)

数据 负载

如何写好产品手册?

小炮

STM32F103系列开发_点亮LED灯

DS小龙哥

5月月更

ResNet实战:单机多卡DDP方式、混合精度训练

AI浩

OpenHarmony 3.1 Release版本特性解析——OpenHarmony硬件资源池化架构介绍

OpenHarmony开发者

OpenHarmony 多设备协同

一文看懂博睿数据AIOps场景、算法和能力

博睿数据

AIOPS 智能运维 博睿数据

亚马逊云科技 2022 年 3 月新服务新功能强势来袭

亚马逊云科技 (Amazon Web Services)

服务 亚马逊

还在为模型加速推理发愁吗?不如看看这篇吧。手把手教你把pytorch模型转化为TensorRT,加速推理

AI浩

ABAP Code Inspector 的一些高级功能分享

汪子熙

编程语言 代码扫描 SAP abap 5月月更

开源集结令!参与开源之夏 EMQ 项目开发,赢最高 12000 元奖金

EMQ映云科技

开源 物联网 emq 开源之夏 5月月更

面试突击50:单例模式有几种写法?

王磊

Java java面试

HashMap 源码分析-新增

zarmnosaj

5月月更

SWA实战:使用SWA进行微调,提高模型的泛化

AI浩

谷歌发布TensorFlow Lite预览版,推理速度提升4到6倍_AI&大模型_TensorFlow团队_InfoQ精选文章