tensorflow图优化详解

一、运行时优化

    

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上同样略有提升。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TensorFlow像分割UNet是一种用于像分割任务的深度学习模型。UNet模型结构由编码器和解码器组成,编码器用于提取像的特征,解码器用于将特征映射回原始像尺寸,并生成分割掩码。 为了实现像分割任务,可以使用以下步骤: 1. 导入TensorFlow相关包和模块,如预处理模块、数据集模块和模型模块。 2. 加载和预处理像数据,可以使用预定义的函数来调整像大小和进行归一化处理。 3. 构建UNet模型,可以使用TensorFlow的Keras API来定义模型结构。 4. 编译模型,设置损失函数和优化器。 5. 训练模型,使用训练数据集进行模型训练。 6. 进行推理,使用训练好的模型对新的像进行分割预测。 7. 可以使用可视化工具如Matplotlib来显示分割结果。 下面是一个示例推理脚本,用于使用训练好的UNet模型对像进行分割预测: ``` import tensorflow as tf import numpy as np import matplotlib.pyplot as plt import cv2 model = tf.keras.models.load_model('model.h5') img = '17.jpg' img = cv2.resize(cv2.imread(img), (572, 572)) / 255. img = np.expand_dims(img, 0) pred = model.predict(img) pred = np.argmax(pred\[0\], axis=-1) pred\[pred == 1\] = 255 cv2.imwrite('result.jpg', pred) plt.imshow(pred) plt.show() ``` 此外,还可以定义加载和预处理像数据的函数,如下所示: ``` def load_image(datapoint): input_image = tf.image.resize(datapoint\['image'\], (128, 128)) input_mask = tf.image.resize(datapoint\['segmentation_mask'\], (128, 128)) input_image, input_mask = normalize(input_image, input_mask) return input_image, input_mask ``` 这个函数可以用于加载和预处理数据集中的像和分割掩码。 希望这些信息对你有帮助! #### 引用[.reference_title] - *1* *3* [像分割之Unet网络详解](https://blog.csdn.net/qq_28531269/article/details/120875597)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [TensorFlow实现Unet遥感像分割](https://blog.csdn.net/jameschen9051/article/details/122153734)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值