0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

TensorFlow Lite (TFLite) 在内存使用方面的改进

Tensorflowers 来源:TensorFlow 作者: Juhyun Lee 和 Yury 2020-10-21 10:50 次阅读

文 /Juhyun Lee 和 Yury Pisarchyk,软件工程师

由于资源限制严重,必须在苛刻的功耗要求下使用资源有限的硬件,因此在移动和嵌入式设备上进行推理颇有难度。在本文中,我们将展示 TensorFlow Lite (TFLite) 在内存使用方面的改进,更适合在边缘设备上运行推理。

中间张量

一般而言,神经网络可以视为一个由算子(例如 CONV_2D 或 FULLY_CONNECTED)和保存中间计算结果的张量(称为中间张量)组成的计算图。这些中间张量通常是预分配的,目的是减少推理延迟,但这样做会增加内存用量。不过,如果只是以简单的方式实现,那么在资源受限的环境下代价有可能很高,它会占用大量空间,有时甚至比模型本身高几倍。例如,MobileNet v2 中的中间张量占用了 26MB 的内存(图 1),大约是模型本身的两倍。

图 1. MobileNet v2 的中间张量(上图)及其到二维内存空间大小的映射(下图)。如果每个中间张量分别使用一个专用的内存缓冲区(用 65 种不同的颜色表示),它们将占用约 26MB 的运行时内存

好消息是,通过数据相关性分析,这些中间张量不必共存于内存中。如此一来,我们便可以重用中间张量的内存缓冲区,从而减少推理引擎占用的总内存。如果网络呈简单的链条形状,则两个大内存缓冲区即够用,因为它们可以在整个网络中来回互换。然而,对于形成复杂计算图的任意网络,这个NP 完备(NP-complete)资源分配问题需要一个良好的近似算法

我们针对此问题设计了许多不同的近似算法,这些算法的表现取决于神经网络和内存缓冲区的属性,但都通过张量使用记录。中间张量的张量使用记录是一种辅助数据结构,其中包含有关张量的大小以及在给定的网络执行计划中首次最后一次使用时间的信息。借助这些记录,内存管理器能够在网络执行的任何时刻计算中间张量的使用情况,并优化其运行时内存以最大限度减少占用空间。

共享内存缓冲区对象

在 TFLite GPU OpenGL 后端中,我们为这些中间张量采用 GL 纹理。这种方式有几个有趣的限制:(a) 纹理一经创建便无法修改大小,以及 (b) 在给定时间只有一个着色器程序可以独占访问纹理对象。在这种共享内存缓冲区对象模式的目标是最小化对象池中创建的所有共享内存缓冲区对象的大小总和。这种优化与众所周知的寄存器分配问题类似,但每个对象的大小可变,因此优化起来要复杂得多。

根据前面提到的张量使用记录,我们设计了 5 种不同的算法,如表 1 所示。除了“最小成本流”以外,它们都是贪心算法,每个算法使用不同的启发式算法,但仍会达到或非常接近理论下限。根据网络拓扑,某些算法的性能要优于其他算法,但总体来说,GREEDY_BY_SIZE_IMPROVED 和 GREEDY_BY_BREADTH 产生的对象分配占用内存最小。

理论下限
https://arxiv.org/abs/2001.03288

表 1. “共享对象”策略的内存占用量(以 MB 为单位;最佳结果以绿色突出显示)。前 5 行是我们的策略,后 2 行用作基准(“下限”表示最佳数的近似值,该值可能无法实现,而“朴素”表示为每个中间张量分配专属内存缓冲区的情况下可能的最差数)

回到我们的第一个示例,GREEDY_BY_BREADTH 在 MobileNet v2 上表现最佳,它利用了每个算子的宽度,即算子配置文件中所有张量的总和。图 2,尤其是与图 1 相比,突出了使用智能内存管理器的优势。

图 2. MobileNet v2 的中间张量(上图)及其大小到二维内存空间的映射(下图)。如果中间张量共享内存缓冲区(用 4 种不同的颜色表示),它们仅占用大约 7MB 的运行时内存

内存偏移量计算

对于在 CPU 上运行的 TFLite,适用于 GL 纹理的内存缓冲区属性不适用。因此,更常见的做法是提前分配一个大内存空间,并通过给定偏移量访问内存在所有不干扰其他读取和写入操作的读取器和写入器之间共享。这种内存偏移量计算法的目的是最大程度地减小内存空间的大小。

我们针对此优化问题设计了 3 种不同的算法,同时还分析了先前的研究工作(Sekiyama 等人于 2018 年提出的 Strip Packing)。与“共享对象”法类似,根据网络的不同,一些算法的性能优于其他算法,如表 2 所示。这项研究的一个收获是:“偏移量计算”法通常比“共享对象”法占用的空间更小。因此,如果适用,应该选择前者而不是后者。

Strip Packing
https://arxiv.org/abs/1804.10001

表 2. “偏移量计算”策略的内存占用量(以 MB 为单位;最佳结果以绿色突出显示)。前 3 行是我们的策略,接下来 1 行是先前的研究,后 2 行用作基准(“下限”表示最佳数的近似值,该值可能无法实现,而“朴素”表示为每个中间张量分配专属内存缓冲区的情况下可能的最差数)

这些针对 CPU 和 GPU 的内存优化默认已随过去几个稳定的 TFLite 版本一起提供,并已证明在支持更苛刻的最新模型(如 MobileBERT)方面很有优势。直接查看 GPU 实现和 CPU 实现,可以找到更多关于实现的细节。

MobileBERT
https://tfhub.dev/tensorflow/lite-model/mobilebert/1/default/1

GPU 实现
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/delegates/gpu/common/memory_management

