昇思MindSpore进阶教程--使能图算融合

news/2024/12/21 19:34:39/

大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。
技术上主攻前端开发、鸿蒙开发和AI算法研究。
努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧

正文开始

图算融合是MindSpore特有的网络性能优化技术。它可以通过自动分析和优化现有网络计算图逻辑,并结合目标硬件能力,对计算图进行计算化简和替代、算子拆分和融合、算子特例化编译等优化,以提升设备计算资源利用率,实现对网络性能的整体优化。相比传统优化技术,图算融合具有多算子跨边界联合优化、与MindSpore AKG(基于Polyhedral的算子编译器)跨层协同、即时编译等独特优势。另外,图算融合只需要用户打开对应配置后,整个优化过程即可自动完成,不需要网络开发人员进行其它额外感知,使得用户可以聚焦网络算法实现。
图算融合的适用场景包括:

  • 对网络执行时间具有较高性能要求的场景;
  • 通过拼接基本算子实现自定义组合算子,并希望对这些基本算子进行自动融合,以提升自定义组合算子性能的场景。

使用方法

当前图算融合优化默认关闭状态,我们只需在训练脚本中为context指定参数enable_graph_kernel=True即可启用图算融合:

import mindspore as ms
ms.set_context(enable_graph_kernel=True)

样例脚本

为了说明图算融合优化场景,我们构造了一个简单网络MyNet, 包含一个乘法和加法计算。在打开图算融合进行优化之后,这两个计算便会自动合成一个融合算子:

import numpy as np
import mindspore as ms
from mindspore.nn import Cell
import mindspore.ops as opsms.set_context(mode=ms.GRAPH_MODE, device_target="GPU")
# save graph ir to view fusion detail.
ms.set_context(save_graphs=2)
# enable graph kernel optimization.
ms.set_context(enable_graph_kernel=True)class MyNet(Cell):def construct(self, x):a = ops.mul(x, 2.0)res = ops.add(a, 1.0)return resx = np.ones((4, 4)).astype(np.float32) * 0.5
net = MyNet()
result = net(ms.Tensor(x))
print("result: {}".format(result))

该计算图的融合结果如图1所示,其中左图为未使能图算融合时的对应计算图,右图为使能图算融合后的对应计算图。可以看到该网络中的加法和乘法被融合成一个算子。该融合过程可以通过查看中间IR,或者通过Profiling等工具跟踪算子执行过程进行验证。

在这里插入图片描述

自定义组合算子

基于图算融合技术,用户可以很方便地实现高性能的自定义组合算子。其主要流程为:

  1. 在脚本中用基本算子组合的方式实现自定义算子定义和使用;

  2. 打开图算融合配置;

  3. 图算融合对自定义组合算子中的基本算子自动进行算子融合,并生成高性能融合算子。

相比其它自定义算子方式,这种方式具有对框架无侵入、简单易用等优点。

样例脚本

我们构造一个简单网络MyNet,并在其中使用了自定义算子MyOp。代码样例如下:

import numpy as np
import mindspore as ms
from mindspore.nn import Cell
import mindspore.ops as opsms.set_context(mode=ms.GRAPH_MODE, device_target="GPU")
# enable graph kernel optimization.
ms.set_context(enable_graph_kernel=True)class MyOp(Cell):""" my first custom OP composited by basic OPs """def construct(self, x, y):a = ops.sub(x, y)return ops.mul(a, x)class MyNet(Cell):def __init__(self):super(MyNet, self).__init__()self.my_op = MyOp()def construct(self, x, y):a = ops.mul(x, 2.0)b = ops.pow(a, 3.0)res = self.my_op(b, y)return resx = np.ones((4, 4)).astype(np.float32) * 0.2
y = np.ones((4, 4)).astype(np.float32) * 0.3
net = MyNet()
result = net(ms.Tensor(x), ms.Tensor(y))
print("result: {}".format(result))

该计算图的融合结果如图2所示,其中左图为未使能图算融合时的对应计算图,右图为使能图算融合后的对应计算图。可以看到不仅自定义算子MyOp中的基本算子进行了融合,并且与主图中的其他算子也进行了更大范围融合。该融合过程可以通过查看中间IR,或者通过Profiling等工具跟踪算子执行过程进行验证。
在这里插入图片描述


http://www.ppmy.cn/news/1533744.html

相关文章

Android Studio 占满C盘快速解决方法

首先,把 C:\Users\用户名\.android 和 C:\Users\用户名\.gradle 移动到D盘。 然后打开 CMD(PowerShell 不行),执行下面的命令: mklink /d C:\Users\用户名\.android 移动后.android的路径 mklink /d C:\Users\用户名…

liunxcentos7下 跟目录空间不足docker load镜像报错空间不足

前两天在公司,做jenkins流水线项目,然后把项目放到docker容器里面运行,就在我把镜像打好包的时候正准备往服务器里面导入镜像的时候报错:如图所示 这时发现自己的根目录空间不足。 解决办法:重新加一块磁盘将磁盘挂载…

论文笔记:Anytime Continual Learning for Open Vocabulary Classification

1. 挑战/问题 在开放词汇表图像分类中,随着时间的推移,模型需要不断学习新的标签,同时保留对旧标签的记忆。这导致几个挑战: 数据增量学习:模型需要在任意时间点有效地吸收新的训练样本。模型持续改进:模…

快速创建第一个Spring Boot 项目

一、介绍 Spring Boot 是一个开源的 Java 基础框架,它基于 Spring 框架,用于创建独立、生产级别的基于 Spring 的应用程序,你可以“跑起来”(run)你的 Spring 应用程序。Spring Boot 让基于 Spring 的应用开发变得更容…

戴尔PowerEdge R840服务器亮黄灯 不开机

最近接修到一台东莞用户的DELL PowerEdge R840 服务器因为意外断电后,无法正常开机的问题, 大概故障现象是 插上电源线 按卡机按钮无响应,无法开机,无显示输出,工程师到现场检修,经过idrac中日志分析&#…

每天五分钟玩转深度学习框架pytorch:多种定义损失函数的方法

本文重点 再编译神经网络的时有两个必要的元素,其中一个是损失函数,另外一个是优化器。前面的专栏我们已经介绍了优化器,本节课程我们介绍损失函数。损失函数属于神经网络训练的第5步。 nn.Module 和 nn.functional的损失函数 我们前面介绍过nn.Module和nn.functional的区…

算法专题二: 滑动窗口

目录 1. 长度最小的子数组2. 无重复字符的最长子串3. 最大连续1的格数Ⅲ4. 将x减到0的最小操作数5. 水果成篮6. 找到字符串中所有字母异位词7. 串联所有单词的子串8. 最小覆盖子串 1. 长度最小的子数组 题目思路: 首先暴力解法就是依次枚举出所有的子数组, 从第一个元素为左端…

Nacos 是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台,旨在帮助开发者更轻松地构建、部署和管理微服务应用。

Nacos 是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台,旨在帮助开发者更轻松地构建、部署和管理微服务应用。Nacos 提供了一系列的功能来支持服务注册与发现、配置管理、服务元数据管理、流量管理、服务健康检查等,是构建云原生应用和服务网…