昇思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_context

set_context(mode=ms.GRAPH_MODE)

class Net(nn.Cell):
    def __init__(self):
        super(Net, self).__init__()

    def construct(self, x):
        return x + self.y

net = Net()
net(1)

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

import mindspore as ms

ms.set_context(mode=ms.GRAPH_MODE)

class Net(ms.nn.Cell):
    @classmethod
    def func(cls, x, y):
        return x + y

    def 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 = 1
    try:
        global_out = x / y
    except ZeroDivisionError:
        print("division by zero, y is zero.")
    return global_out

test_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 JitConfig

jitconfig = JitConfig(jit_level="O1")


net = LeNet5()

net.set_jit_config(jitconfig)

 

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Hugging Face Transformers为情绪分析微调BERT?

情绪分析指用于判断文本中表达的情绪的自然语言处理(NLP)技术,它是客户反馈评估、社交媒体情绪跟踪和市场研究等现代应用背后的一项重要技术。情绪可以帮助企业及其他组织评估公众意见、提供改进的客户服务,并丰富产品或服务。 BERT的全称是来自Transfo…

The First Descendant第一后裔联机失败、联机报错这样处理

第一后裔/The First Descendant是一款免费的多人合作射击游戏,玩家将进入一片混乱的英格里斯大陆,扮演继承者后裔,通过各种主支线任务和故事剧情触发,最终揭开自身的秘密,并带领大家一起抵抗邪恶势力的入侵。为了避免玩…

【Java Web】三大域对象

目录 一、域对象概述 二、三大域对象 三、域对象使用相关API 一、域对象概述 一些可用于存储数据和传递数据的对象被称为域对象,根据传递数据范围的不同,我们称之为不同的域,不同的域对象代表不同的域,共享数据的范围也不同。 二、…

ISP IC/FPGA设计-第一部分-SC130GS摄像头分析-IIC通信(1)

1.摄像头模组 SC130GS通过一个引脚(SPI_I2C_MODE)选择使用IIC或SPI配置接口,通过查看摄像头模组的原理图,可知是使用IIC接口; 通过手册可知IIC设备地址通过一个引脚控制,查看摄像头模组的原理图&#xff…

数据库调优厂商 OtterTune 宣布停止运营

昨天刷到消息,得知数据库优化厂商 OtterTune 停止了运营。OtterTune 的成员主要来自 CMU Andy Pavlo 教授领导的数据库实验室。公司正式成立于 2021 年 5 月,融资了 1450 万美金。 按照 Andy 教授的说法,公司是被一个收购 offer 搞砸了。同时…

npm-check【实用教程】升级项目中的依赖

安装 npm-check npm i -g npm-check检查项目中的依赖 npm-check会显示项目中没有使用,以及有新版本的依赖 升级项目中的依赖 npm-check -u方向键上下可以移动图中左侧的箭头空格键可选中/取消选中标注为 Major Update 和 Non-semver 类的版本,需去官网查…

用MySQL和navicatpremium做一个项目—(财务管理系统)。

1 ER图缩小的话怕你们看不清,所以截了两张图 2 vsdx绘图结果 3DDL和DML,都有点长分了好多次上传,慢慢看 DDL -- 用户表 CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用…

奔驰汽车的通信如此固若金汤的原因

随着摄像系统、距离控制、航线保持等功能以及制动辅助系统、制动力分配系统、车身侧倾干预与缓解系统等功能的飞速发展,汽车的系统功能之间已经不再独立,而是呈现互相合作的关系,各功能之间的无缝集成更是各大整车厂追求的目标。俗话说,外练筋骨皮,内练一口气,有了各式安…

第4章 客户端-客户端案例分析

1 Redis内存陡增 1.1.现象 服务端现象:Redis主节点内存陡增,几乎用满maxmemory,而从节点内存并没有变化(正常情况下主从节点内存使用量基本相同)。 客户端现象:客户端产生了OOM异常,也就是Redis…

桃园三结义 | 第1集 | 三人一条心,黄土变成金,有你带着俺,大事定能成功啊!| 正所谓择木之禽,得其良木,择主之臣,得遇明主 | 三国演义 | 群雄逐鹿

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 📌这篇博客是毛毛张结合三国演义原著分享三国演义文学剧本中的经典台词和语句,本篇分享的是《三国演义》第Ⅰ部分《群雄逐鹿》的第1️⃣集《桃…

eNSP中VRRP的配置和使用

一、基础配置 1.新建拓扑图 2.配置vlan a.CORE-S1 <Huawei>system-view [Huawei]sysname CORE-S1 [CORE-S1]vlan 10 [CORE-S1-vlan10]vlan 20 [CORE-S1-vlan20]vlan 30 b.CORE-S2 <Huawei>system-view [Huawei]sysname CORE-S2 [CORE-S2]vlan 10 [CORE…

2024年6月27日 (周四) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键&#xff0c;实现一键唤起、一键隐藏的 Windows 工具&#xff0c;并且支持窗口动态绑定快捷键&#xff08;无需设置自动实现&#xff09;。 喜马拉雅下载工具: 字面意思 Steam国产“类8番”游戏《永恒逃脱&#xff1a;暗影城堡》…

软件协同开发是一种通过团队合作来创建软件的开发方法

软件协同开发是一种通过团队合作来创建软件的开发方法。与传统的瀑布模型相比&#xff0c;软件协同开发强调团队成员之间的合作和沟通&#xff0c;以实现更高效的开发过程和更优质的软件产品。 在软件协同开发中&#xff0c;团队成员通过一系列工具和技术来协同工作。这些工具…

视觉灵感的探索和分享平台

做设计没灵感&#xff1f;大脑一片空白&#xff1f;灵感是创作的源泉&#xff0c;也是作品的灵魂所在。工作中缺少灵感&#xff0c;这是每个设计师都会经历的苦恼&#xff0c;那当我们灵感匮乏的时候&#xff0c;该怎么办呢&#xff1f;别急&#xff0c;即时设计、SurfCG、Lapa…

一种PCB外壳设计方法的尝试

一个异性PCB的板框&#xff0c;外壳&#xff0c;PCB设计&#xff1a; 正常情况下先由机械工程师用CAD设计出板框导出DXF文件&#xff0c;之后基于此DXF文件作为板框进行PCB设计和外壳设计&#xff0c;但对硬件工程师来讲有时候直接在PCB软件上进行简单的板框设计显得更方便&am…

apktool反编译apk工具

Android apk安装包反编译——apktool工具-CSDN博客 Android 如何反编译APK获取源码_android studio apk反源码-CSDN博客

VBA技术资料MF169:移动工作表到另外的工作簿

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

Java - Execl自定义导入、导出

1.需求&#xff1a;问卷星答 下图框出区域&#xff0c;为用户自定义字段问题及答案 2.采用技术EasyExcel 模板所在位置如下 /*** 导出模板** param response*/ Override public void exportTemplate(HttpServletResponse response) throws IOException {ClassPathResource c…

uni-app移动端使用uni-file-picker上传图片时通过canvas添加拍摄时间等水印信息

实现效果&#xff1a; 添加的照片添加水印信息 实现方式&#xff1a; 将添加水印的方法抽离成组件&#xff0c;为Vue文件&#xff0c;方便复用&#xff0c;在父组件中直接引用即可实现水印效果。 子组件&#xff1a;waterMarker.vue 此为添加水印的组件文件&#xff0c;…

python-(opencv)视频转glf

文章目录 前言python-(opencv)视频转glf1. 下载 opencv-python2. cv2&#xff08;OpenCV&#xff09;和imageio的区别3. demo源码 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说…