当前位置: 首页 > news >正文

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

打卡

目录

打卡

AI编译框架运行模式

动态图模式PyNative

手动控制动态图运行示例-全局context

静态图模式Graph

手动控制静态图运行示例-全局context

​编辑

jit 装饰器加速图编译-例

jit函数变换方式加速图编译-例

jit 加速某个部分的神经网络模块-例

静态图的语法约束


AI编译框架运行模式

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

MindSpore提供了两种切换为图模式的方式,分别是基于装饰器的开启方式以及基于全局context的开启方式。

其中,MindSpore提供的 jit 装饰器可以通过修饰Python函数或者Python类的成员函数使其被编译成计算图,通过图优化等技术提高运行速度。此时模型的其他部分,仍旧使用解释执行方式,不丢失动态图的灵活性。

见下面各个截图运行时间对比,静态图模式下,程序运行时间是8.5秒左右,而动态图程序运行时间不超过0.05秒

动态图模式PyNative

特点:

  • 计算图的构建和计算同时发生(Define by run):即,定义tensor时,其值就已经被计算确定。
  • 调试模型更方便。
  • 难以对整个计算图进行优化。
  • 运行时间更短。

手动控制动态图运行示例-全局context

import time
import numpy as np
import mindspore as ms
from mindspore import nn, Tensor# 记录开始时间
start_time = time.time()
ms.set_context(mode=ms.PYNATIVE_MODE)  # 使用set_context进行动态图模式的配置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 logitsmodel = Network()
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
output = model(input)
# 记录结束时间
end_time = time.time()
# 计算时间差
time_difference = end_time - start_time
print(f"程序运行耗时: {time_difference} 秒")print(np.shape(output))
print(output) 

执行输出:

静态图模式Graph

静态图语法支持 — MindSpore master 文档

特点:

  • 计算图的构建和实际计算分开(Define and run)
  • 编译器可以针对图进行全局的优化,获得较好的性能
  • 适合网络固定且需要高性能的场景;使用MindSpore API以及基于Tensor对象的操作更适合使用静态图编译优化。
  • 静态图模式先编译后执行的模式导致其存在编译耗时。如果函数无需反复执行,那么使用静态图加速也可能没有价值。

手动控制静态图运行示例-全局context

import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
import time 
# 记录开始时间
start_time = time.time()
ms.set_context(mode=ms.GRAPH_MODE)  # 使用set_context进行运行静态图模式的配置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 logitsmodel = Network()
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
output = model(input)
# 记录结束时间
end_time = time.time()
# 计算时间差
time_difference = end_time - start_time
print(f"程序运行耗时: {time_difference} 秒")print(np.shape(output))
print(output)

执行输出

jit 装饰器加速图编译-例

import numpy as np
import mindspore as ms
from mindspore import nn, Tensorclass 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 logitsinput = 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)

运行输出

jit函数变换方式加速图编译-例

import numpy as np
import mindspore as ms
from mindspore import nn, Tensorclass 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 logitsinput = 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)

运行输出

jit 加速某个部分的神经网络模块-例

用静态图来进行 网络构建 编译如下图,construct意为神经网络(计算图)构建,相关内容详见使用静态图加速。

import numpy as np
import mindspore as ms
from mindspore import nn, Tensorclass 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))@ms.jit  # 使用ms.jit装饰器,使被装饰的函数以静态图模式运行def construct(self, x):x = self.flatten(x)logits = self.dense_relu_sequential(x)return logitsinput = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
model = Network()
output = model(input)
print(output)

运行输出

静态图的语法约束

在Graph模式下,python编译器不执行python代码,而将Python代码代码编译成静态计算图,然后执行静态计算图。在静态图模式下,MindSpore通过源码转换的方式,将Python的源码转换成中间表达IR(Intermediate Representation),并在此基础上对IR图进行优化,最终在硬件设备上执行优化后的图。MindSpore使用基于图表示的函数式IR,称为MindIR,详情可参考中间表示MindIR。

因此,编译器无法支持全量的Python语法。MindSpore的静态图编译器维护了Python常用语法子集,以支持神经网络的构建及训练。详情可参考静态图语法支持。

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

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

使用静态图高级编程技巧可以有效地提高编译效率以及执行效率,并可以使程序运行的更加稳定。详情可参考静态图高级编程技巧。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【MySQL基础篇】事务
  • RabbitMq,通过prefetchCount限制消费并发数
  • 排序之冒泡排序
  • 掌握构建魔法:Gradle中Groovy插件的配置秘籍
  • 深度解析 PostgreSQL Protocol v3.0(三)— 流复制(上)
  • i7-13700K负载过高时出现无故自动重启(蓝屏问题)
  • 小白的OS Copilot 产品测评
  • 微信小程序毕业设计-学习资料库系统项目开发实战(附源码+论文)
  • ETL数据集成丨主流ETL工具(ETLCloud、DataX、Kettle)数据传输性能大PK
  • 启动完 kubelet 日志显示 failed to get azure cloud in GetVolumeLimits, plugin.host: 1
  • 2024辽宁省大学数学建模竞赛试题思路
  • 什么是面向对象编程
  • MVC 控制器 中Action 不能同名,参数不一样,路由器寻找不到对应的,要加特性
  • Python-PLAXIS自动化建模技术与典型岩土工程案例
  • 新版Android Studio中设置gradle的JDK版本
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • js算法-归并排序(merge_sort)
  • MySQL主从复制读写分离及奇怪的问题
  • OSS Web直传 (文件图片)
  • Python学习笔记 字符串拼接
  • python学习笔记-类对象的信息
  • Redis 中的布隆过滤器
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Zepto.js源码学习之二
  • 高程读书笔记 第六章 面向对象程序设计
  • 聊聊hikari连接池的leakDetectionThreshold
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 探索 JS 中的模块化
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​Java基础复习笔记 第16章:网络编程
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • (4)STL算法之比较
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (备忘)Java Map 遍历
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (五)Python 垃圾回收机制
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转) 深度模型优化性能 调参
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ***利用Ms05002溢出找“肉鸡
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NetCore发布到IIS
  • .net反混淆脱壳工具de4dot的使用
  • .NET构架之我见
  • .net解析传过来的xml_DOM4J解析XML文件
  • .net快速开发框架源码分享
  • .NET中GET与SET的用法
  • .ui文件相关