昇思25天学习打卡营第9天|使用静态图加速

 一、简介:

AI编译框架分为两种运行模式,分别是动态图模式以及静态图模式。MindSpore默认情况下是以动态图模式运行,但也支持手工切换为静态图模式。两种运行模式的详细介绍如下:

(1)动态图:

动态图的特点是计算图的构建和计算同时发生(Define by run),其符合Python的解释执行方式,在计算图中定义一个Tensor时,其值就已经被计算且确定,因此在调试模型时较为方便,能够实时得到中间结果的值,但由于所有节点都需要被保存,导致难以对整个计算图进行优化(也就是速度慢)。在MindSpore中,动态图模式又被称为PyNative模式。由于动态图的解释执行特性,在脚本开发和网络流程调试过程中,推荐使用动态图模式进行调试

(2)静态图:

相较于动态图而言,静态图的特点是将计算图的构建和实际计算分开(Define and run)。有关静态图模式的运行原理,可以参考静态图语法支持。

在MindSpore中,静态图模式又被称为Graph模式,在Graph模式下,基于图优化、计算图整图下沉等技术,编译器可以针对图进行全局的优化,获得较好的性能,因此比较适合网络固定且需要高性能的场景。

二、环境准备:

还是需要先下载MindSpore,再进行下面的操作,详情可见:昇思25天学习打卡营第1天|快速入门-CSDN博客

import time
import numpy as np
import mindspore as ms
from mindspore import nn, Tensor

构建一个简单的神经网络以展示MindSpore下静态图和动态图两种不同的模式:

class Network(nn.Cell):def __init__(self):super().__init__()self.flatten = nn.Flatten()self.dense_relu_sequential = nn.SequentialCell(nn.Dense(28*28, 512),nn.ReLU(),nn.Dense(512, 512),nn.ReLU(),nn.Dense(512, 10))def construct(self, x):x = self.flatten(x)logits = self.dense_relu_sequential(x)return logits

三、动态图VS静态图:

1、动态图下,神经网络的调用:

ms.set_context(mode=ms.PYNATIVE_MODE) # 开启pynative模式,即动态图model = Network()
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
output = model(input)
print(output)
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())), "VertexGeek")

 2、静态图下。神经网络的调用:

(1)全局context:

ms.set_context(mode=ms.GRAPH_MODE)  # 开启静态图模式model = Network()
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
output = model(input)
print(output)
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())), "VertexGeek")

如果出现小警告,不用管,大家都是老码农了只要能跑就不改的话我就不多说了(doge)!

(2)jit装饰器:

除了基于context全局模式下开启静态图以外,更多时候,我们在全局使用动态图的方式以实现更加灵活的神经网络构建方式,只在局部使用静态图加速计算,这里就用到了jit装饰器和函数变换实现对神经网络的局部加速:

装饰器:
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))@ms.jit  # 使用ms.jit装饰器,使被装饰的函数以静态图模式运行
def run(x):model = Network()return model(x)output = run(input)
print(output)
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())), "VertexGeek")

函数变换:

这种方法就是非常常见的将函数作为参数传入ms.jit方法中,以实现更灵活的使用。

input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))def run(x):model = Network()return model(x)run_with_jit = ms.jit(run)  # 通过调用jit将函数转换为以静态图方式执行
output = run(input)
print(output)
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())), "VertexGeek")

四、静态图的高级用法:

1、直接在前向传播网络中使用:

当我们需要对神经网络的某部分进行加速时,可以直接在construct方法上使用jit修饰器,在调用实例化对象时,该模块自动被编译为静态图。

@ms.jit  # 使用ms.jit装饰器,使被装饰的函数以静态图模式运行
def construct(self, x):x = self.flatten(x)logits = self.dense_relu_sequential(x)return logits

2、静态图语法约束:

在Graph模式下,Python代码并不是由Python解释器去执行,而是将代码编译成静态计算图,然后执行静态计算图。因此,编译器无法支持全量的Python语法。MindSpore的静态图编译器维护了Python常用语法子集,以支持神经网络的构建及训练。

在静态图模式下,MindSpore通过源码转换的方式,将Python的源码转换成中间表达IR(Intermediate Representation),并在此基础上对IR图进行优化,最终在硬件设备上执行优化后的图。MindSpore使用基于图表示的函数式IR,称为MindIR,是不是很眼熟,没错!就是上节课我们提到的用MindIR保存模型参数(doge)。

(1)当construct函数里,使用未定义的类成员时,将抛出AttributeError异常:

