tensorflow图优化详解

2023-05-16

一、运行时优化

    

Grappler是TensorFlow提供的运行时优化功能,图1为Grappler模块主要功能的UML关系图。其中tensorflow.grappler.GrapplerItem:表示待优化的TensforFlow模型,主要包括计算图、fetch节点、feed节点;

tensorflow.grappler.GraphOptimizer:是grappler中所有派生类的父类;tensorflow.grappler.MetaOptimizer: 进行op fusion的优化类;

tensorflow.gappler.ModelPruner:裁剪计算图,剔除不需要的节点;tensorflow.grappler.ConstantFolding:做常量的折叠,所谓的常量折叠是将计算图中可以预先可以确定输出值的节点替换成常量,并对计算图进行一些结构简化的操作。

        图1 grappler模块类的UML结构

        运行时优化与离线优化不同,只在inference会话时对加载的graph进行online优化,并不会改变用户保存的graph结构。创建session会话,tensorflow默认开启Grappler全部的优化功能。经过测试以及论证,通过有效的配置可进一步提升inference效率。

layout optimizer优化

通常情况,卷积内存布局分为NHWC以及NCHW两种格式。tensorflow默认layout为NHWC,通常开启layout optimizer选项,GPU模式下运行时将layout转换为NCHW。

经实验可知在卷积kernel size大于1的情况下,GPU测试在NCHW的内存布局上执行的效率高于NHWC格式。而当卷积kernel size为1时,tensorflow源码在laytout为NHWC时采用矩阵乘的方式,layout为NCHW时则采用cuDNN卷积实现,此时在GPU上测试Conv2D执行效率,NCHW格式执行效率会低于NHWC格式。

故根据模型结构,合理配置layout optimizer功能能更好的发挥Grappler优化器的效果。ALPS根据业务需求提炼出得的一系列image模型存在大量的1x1卷积,关闭该选项inference效率相比默认开启时效率更高。

二、离线优化

   graph transformtool是tf提供的离线图优化工具,具体使用形式包含python API以及命令行两种。

接口介绍:

2.1 remapper

remapper表示对op或者op组合做了重新映射,目前支持的映射组合case列为: Conv2D+FusedBatchNorm --> Conv2D+BiasAdd;

Conv2D+BatchNormWithGlobalNormalization --> Conv2D+BiasAdd;

MatMul+FusedBatchNorm --> MatMul+BiasAdd;

MatMul+BatchNormWithGlobalNormalization --> MatMul+BiasAdd。

BN层实现如公式(1):

(1)

将BN层与卷积以及矩阵乘通过参数融合,重映射为BiasAdd,经过映射BN层的参数融合到卷积以及矩阵乘,乘加操作减少为BiasAdd层的加法操作,有效减少了计算量。

2.1.2 Constant folding optimizer

该类优化主要对graph结构做进一步简化,主要优化结构包含:

1)删除冗余的算子: identity Reshape, Transpose 1-d tensor,Slice(x) = x等等。

2)通过Enter进行的常量传播;

3)重写依赖;

Constant push-down:

■ Add(c1, Add(x, c2)) => Add(x, c1 + c2)

■ ConvND(c1 * x, c2) => ConvND(x, c1 * c2)

Partial constfold:

■ AddN(c1, x, c2, y) => AddN(c1 + c2, x, y),

