Are you sure you want to delete this task? Once this task is deleted, it cannot be recovered.
chenzomi 24c9001cf8 | 1 year ago | |
---|---|---|
.. | ||
images | 1 year ago | |
graph_kernel.ipynb | 1 year ago | |
readme.md | 1 year ago | |
test_graph_kernel_fusion.py | 1 year ago |
本实验主要介绍使用MindSpore进行图算融合开发。对比基础算子融合前后、组合算子融合前后计算图,体会图算融合在性能上的优化。
从课程gitee仓库上下载本实验相关脚本。将脚本组织为如下形式:
graph_kernel
├── graph_kernel.ipynb
└── test_graph_kernel_fusion.py
其中test_graph_kernel_fusion.py为图算融合测试用例,graph_kernel.ipynb为测试用例执行脚本。
本实验需要使用华为云OBS存储脚本和数据集,可以参考快速通过OBS控制台上传下载文件了解使用OBS创建桶、上传文件、下载文件的使用方法(下文给出了操作步骤)。
提示: 华为云新用户使用OBS时通常需要创建和配置“访问密钥”,可以在使用OBS时根据提示完成创建和配置。也可以参考获取访问密钥并完成ModelArts全局配置获取并配置访问密钥。
打开OBS控制台,点击右上角的“创建桶”按钮进入桶配置页面,创建OBS桶的参考配置如下:
点击新建的OBS桶名,再打开“对象”标签页,通过“上传对象”、“新建文件夹”等功能,将脚本和数据集上传到OBS桶中。上传文件后,查看页面底部的“任务管理”状态栏(正在运行、已完成、失败),确保文件均上传完成。若失败请:
ModelArts Notebook资源池较小,且每个运行中的Notebook会一直占用Device资源不释放,不适合大规模并发使用(不使用时需停止实例,以释放资源)。可以参考创建并打开Notebook来创建并打开Notebook(下文给出了操作步骤)。
打开ModelArts控制台-开发环境-Notebook,点击“创建”按钮进入Notebook配置页面,创建Notebook的参考配置:
注意:
- 在Jupyter Notebook/JupyterLab文件列表里,展示的是关联的OBS桶里的文件,并不在当前Notebook工作环境(容器)中,Notebook中的代码无法直接访问这些文件。
- 打开Notebook前,选中文件列表里的所有文件/文件夹(实验脚本和数据集),并点击列表上方的“Sync OBS”按钮,使OBS桶中的所有文件同时同步到Notebook执行容器中,这样Notebook中的代码才能访问数据集。
- 使用Notebook时,可参考与OBS同步文件;
- 使用JupyterLab时,可参考与OBS同步文件。
- 同步文件的大小和数量超过限制时,请参考MoXing常用操作示例中的拷贝操作,将大文件(如数据集)拷贝到Notebook容器中。
- Notebook/JupyterLab文件列表页面的“Upload/上传”功能,会将文件上传至OBS桶中,而不是Notebook执行容器中,仍需额外同步/拷贝。
- 在Notebook里通过代码/命令(如
wget, git
、pythonurllib, requests
等)获取的文件,存在于Notebook执行容器中,但不会显示在文件列表里。- 每个Notebook实例仅被分配了1个Device,如果在一个实例中打开多个Notebook页面(即多个进程),运行其中一个页面上的MindSpore代码时,请关闭其他页面的kernel,否则会出现Device被占用的错误。
- Notebook运行中一直处于计费状态,不使用时,在Notebook控制台页面点击实例右侧的“停止”,以停止计费。停止后,Notebook里的内容不会丢失(已同步至OBS)。下次需要使用时,点击实例右侧的“启动”即可。可参考启动或停止Notebook实例。
打开Notebook后,选择MindSpore环境作为Kernel。
提示:
- 上述数据集和脚本的准备工作也可以在Notebook环境中完成,在Jupyter Notebook文件列表页面,点击右上角的"New"->"Terminal",进入Notebook环境所在终端,进入
work
目录,可以使用常用的linux shell命令,如wget, gzip, tar, mkdir, mv
等,完成数据集和脚本的下载和准备。- 可将如下每段代码拷贝到Notebook代码框/Cell中,从上至下阅读提示并执行代码框进行体验。代码框执行过程中左侧呈现[*],代码框执行完毕后左侧呈现如[1],[2]等。请等上一个代码框执行完毕后再执行下一个代码框。
图算融合是通过分析和优化现有网络计算图逻辑,对原有计算逻辑进行拆分、重组、融合等操作,以减少算子执行间隙的开销并且提升设备计算资源利用率,从而实现网络整体执行时间的优化。
MindSpore中的图算融合优化分布于网络图层编译和执行的多个步骤中,默认关闭状态,我们可以在训练脚本中为context指定参数enable_graph_kernel=True从而启用图算融合:
from mindspore import context
context.set_context(enable_graph_kernel=True)
基础算子融合场景:基础算子融合是指对网络中相关联的基础算子进行分析,在可以得到性能收益的条件下,将多个基础算子融合成为组合算子,以简单样例NetBasicFuse(见test_graph_kernel_fusion.py文件)说明。
组合算子融合场景:组合算子融合是指将原有的组合算子和与其相关的基础算子进行分析,在可以得到性能收益的条件下,将原有的组合算子和基础算子融合成为一个更大的组合算子,以简单样例NetCompositeFuse(见test_graph_kernel_fusion.py文件)说明。
设定场景包括:
- 基础算子无融合场景
- 基础算子融合场景
- 组合算子无融合场景
- 组合算子融合场景
本实验使用第三方工具pytest(安装方法:pip install -U pytest
)测试NetBasicFuse网络图算融合前后、NetCompositeFuse网络图算融合前后性能,并将生成的初始计算图6_validate.dot和算子融合后计算图hwopt_d_end.dot转化为png格式。比较不同场景下的初始计算图和算子融合后计算图。
作业基于上述打开的Notebook进行,进行作业前请确保完成了上述准备工作。如果Notebook资源不足,请参考lenet5实验将本Notebook转为训练作业,再行实验。
为了说明融合场景,我们构造两个简单网络,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,GraphKernel
from mindspore.ops import operations as P
context.set_context(mode=context.GRAPH_MODE, device_target="Ascend")
# save graph files.
context.set_context(save_graphs=True)
# enable graph kernel fusion.
context.set_context(enable_graph_kernel=True)
NetBasicFuse网络定义
# example for basic fusion.
class NetBasicFuse(Cell):
def __init__(self):
super(NetBasicFuse, self).__init__()
self.add = P.TensorAdd()
self.mul = P.Mul()
def construct(self, x):
mul_res = self.mul(x, 2.0)
add_res = self.add(mul_res, 1.0)
out_basic = self.mul(add_res, 3.0)
return out_basic
NetCompositeFuse网络定义。其中Composite类为GraphKernel算子,该定义包含两个基本算子(一个乘法和一个加法)。
# example for composite fusion.
class Composite(GraphKernel):
def __init__(self):
super(Composite, self).__init__()
self.add = P.TensorAdd()
self.mul = P.Mul()
def construct(self, x):
mul_res = self.mul(x, 2.0)
add_res = self.add(mul_res, 1.0)
return add_res
class NetCompositeFuse(Cell):
def __init__(self):
super(NetCompositeFuse, self).__init__()
self.mul = P.Mul()
self.composite=Composite()
def construct(self, x):
composite_=self.composite(x)
pow_res = self.mul(composite_, 3.0)
return pow_res
NetBasicFuse网络测试用例test_basic_fuse
def test_basic_fuse():
x = np.random.randn(4, 4).astype(np.float32)
net = NetBasicFuse()
result = net(Tensor(x))
print("================result=======================")
print("x: {}".format(x))
print("result: {}".format(result))
print("=======================================")
NetCompositeFuse网络测试用例test_composite_fuse
def test_composite_fuse():
x = np.random.randn(4, 4).astype(np.float32)
net = NetCompositeFuse()
result = net(Tensor(x))
print("================result=======================")
print("x: {}".format(x))
print("result: {}".format(result))
print("=======================================")
安装pytest测试工具
!pip install -U pytest
导入模块、变量定义、清理文件
import os
import shutil
test_basic_dir = 'test_basic_fuse'
test_composite_dir = 'test_composite_fuse'
! rm -rf *.ir
! rm -rf *.dot
! rm -rf *.dat
! rm -rf *.pb
! rm -rf kernel_meta
! rm -rf *.log
运行NetBasicFuse网络测试用例test_basic_fuse,会生成很多.ir 、.dot等文件。
! pytest -s test_graph_kernel_fusion.py::test_basic_fuse
将初始计算图6_validate.dot和算子融合后计算图hwopt_d_end.dot复制到obs桶中。
if os.path.exists(test_basic_dir):
shutil.rmtree(test_basic_dir)
! mkdir $test_basic_dir
! cp 6_validate.dot $test_basic_dir
! cp hwopt_d_end.dot $test_basic_dir
import moxing
moxing.file.copy_parallel(src_url=test_basic_dir, dst_url='s3://user/graph_kernel/test_basic/')
运行NetCompositeFuse网络测试用例test_composite_fuse生成组合算子融合场景下的初始计算图6_validate.dot和算子融合后计算图hwopt_d_end.dot并复制到obs中。
! rm -rf *.ir
! rm -rf *.dot
! rm -rf *.dat
! rm -rf *.pb
! rm -rf kernel_meta
! rm -rf *.log
!pytest -s test_graph_kernel_fusion.py::test_composite_fuse
if os.path.exists(test_composite_dir):
shutil.rmtree(test_composite_dir)
! mkdir $test_composite_dir
! cp 6_validate.dot $test_composite_dir
! cp hwopt_d_end.dot $test_composite_dir
import moxing
moxing.file.copy_parallel(src_url=test_composite_dir, dst_url='s3://user/graph_kernel/test_composite/')
改 test_graph_kernel_fusion.py中context.set_context(enable_graph_kernel=True)
为
context.set_context(enable_graph_kernel=False)
关闭图算融合。
改graph_kernel.ipynb中初始计算图6_validate.dot和算子融合后计算图hwopt_d_end.dot保存路径。
test_basic_dir = 'test_basic_fuse_no'
test_composite_dir = 'test_composite_fuse_no'
重新运行graph_kernel.ipynb生成基础算子无融合场景、组合算子无融合场景下的初始计算图6_validate.dot和算子融合后计算图hwopt_d_end.dot。
进入obs桶,下载文件夹test_basic_fuse_no
、test_composite_fuse_no
、test_basic_fuse
、test_composite_fuse
到本地。
注意: obs桶没有下载文件夹功能,可以先在本地建立目录,然后再一个一个文件下载存放。
本实验使用Graphviz工具将.dot格式文件转换为可以可视化的.png文件进行结果的展示和分析。
根据自己电脑系统,下载Graphviz 工具并安装。
注意: 安装过程中选择配置环境变量,如下图所示,若没有选择需要安装完成手动配置。
检查Graphviz是否安装成功
进入windows命令行界面(cmd),输入dot -version,然后按回车,如果显示graphviz的相关版本信息,则安装配置成功。
转换.dot文件为png格式文件
在windows命令行界面输入以下命令,即可在.dot文件目录找到转换成功的png格式文件。
cd 需要转换的.dot文件目录
dot 6_validate.dot -Tpng -o 6_validate.png
dot hwopt_d_end.dot.dot -Tpng -o hwopt_d_end.dot.png
图3:初始计算图同图1
图7:初始计算图同图5
从结果展示中可以看出:
MindSpore实验,仅用于教学或培训目的。配合MindSpore官网使用。 MindSpore experiments, for teaching or training purposes only. Use it together with the MindSpore official website.
CSV Jupyter Notebook Text Python Markdown other
Dear OpenI User
Thank you for your continuous support to the Openl Qizhi Community AI Collaboration Platform. In order to protect your usage rights and ensure network security, we updated the Openl Qizhi Community AI Collaboration Platform Usage Agreement in January 2024. The updated agreement specifies that users are prohibited from using intranet penetration tools. After you click "Agree and continue", you can continue to use our services. Thank you for your cooperation and understanding.
For more agreement content, please refer to the《Openl Qizhi Community AI Collaboration Platform Usage Agreement》