CPU 实现
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/simple_memory_arena.h

致谢

感谢 Matthias Grundmann、Jared Duke 和 Sarah Sirajuddin,特别感谢 Andrei Kulik 参加了最开始的头脑风暴,同时感谢 Terry Heo 完成 TFLite 的最终实现。

责任编辑:xj

原文标题:优化 TensorFlow Lite 推理运行环境内存占用

文章出处:【微信公众号:TensorFlow】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4733

    浏览量

    100410
  • 张量
    +关注

    关注

    0

    文章

    7

    浏览量

    2557
  • tensorflow
    +关注

    关注

    13

    文章

    328

    浏览量

    60463
  • TensorFlow Lite
    +关注

    关注

    0

    文章

    26

    浏览量

    596

原文标题:优化 TensorFlow Lite 推理运行环境内存占用

文章出处:【微信号:tensorflowers,微信公众号:Tensorflowers】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Google AI Edge Torch的特性详解

    我们很高兴地发布 Google AI Edge Torch,可将 PyTorch 编写的模型直接转换成 TFLite 格式 (.tflite),且有着优异的模型覆盖率和 CPU 性能。TFLite
    的头像 发表于 11-06 10:48 119次阅读
    Google AI Edge Torch的特性详解

    快速部署TensorflowTFLITE模型在Jacinto7 Soc

    电子发烧友网站提供《快速部署TensorflowTFLITE模型在Jacinto7 Soc.pdf》资料免费下载
    发表于 09-27 11:41 0次下载
    快速部署<b class='flag-5'>Tensorflow</b>和<b class='flag-5'>TFLITE</b>模型在Jacinto7 Soc

    第四章:在 PC 交叉编译 aarch64 的 tensorflow 开发环境并测试

    本文介绍了在 PC 端交叉编译 aarch64 平台的 tensorflow 库而非 tensorflow lite 的心酸过程。
    的头像 发表于 08-25 11:38 710次阅读
    第四章:在 PC 交叉编译 aarch64 的 <b class='flag-5'>tensorflow</b> 开发环境并测试

    TensorFlow是什么?TensorFlow怎么用?

    TensorFlow是由Google开发的一个开源深度学习框架,它允许开发者方便地构建、训练和部署各种复杂的机器学习模型。TensorFlow凭借其高效的计算性能、灵活的架构以及丰富的工具和库,在学
    的头像 发表于 07-12 16:38 524次阅读

    tensorflow和pytorch哪个更简单?

    PyTorch更简单。选择TensorFlow还是PyTorch取决于您的具体需求和偏好。如果您需要一个易于使用、灵活且具有强大社区支持的框架,PyTorch可能是一个更好的选择。如果您需要一个在
    的头像 发表于 07-05 09:45 698次阅读

    tensorflow和pytorch哪个好

    tensorflow和pytorch都是非常不错的强大的框架,TensorFlow还是PyTorch哪个更好取决于您的具体需求,以下是关于这两个框架的一些关键点: TensorFlow : 发布时间
    的头像 发表于 07-05 09:42 602次阅读

    tensorflow简单的模型训练

    在本文中,我们将详细介绍如何使用TensorFlow进行简单的模型训练。TensorFlow是一个开源的机器学习库,广泛用于各种机器学习任务,包括图像识别、自然语言处理等。我们将从安装
    的头像 发表于 07-05 09:38 471次阅读

    keras模型转tensorflow session

    在这篇文章中,我们将讨论如何将Keras模型转换为TensorFlow session。 Keras和TensorFlow简介 Keras是一个高级神经网络API,它提供了一种简单、快速的方式来构建
    的头像 发表于 07-05 09:36 435次阅读

    请问STM32H730 OSPI在内存映射模式下单次读写长度是多少?

    方面的配置。 OSPIM_CfgTypeDef sOspiManagerCfg = {0};/* USER CODE BEGIN OCTOSPI1_Init 1 *//* USER CODE END
    发表于 05-31 06:55

    fpga在通信方面的应用

    FPGA在通信方面的应用非常广泛,以下是一些主要的应用场景。
    的头像 发表于 03-27 14:10 920次阅读

    使用电脑上tensorflow创建的模型,转换为tflite格式了,导入后进度条反复出现0-100%变化,为什么?

    使用电脑上tensorflow创建的模型,转换为tflite格式了,导入后,进度条反复出现0-100%变化,卡了一个晚上了还没分析好?
    发表于 03-19 06:20

    数组和链表在内存中的区别 数组和链表的优缺点

    数组和链表在内存中的区别 数组和链表的优缺点  数组和链表是常见的数据结构,用于组织和存储数据。它们在内存中的存储方式以及优缺点方面存在一些显著的差异。本文将详细探讨这些差异以及它们的优缺点。 1.
    的头像 发表于 02-21 11:30 852次阅读

    【飞腾派4G版免费试用】第五章:使用C++部署tflite模型到飞腾派

    本章记录下使用 C++ 进行佩奇检测 tflite 模型推理的过程。
    的头像 发表于 12-28 09:08 1173次阅读
    【飞腾派4G版免费试用】第五章:使用C++部署<b class='flag-5'>tflite</b>模型到飞腾派

    【飞腾派4G版免费试用】第五章:使用C++部署tflite模型到飞腾派

    Pose Detection in C++ using Machine Learning with TensorFlow Lite Tensorflow 1 vs Tensorflow
    发表于 12-27 21:17

    【飞腾派4G版免费试用】第四章:部署模型到飞腾派的尝试

    tensorflow 的源码目录: mkdir tflite_pc; cd tflite_pc; cmake --build ../tensorflow/
    发表于 12-20 21:10