■ Concat([x, c1, c2, y]) = Concat([x, Concat([c1, c2]), y)

Operations with neutral & absorbing elements:

■ x * Ones(s) => Identity(x), if shape(x) == output_shape

■ x * Ones(s) => BroadcastTo(x, Shape(s)), if shape(s) == output_shape

■ Same for x + Zeros(s) , x / Ones(s), x * Zeros(s) etc.

■ Zeros(s) - y => Neg(y), if shape(y) == output_shape

■ Ones(s) / y => Recip(y) if shape(y) == output_shape

2.1.3 strip unused nodes

tensorflow计通过构图搭建好完整的计算图,且提供了接口可直接指定计算图的输入输出,指定了inputs/outputs,实际运行的输入输出流所产生的数据依赖图应当是原始构造的graph结构的子集,通过使用strip_unused_nodes功能可删除不在数据依赖中的节点以及参数。

2.1.4 remove training nodes

该功能主要删除一些训练过程存在的一些冗余节点,包括标志节点identity、检查节点CheckNumerics等。在inference阶段,通过判断该类节点是否存在数据流控制依赖对节点进行删除。

结论:单独的graph transform优化对模型inference效率提升的数据。列表中GPU提升在11%~22%之间。

graph transform + layout optimize组合优化后的效率与原始的predict接口inference的时间的对比,相比较原来的inference,组合优化提升效率较明显,GPU提升在20%~37%之间,CPU上同样略有提升。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tensorflow图优化详解 的相关文章

  • 模糊PID控制算法的C++实现

    很久没有更新博客了 xff0c 今天就来讲讲模糊PID的C 43 43 实现方法 先来看一下整体的框架 xff1a 解释下上面框图的意思 xff0c 模糊PID其实是在普通PID的基础之上 xff0c 通过输入的两个变量 xff1a 误差和
  • C++ Map常见用法说明

    一 声明二 插入操作 1 使用 进行单个插入1 使用insert进行单个和多个插入 三 取值四 容量查询五 迭代器六 删除交换 1 删除2 交换 七 顺序比较八 查找九 操作符 C 43 43 中map提供的是一种键值对容器 xff0c 里
  • MEC —— 优化内存与速度的卷积计算

    本次介绍一种内存利用率高且速度较快的卷积计算方法 来自ICML2017 MEC Memory efficient Convolution for Deep Neural Network 1 背景工作 目前的CNN模型中 xff0c 全连接层
  • linux下常见版本查询操作

    系统版本查询 1 使用uname命令 打印所有版本信息 可通过uname help查看使用方法 uname xff0d span class hljs operator a span 我的 输出 xff1a Linux cvlab span
  • ubuntu 18.04 下 D435i SDK安装 ros-wapper安装 绘制rosbag 运行vins-mono离线/在线

    1 参考blog 1 D435i Ubuntu18 04使用D435i运行VINS Mono 2 RealSenseD435i xff08 一 xff09 xff1a Ubuntu18 04 下的安装 使用和bag录制 xff0c 且解决
  • 两年工作经验程序员的迷茫

    每个人都有每个人的经历 xff0c 每个程序员也有每个程序员的经历 上大学时 xff0c 读的是计算机专业 大一时 xff0c 开始学习office软件 xff0c 之后接触第一种计算机语言C语言 特别是C语言课时 xff0c 其实上课有很
  • 阿里云AccessKey ID获取方式

    1 登录到阿里云的控制台 xff0c 点击右上角的头像图标 xff0c 如下所示 xff1a 2 点击 AccessKey 管理 xff0c 展示如下 xff0c 然后点击 继续使用 xff0c 就可以申请AccessKeyID 和Acce
  • docker启动ubuntu的桌面环境

    一 概述 由于最近一段时间在家办公 xff0c 国内服务器在阿里云 xff0c 国外站点在aws 家里的移动宽带比较差 xff0c 无法访问aws 所以尝试在阿里云启动docker xff0c 找到一个lxde桌面环境的ubuntu镜像 二
  • Portainer中文汉化

    一 概述 Portainer是Docker的图形化管理工具 xff0c 提供状态显示面板 应用模板快速部署 容器镜像网络数据卷的基本操作 xff08 包括上传下载镜像 xff0c 创建容器等操作 xff09 事件日志显示 容器控制台操作 S
  • docker安装kibana

    一 概述 Kibana是一个针对Elasticsearch的开源分析及可视化平台 xff0c 用来搜索 查看交互存储在Elasticsearch索引中的数据 使用Kibana xff0c 可以通过各种图表进行高级数据分析及展示 环境说明 操
  • pyecharts 画地图(热力图)(世界地图,省市地图,区县地图)

    一 概述 在上一篇文章中 xff0c 链接如下 xff1a https www cnblogs com xiao987334176 p 13791061 html 已经介绍了pyecharts画一些基本图形 xff0c 接下来介绍画地图 二
  • vue日期格式化

    一 概述 现有vue页面如下 xff1a 需要将日期转换为 xff1a 2020 12 25 二 实现 修改vue html部分 xff0c 应用方法dateFormat lt el table column prop 61 34 star
  • ElementUI-textarea文本域高度自适应设置的方法

    一 概述 textarea默认情况下 xff0c 当超出范围后 xff0c 会在右边显示滑动条 体验不太好 xff0c 不需要滑动条 xff0c 根据内容 xff0c 自动增加高度 xff0c 并显示完整内容 二 解决方法 主要有3种方式
  • ElementUI 实现el-table 列宽自适应

    一 概述 Element UI 是 PC 端比较流行的 Vue js UI 框架 xff0c 它的组件库基本能满足大部分常见的业务需求 但有时候会有一些定制性比较高的需求 xff0c 组件本身可能没办法满足 最近在项目里就碰到了 很多页面都
  • 微信小程序设置底部导航栏

    一 概述 微信小程序底部想要有一个漂亮的导航栏目 xff0c 不知道怎么制作 xff0c 于是百度找到了本篇文章 xff0c 分享给大家 好了 小程序的头部标题 设置好了 xff0c 我们来说说底部导航栏是如何实现的 我们先来看个效果图 这
  • ElementUI 轮播图

    一 概述 因项目需求 xff0c 需要增加轮播图 xff0c 官方demo效果如下 xff1a 但这个不是我们想要的 xff0c 我们需要的是这样的 二 代码实现 需要在原有的基础上 xff0c 修改页面样式才行 test vue lt t
  • Word在试图打开文件时遇到错误。 请尝试下列方法: 检查文档或驱动器的文件权限。 确保有足够的内存和磁盘空间。 用文本恢复转换器打开文件。

    重新装office之后打开系统的文件提示 Word在试图打开文件时遇到错误 请尝试下列方法 检查文档或驱动器的文件权限 确保有足够的内存和磁盘空间 用文本恢复转换器打开文件 1 文件安全性问题 xff0c 可以打开Word 或ppt xff
  • Docker部署RocketMQ集群

    一 概述 Apache RocketMQ是阿里开源的一款高性能 高吞吐量 队列模型的消息中间件的分布式消息中间件 关于RocketMQ集群架构的详细介绍 xff0c 请参考链接 xff1a https blog csdn net Weixi
  • docker安装zabbix

    一 概述 Zabbix 是一款能够监控众多网络参数和服务器的健康度和完整性的软件 Zabbix 使用灵活的通知机制 xff0c 允许用户为几乎任何事件配置基于邮件的警报 这样可以快速相应服务器问题 Zabbix 基于存储的数据提供出色的报告
  • kafka删除topic数据

    kafka删除topic数据 一 概述 生产环境中 xff0c 有一个topic的数据量非常大 这些数据不是非常重要 xff0c 需要定期清理 要求 xff1a 默认保持24小时 xff0c 某些topic 需要保留2小时或者6小时 二 清

随机推荐