import mindspore as ms
from mindspore import nn, set_contextset_context(mode=ms.GRAPH_MODE)class Net(nn.Cell):def __init__(self):super(Net, self).__init__()def construct(self, x):return x + self.ynet = Net()
net(1)

(2)nn.Cell不支持classmethod修饰的类方法:

import mindspore as msms.set_context(mode=ms.GRAPH_MODE)class Net(ms.nn.Cell):@classmethoddef func(cls, x, y):return x + ydef construct(self, x, y):return self.func(x, y)net = Net()
out = net(ms.Tensor(1), ms.Tensor(2))
print(out)

 

(3)在图模式下,有些Python语法难以转换成图模式下的中间表示MindIR:

import mindspore as ms@ms.jit
def test_try_except(x, y):global_out = 1try:global_out = x / yexcept ZeroDivisionError:print("division by zero, y is zero.")return global_outtest_try_except_out = test_try_except(1, 0)
print("out:", test_try_except_out)

对标Python的关键字,存在部分关键字在图模式下是不支持的:AsyncFunctionDef、Delete、AnnAssign、AsyncFor、AsyncWith、Match、Try、Import、ImportFrom、Nonlocal、NamedExpr、Set、SetComp、Await、Yield、YieldFrom、Starred。如果在图模式下使用相关的语法,将会有相应的报错信息提醒用户。 

 

3、Jitconfig语法编辑:

在图模式下,可以通过使用JitConfig配置选项来一定程度的自定义编译流程,目前JitConfig支持的配置参数如下:

  • jit_level: 用于控制优化等级。
  • exec_mode: 用于控制模型执行方式。
  • jit_syntax_level: 设置静态图语法支持级别,详细介绍请见静态图语法支持。

这里在执行下面这段代码之前,需要事先下载LeNet神经网络,gitee地址如下:docs/mindspore/code/lenet.py · MindSpore/docs - Gitee.com

from mindspore import JitConfigjitconfig = JitConfig(jit_level="O1")net = LeNet5()net.set_jit_config(jitconfig)

 

 静态图高级编程技巧感兴趣的宝子可以去点击此连接静态图高级编程技巧 — MindSpore master 文档,这里就不多做赘述(偷懒doge),好了到这次课程截至,我们基础部分就全部结束了,之后会向大家展示一些有趣的小案例!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/862038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QQ等级评估源码+软件

今天,我将和大家探讨一个与直播、撸礼物相关的主题,它涉及到的是一种特殊的软件及其源码——QQ等级评估工具。在我们的生活中,直播已经成为了一种越来越流行的娱乐方式。不论是音乐会、电子竞技,还是日常生活分享,你都…

基于PHP的初中数学题库管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的初中数学题库管理系统 一 介绍 此初中数学题库管理系统基于原生PHP开发,数据库mysql,系统角色分为学生,教师和管理员。(附带参考设计文档) 技术栈:phpmysqlphpstudyvscode 二 功能 …

【深度学习】python之人工智能应用篇--跨模态生成技术

跨模态生成技术概述 跨模态生成技术是一种将不同模态的数据(如文本、图像、音频、视频等)进行融合和转换的技术。其目标是通过将一个模态的数据作为输入,生成与之对应的另一个模态的输出。这种技术对于突破单一模态的局限性,提高…

【图书推荐】CPython设计与实现“适合所有Python工程师阅读的书籍”

目录 一、图书推荐 |【CPython设计与实现】 1.1、书籍介绍 1.2、内容简介 1.3、适合哪些人阅读 1.4、作者译者简介 1.5、购买链接 一、图书推荐 |【CPython设计与实现】 "深入Python核心,揭秘CPython的设计智慧!📖 对于每一位热衷…

WPF/C#:BusinessLayerValidation

BusinessLayerValidation介绍 BusinessLayerValidation,即业务层验证,是指在软件应用程序的业务逻辑层(Business Layer)中执行的验证过程。业务逻辑层是应用程序架构中的一个关键部分,负责处理与业务规则和逻辑相关的…

【Java Web】Vite构建前端目录结构

目录 一、Vite概述 二、Vite构建Vue3工程化项目 三、ViteVue3项目目录结构 四、ViteVue3项目组件(SFC入门) 五、ViteVue3样式导入方式 六、ViteVue3响应式数据和setup语法糖 一、Vite概述 Vite是一种新型前端构建工具,能够显著提升前端开发体验;Vite结合…

Arduino IDE下载、安装和配置

