昇思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,一经查实,立即删除!

相关文章

JS面试题2——判断变量是不是数组有哪些方法

1. isArray var arr [1,2,3]; console.log( Array.isArray( arr ) ); <script> var arr [1,2,3]; var str 你好; console.log( Array.isArray( arr ) ); // true console.log( Array.isArray( str ) ); // false </script> 2. instanceof var arr [1,2,3]; co…

QQ等级评估源码+软件

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

7、广告-流量对接

在程序化广告中&#xff0c;技术的应用至关重要&#xff0c;尤其是流量对接的过程。本章详细介绍DSP与AdX/SSP对接、Trading Desk对接DSP以及PDB对接的技术细节和流程。 流量对接&#xff08;Traffic Integration&#xff09; 流量对接是程序化广告投放中至关重要的一环。它包…

ubuntu22.04 怎么查看visio 的文件

要在Ubuntu 22.04上查看Visio文件&#xff0c;可以使用以下方法之一&#xff1a; 1. 使用LibreOffice Draw LibreOffice Draw可以打开Microsoft Visio文件&#xff08;.vsd和.vsdx&#xff09;。默认情况下&#xff0c;LibreOffice可能已经安装在您的Ubuntu系统上。如果没有&…

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

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

Unity:使用Texture2D动态创建的图像无法正常显示 / 修改图像后未生效

开发中遇到需要动态绘制图像的需求&#xff0c;前后文代码如下所示&#xff1a; Texture2D newImageTexture new Texture2D(width, height); Color32[] newImagePixels new Color32[height * width];for (int y 0; y < height ; y) {for (int x 0; x < width; x){if…

flask的locked_cached_property

下面是一个关于 locked_cached_property 装饰器的详细教程。这个装饰器将一个方法转换为一个惰性属性&#xff0c;在第一次访问时计算其值&#xff0c;并在随后的访问中缓存该值。同时&#xff0c;它在多线程环境中是线程安全的。 教程&#xff1a;理解和使用 locked_cached_p…

多选项卡的shiny

下面是一个包含多个选项卡的 Shiny 应用程序示例代码。在这个例子中&#xff0c;我们创建了一个包含三个选项卡的 Shiny 应用程序&#xff0c;每个选项卡中都有不同的内容。 library(shiny)# Define UI ui <- fluidPage(titlePanel("多选项卡 Shiny 应用"),tabse…

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

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

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

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

ROS在汽车智能驾驶中能用到吗?

ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;在汽车智能驾驶中确实得到了广泛应用。它是一个专为机器人软件开发设计的灵活框架&#xff0c;尤其适合于自动驾驶汽车的研发。ROS在智能驾驶中的应用主要包括以下几个方面&#xff1a; 1. **传感…

如何使用PNP Powershell连接21vSharePoint Online

在我们使用PnP PowerShell的时候&#xff0c;如果想使用自己的账户通过Connect-PnPOnline 连接Global SharePoint Online时是十分方便的&#xff0c;可以通过一下几种方式 Credentials Connect-PnPOnline -Url "contoso.sharepoint.com" -Credentials (Get-Credenti…

怀庄之醉醉风流和醉逍遥有什么区别?哪一款更好喝

醉风流和醉逍遥是贵州怀庄酒业集团有限公司旗下怀庄之醉直营品牌的产品&#xff0c;两者主要在价格、酿造工艺和口感体验等方面有所区别&#xff1a; 价格 醉风流&#xff1a;参考价888元/瓶。 醉逍遥&#xff1a;参考价598元/瓶。 酿造工艺 醉风流&#xff1a;采用高粱、…

宏观经济学

SБ_Итоговая аттестация_Макроэкономика 你好&#xff0c;Вэйдун。当你提交此表单后&#xff0c;拥有者将会看到你的姓名和电子邮件地址。 1.GDP 等于 12000 个货币单位&#xff0c;折旧 - 1200 个货币单位&#xff0c;转移支付 - 750 …

WPF/C#:BusinessLayerValidation

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

【C++ 拓展】ifstream、ofstream、fstream的使用

文章目录 前言一、istream1.1 ifstream - 输入流1.2 具体使用构造函数成员函数open 函数&#xff1a;is_open 函数&#xff1a;close 函数&#xff1a;operator>> 重载&#xff1a;rdbuf 函数peek 函数read 函数getline 函数ignore 函数seekg 函数tellg 函数 二、ofstrea…

《人生苦短,我用python·五》pybind11关于继承,多态的使用

在使用 pybind11 进行 Python 和 C 之间的交互时&#xff0c;涉及到继承和多态的情况&#xff0c;需要注意几个关键点和技巧&#xff1a; 在 C 中定义基类和派生类 首先&#xff0c;在 C 中定义你的基类和派生类。例如&#xff0c;有一个简单的基类 Shape 和派生类 Circle&…

关于区块链技术实现的寄卖行的抵押平台建设方案

关于区块链技术实现的寄卖行抵押平台建设方案 一、项目背景与目标 随着数字化时代的快速发展&#xff0c;金融行业对安全性和效率的要求日益提高。寄卖行作为一种传统金融服务机构&#xff0c;也面临着业务模式创新和服务效率提升的挑战。本方案旨在利用区块链技术&#xff0…

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

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

Arduino IDE下载、安装和配置

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