写点什么

谷歌发布 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:307684
用户头像
陈思 InfoQ编辑

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

关注

评论

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

数据治理:数据质量管理策略!

用友BIP

架构实战营4.1 数据库存储架构随堂练习

西山薄凉

「架构实战营」

神经网络基础部件-损失函数详解

嵌入式视觉

激活函数 Relu sigmoid tanh swish激活函数

LogicFlow自定义业务节点

小鑫同学

前端 vite Vue 3

培训机构与自学的优缺点有哪些

小谷哥

Java培训机构哪家比较不错

小谷哥

阿里P9耗时28天,总结历年亿级活动高并发系统设计手册

架构师之道

Java 高并发 架构师

SeekBar(拖动条)

梦笔生花

android SeekBar 拖动条

数据可视化图表系列解析——南丁格尔玫瑰图

Data 探险实验室

数据分析 可视化 数据可视化 图表 可视化数据

走进AI图像生成核心技术 - Diffusion

Baihai IDP

人工智能 AI AIGC Diffusion 扩散模型

为什么开发者这么看重SQL?看完这些应用场景你就明白了

雨果

sql 数据库管理工具 SQL开发工具

Flink 批作业的运行时自适应执行管控

Apache Flink

大数据 flink 实时计算

阿里云连续3年跻身Gartner全球云数据库管理系统领导者象限

云布道师

阿里云

NFTScan:优质 NFT 应具备什么?

NFT Research

区块链 NFT

Camtasia Studio2023免费版本电脑屏幕录制软件

茶色酒

Camtasia Studio2022 Camtasia Studio2023

先行试点,创新改造:中信期货关键业务系统自主可控的实践之路

OceanBase 数据库

JDK结构介绍

Steven

DiT:Transformers 与扩散模型强强联手

Zilliz

AI 算法模型

Dubbo-kubernetes 基于 Informer 服务发现优化之路

阿里巴巴中间件

阿里云 Kubernetes 云原生 dubbo

培训班有哪些学习前端开发的方法

小谷哥

2022 OceanBase 年度报告|用技术让海量数据的管理和使用更简单!

OceanBase 数据库

数据库 oceanbase

每个Java程序员都必须知道的四种负载均衡算法

JAVA旭阳

Java 架构 后端

安信证券资管清算重要业务在原生分布式数据库的创新实践

OceanBase 数据库

数据库 oceanbase

高并发中的atomic

Steven

如何用「标准差」度量研发波动

feijieppm

项目管理 研发效能 技术管理 文化 & 方法 效能度量

盘点微服务架构下的诸多身份验证方式

API7.ai 技术团队

微服务 身份认证 APISIX

先行“蜀道”, 四川农信核心系统分布式转型

OceanBase 数据库

2023-01-10:智能机器人要坐专用电梯把货物送到指定地点, 整栋楼只有一部电梯,并且由于容量限制智能机器人只能放下一件货物, 给定K个货物,每个货物都有所在楼层(from)和目的楼层(to),

福大大架构师每日一题

算法 rust Solidity 福大大

《PyTorch 深度学习实战》学习笔记 --NumPy(上)

IT蜗壳-Tango

大数据就业培训班哪家好?

小谷哥

ClassIn:如何打造更稳定的Zabbix监控系统

OceanBase 数据库

oceanbase 数据库·

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