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

    文章

    4845

    浏览量

    108373
  • 张量
    +关注

    关注

    0

    文章

    7

    浏览量

    2698
  • tensorflow
    +关注

    关注

    13

    文章

    336

    浏览量

    62444
  • TensorFlow Lite
    +关注

    关注

    0

    文章

    26

    浏览量

    850

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    LuatOS的内存分配机制

    不同 LuatOS 硬件平台在内存布局上存在差异,Lua 运行内存、系统内存与 PSRAM 扩展内存的分配方式各有区别。部分型号将系统与脚本内存
    的头像 发表于 04-16 12:37 223次阅读
    LuatOS的<b class='flag-5'>内存</b>分配机制

    将TensorFlowSavedModel转换为支持imx8mpNPU的tflite模型,没有成功是怎么回事?

    } box_predictor { convolutional_box_predictor { use_depthwise:true } } } tflite conversion script 将 TensorFlow
    发表于 04-16 06:09

    eiQ Toolkit TFLite 转换器失败问题可能出在什么地方

    I am trying to convert an object detection model from tensorflow to tflite with int8 quantization
    发表于 04-15 08:21

    在 NPU 上运行了 eIQ TensorFlow Lite 示例模型报错

    我们已经在 NPU 上运行了 eIQ TensorFlow Lite 示例模型,但它们失败并出现以下错误: 信息:加载的模型 mobilenet_v1_1.0_224_quant.tflite
    发表于 03-18 06:52

    基于芯科科技xG24开发套件实现语音控制灯光的简易步骤

    本设计指南详细介绍了在Silicon Labs(芯科科技)的EFR32xG24 开发套件上使用 TensorFlow Lite Micro(TFLM)创建语音控制灯光应用的过程。该示例使用keyword_spotting_on_off_v3.
    的头像 发表于 03-04 15:50 1409次阅读

    IMX95 - NPU 不工作的原因?怎么解决?

    : Created TensorFlow Lite XNNPACK delegate for CPU. 我的问题是:哪个 SDK 版本真正正确支持 NPU?会升级到最新版本内核 6.12.34可能有帮助吗?我宁愿不回滚到内核 6.6如果可能的话。谢谢。
    发表于 02-26 11:21

    借助谷歌LiteRT构建下一代高性能端侧AI

    自 2024 年 LiteRT 问世以来,我们一直致力于将机器学习技术栈从其 TensorFlow Lite (TFLite) 基础之上演进为一个现代化的端侧 AI (On-Device AI
    的头像 发表于 01-30 11:23 3854次阅读
    借助谷歌LiteRT构建下一代高性能端侧AI

    容易造成单片机内存溢出的几个陷阱介绍

    关于程序变量和内存分配,都是需要我们时刻关注的问题。我相信有不少人在这块犯过很多的错误,也可能说明我们基础不够扎实,编写程序的习惯也不够好。 总结一下关于程序的变量和内存方面的概念,虽然是属于C语言
    发表于 01-23 07:25

    如何在TensorFlow Lite Micro中添加自定义操作符(1)

    相信大家在部署嵌入式端的AI应用时,一定使用过TensorFlow Lite Micro,以下简称TFLm。TFLm 是专为微控制器和嵌入式设备设计的轻量级机器学习推理框架,它通过模块化的操作符系统
    的头像 发表于 12-26 10:34 5879次阅读

    【上海晶珩睿莓1开发板试用体验】将TensorFlow-Lite物体归类(classify)的输出图片移植到LVGL9.3界面中

    既然调通了TensorFlow-Lite物体归类(classify)和LVGL9.3代码,那么把这两个东西结合起来也是没问题的,需要注意的是,TensorFlow-Lite是C++代码,而
    发表于 09-21 00:39

    【上海晶珩睿莓1开发板试用体验】TensorFlow-Lite物体归类(classify)

    库,则编译出来的OpenCV库不可以给TensorFlow-Lite代码使用,并且睿莓1开发板自带的2G内存其实也无法支撑OpenCV的完整编译过程,在编译途中就会发生内存交换错误。要解决此问题,方法
    发表于 09-12 22:43

    了解SOLIDWORKS202仿真方面的改进

    和效率,从而帮助设计师更好地应对复杂的设计挑战。本文将深入探讨SOLIDWORKS 2025在仿真方面的改进,揭示这些改进如何助力设计师实现更有效、更准确的仿真分析。
    的头像 发表于 09-04 10:36 902次阅读
    了解SOLIDWORKS202仿真<b class='flag-5'>方面的</b><b class='flag-5'>改进</b>

    澜起科技凭借在内存接口和高速互连芯片领域的突破性创新荣膺《财富》中国科技50强

    近日,《财富》杂志正式发布“中国科技50强”榜单,澜 起科技凭借在内存接口和高速互连芯片领域的突破性创新与全球影响力成功入选,成为中国半导体行业中技术实力与国际化发展兼备的杰出代表企业之一。 据悉
    的头像 发表于 08-25 10:03 2877次阅读
    澜起科技凭借<b class='flag-5'>在内存</b>接口和高速互连芯片领域的突破性创新荣膺《财富》中国科技50强

    如何进行tflite模型量化

    在windows上,如果我们按照上一期的方式安装了tflite2pb,是不能直接运行的。因为命令行工具是为linux编译的。
    的头像 发表于 08-13 11:45 1864次阅读
    如何进行<b class='flag-5'>tflite</b>模型量化

    无法将Tensorflow Lite模型转换为OpenVINO™格式怎么处理?

    Tensorflow Lite 模型转换为 OpenVINO™ 格式。 遇到的错误: FrontEnd API failed with OpConversionFailure:No translator found for TFLi
    发表于 06-25 08:27