使能图算融合
图算融合是通过分析和优化现有网络计算图逻辑,对原有计算逻辑进行拆分、重组、融合等操作,以减少算子执行间隙的开销并且提升设备计算资源利用率,从而实现网络整体执行时间的优化。
MindSpore中的图算融合优化分布于网络图层编译和执行的多个步骤中,默认关闭状态,我们可以在训练脚本中为context
指定参数enable_graph_kernel=True
从而启用图算融合:
简单样例
为了说明融合场景,我们构造两个简单网络,
NetBasicFuse
包含一个乘法和加法计算,NetCompositeFuse
包含一个乘法、一个加法和一个指数计算。以下为代码样例,保存为test_graph_kernel_fusion.py
文件。``` import numpy as np import mindspore.context as context from mindspore import Tensor from mindspore.nn import Cell import mindspore.ops as ops
context.set_context(mode=context.GRAPH_MODE, device_target=”Ascend”)
save graph ir files.
context.set_context(save_graphs=True)
enable graph kernel fusion.
example for basic fusion.
class NetBasicFuse(Cell):
BERT-large
训练网络以网络的训练模型为例,数据集和训练脚本可参照 ,同样我们只需修改
context
参数即可。
为了验证图算融合是否生效及其具体效果,我们可以通过对比启用前后计算图的改变和网络训练单step时间的变化进行评估。
计算图
基础算子融合场景:基础算子融合是指对网络中相关联的基础算子进行分析,在可以得到性能收益的条件下,将多个基础算子融合成为组合算子,以简单样例
NetBasicFuse
说明。脚本执行结束后,我们在脚本运行目录可以得到一些
.dot
文件,使用dot
工具可以将.dot
文件转换为.png
文件进行查看。我们以6_validate.dot
和hwopt_d_fuse_basic_opt_end_graph_0.dot
生成初始计算图和基础算子融合后计算图。如图1所示,我们构造的网络的初始计算中有两个基础算子计算,打开图算融合的开关之后会自动将两个基础算子(
Mul
、TensorAdd
)融合为一个算子(组合算子)。图2中,右上角部分即为融合之后的组合算子,现在网络只需要执行一个组合算子就可以完成原有的、TensorAdd
两次计算。图1:初始计算图
图2:基础算子融合后计算图