飞扬围棋

标题: 谷歌发布 TensorFlow Lite 预览版,推理速度提升 4 到 6 倍 [打印本页]

作者: lu01    时间: 2019-1-26 20:44
标题: 谷歌发布 TensorFlow Lite 预览版,推理速度提升 4 到 6 倍

作者: TensorFlow团队


译者: 陈思
  

阅读数:1768 2019 年 1 月 17 日

话题:AI移动TensorFlowGoogle

TensorFlow 团队近日在博客上发布了 TensorFlow Lite 开发者预览版,据介绍,新的版本可以让模型推理速度提升至原来的 4~6 倍。

以下为博客全文

由于设备的处理和能力有限,在移动设备上的计算密集型机器学习模型上运行推理,对资源的要求很高。虽然转换为定点模型是一种加速的方法,但我们的用户已经要求我们提供 GPU 支持作为加速原始浮点模型推理的选项,且不增加量化的额外复杂性和潜在的准确性损失。

我们很高兴地宣布,随着 TensorFlow Lite GPU 后端开发者预览版的发布,你将能够利用移动 GPU 来选择模型训练 (如下所示),对于不支持的部分,将自动使用 CPU 进行推理。在未来的几个月里,我们将继续增加额外的操作系统,并改善 GPU 整体的后端产品。

新的后端利用了:
•OpenGL ES 3.1 在 Android 设备上计算着色器
•iOS 设备上的金属计算着色器

今天,我们发布了新的 GPU 后端的预编译二进制预览版,让开发人员和机器学习研究人员可以尽早尝试这种令人兴奋的新技术。我们计划在 2019 年晚些时候发布一个完整的开源版本,包含我们从开发者的经验中收集的反馈。

image

目前 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.实时视频分割

image

表 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 config
if (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

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

原文链接:

https://medium.com/tensorflow/te ... review-e15797e6dee7

文章版权归极客邦科技 InfoQ 所有,未经许可不得转载。
作者: lu01    时间: 2019-1-26 21:13

TensorFlow Lite的量化工具




深度智能




深度智能



深度学习经典与最新论文解析,论文实现等



1 人赞了该文章




本文翻译自TensorFlow的官方:https://medium.com/tensorflow/in ... ?linkId=57036398...




这篇文章将介绍TensorFlow的新的优化工具,开发人员,无论是新手还是高级,都可以用它来优化机器学习模型以进行部署和执行。




这些技术对于优化任何TensorFlow模型以进行部署都非常有用,但对于需要在内存,功耗和存储都有限的设备上使用TensorFlow Lite的开发人员来说,它们尤为重要。如果您还没有尝试过TensorFlow Lite,可以在这里【1】找到更多相关信息。





优化模型以减小尺寸,延迟和功率,同时精度损失不明显




TensorFlow Lite转换工具中新增的第一种技术是训练后量化(post-training quantization)。对于相关的机器学习模型,这可以导致高达4倍的压缩和高达3倍的执行速度。




通过量化他们的模型,开发人员还将获得降低功耗的额外好处。这对于在移动设备中的部署是很有用的。

启用训练后量化

训练后量化技术已集成到TensorFlow Lite转换工具中。入门很简单:在构建TensorFlow模型之后,开发人员可以在TensorFlow Lite转换工具中启用“post_training_quantize”标志。假设保存的模型存储在saved_model_dir中,可以生成量化的tflite flatbuffer:

converter=tf.contrib.lite.TocoConverter.from_saved_model(saved_model_dir)
converter.post_training_quantize=True
tflite_quantized_model=converter.convert()
open(“quantized_model.tflite”, “wb”).write(tflite_quantized_model)



我们的教程【2】将指导您深入了解如何执行此操作。在未来,我们的目标是将此技术整合到通用TensorFlow工具中,以便可以在TensorFlow Lite当前不支持的平台上进行部署。

训练后量化的好处
• 模型尺寸缩小4倍
• 模型主要由卷积层组成,执行速度提高10-50%
• 基于RNN的模型可以提高3倍的速度
• 由于减少了内存和计算要求,我们预计大多数模型的功耗也会降低

部分模型的模型尺寸缩短和执行时间加速,请参见下图(在Android Pixel 2手机的单核上进行测量)。







图2:延迟比较:优化模型的速度提高了1.2到1.4倍




这些加速和模型尺寸的减小对精度影响很小。通常,对于已经很小的模型(例如,用于图像分类的mobilenet v1)可能会有更多的准确性损失。对于许多这些模型,我们提供预训练好的全量化模型【3】。




图3:精度比较:除MobileNet外,优化模型的精度下降可忽略不计

我们希望将来继续改进我们的结果,因此请参阅模型优化【4】指南以获取最新测量结果。

训练后量化如何工作

在底层,我们通过将参数(即神经网络权重)的精度从训练期间的32位浮点表示降低到更小更有效的8位整数表示来运行优化(也称为量化)。 有关详细信息,请参阅训练后后量【5】指南。

这些优化确保将结果模型中的精度降低的操作定义与使用固定和浮点数学混合的内核实现匹配。这将以较低的精度快速执行最重的计算,同时最敏感的计算却具有更高的精度,因此通常致使任务的最终精度损失很小甚至没有损失,而且相对于纯浮点计算而言加速明显。对于没有匹配的“混合”内核的操作,或者工具包认为必要的操作,它会将参数重新转换为更高的浮点精度以便执行。请参阅训练后量化页面以获取支持的混合操作列表。

作者: 至大则刚    时间: 2019-1-27 15:56
虽然完全看不懂,也先点赞一下
作者: jcjcw3    时间: 2019-1-27 23:19
谢谢分享!
作者: missdeer    时间: 2019-1-28 11:13
机翻。。




欢迎光临 飞扬围棋 (http://bbs.flygo.net/BBS/) Powered by Discuz! X3.2