文章开始先把我自己网盘里的安装包分享给大家,链接:https://pan.baidu.com/s/1cb2_3m0LnuSKLnWP_YoWPw?pwdwwww 提取码:wwww 里面一个是Arduino IDE的安装包,另一个是即将发布的版本。 第一个安装包打开直接按照我的步骤安装就…

【第一周】认识小程序

目录 认识小程序发展历史发展前景发展优势个人企业/创业 账号申请开发工具下载流程使用说明 协作项目交流收益渠道 认识小程序 发展历史 微信小程序自2016年首次提出以来,经历了快速的发展和完善过程,以下是其主要发展历史节点: 2016年1月…

将某列缺失分隔符的文字读入 Excel

有个逗号分隔的 txt,共 10 列,第 3 列有时候缺少分隔符,导致该列缺失,数据不齐只剩 9 列。比如最后两行: 01-0104-0133,MAYO, RONIE #2,202403,2024-03-21 22:51:43.000,1449.49,0.00,0.00,08,6CC6BDAC7E45 17-1782-02…

云端智慧,赋能风电场:工业级控制系统云监控网关

风力发电场监控平台实现对风电场的运行状态和风机的实时数据进行监测、控制和管理,提高风电场的可靠性和运行效率,降低维护成本,实现智能化管理。 风机机组PLC、多功能仪表、无线测温、温度变送器、档位变送器、设备接入网关上传数据服务器。…

STM32G4系列之DAC

一、STM32G4单片机有几个DAC外设? STM32G4单片机共有4个DAC,两个为低速DAC(采样率1MHz),两个为高速DAC(采样率15MHz)。共包括7个通道,3个外部通道和4个内部通道。 三个外部DAC包括DAC1和DAC2,其可以映射到外部管脚&am…

输电线路-防鸟设备神器合集!往这边看看!

有些人可能会很恨鸟儿吧。 综艺《种地吧》第一、第二季分别有陈某、王某负责河虾塘、龙虾塘,每天都会有一个“贵宾”-白鹭,如期而至开吃。兄弟俩对其真的恨,但又没办法,谁让白鹭是国家二级保护动物呢。同样在输电线路上也有这样的…

隐秘而又复杂的恶意软件:SSLoad

SSLoad 是一种隐秘的恶意软件,主要通过钓鱼邮件打开突破口,收集各种信息再回传给攻击者。近期,研究人员发现 SSLoad 通过诱饵 Word 文档投递恶意 DLL 文件,最终部署 Cobalt Strike。另一种攻击方式是利用钓鱼邮件诱导受害者到 Azu…

svn切换分支

现在有一个场景: 在svn中有一个b分支,是基于a分支拉出来的,并且我的b分支在本地已经有了改动,a分支在远端也有了改动, 我想把远端a分支的改动同步到我的本地b分支上,如何操作 目前已知的方法 项目右键-&g…

上古世纪战争台服官网地址+台服预约+预创建角色教程

上古世纪战争台服上线啦,在《上古世纪战争》中,通过主要势力和地区,剧情和角色可以想起原作。《上古世纪战争》的主要背景为,原大陆消失之后,完成移民的种族们定居在诺伊大陆之后遇到的多个势力之间的冲突。同时&#…

CentOS安装ntp时间同步服务

CentOS安装ntp时间同步服务 安装ntp 检查服务器是否安装ntp: rpm -q ntp安装ntp: yum install -y ntp服务端配置 配置文件路径:/etc/ntp.conf 设置ntp为开机启动 systemctl enable ntpd查看ntp开机启动状态 enabled:开启, disabled:关闭 …

C# 类中访问修饰符的优先级

参考链接 : C# 指南 - .NET 托管语言 | Microsoft Learn 访问修饰符 - C# | Microsoft Learn

MySQL周内训参照4、触发器-插入-修改-删除

触发器 1、用户购买商品时,要求库存表中的库存数量自动修改 详细示例 delimiter $$ create trigger stock_change after -- 事件触发在 下订单之后 insert -- 监视插入事件 on stock -- 监视 order订单表 for each row begin update stock set stockstock-new.st…

DLS策略洞察:如何应对AI数据中心网络交换机市场的爆发式增长?

摘要: 随着AI技术的发展和应用,AI数据中心对网络交换机的需求日益增加。摩根士丹利预计,2023-2026年间,AI数据中心网络交换机的收入复合年增长率(CAGR)将达到55%。本文将详细分析AI数据中心网络交换机市场…

C#udpClient组播

一、0udpClient 控件: button(打开,关闭,发送),textbox,richTextBox 打开UDP: UdpClient udp: namespace _01udpClient {public partial class Form1 : Form{public Form1(){Initi…