使用静态图加速

背景介绍

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

动态图模式

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

在MindSpore中,动态图模式又被称为PyNative模式。由于动态图的解释执行特性,在脚本开发和网络流程调试过程中,推荐使用动态图模式进行调试。 如需要手动控制框架采用PyNative模式,可以通过以下代码进行网络构建:

import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
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)
print(output)
[[-0.00134926 -0.13563682 -0.02863023 -0.05452826  0.03290743 -0.12423715-0.0582641  -0.10854103 -0.08558805  0.06099342][-0.00134926 -0.13563682 -0.02863023 -0.05452826  0.03290743 -0.12423715-0.0582641  -0.10854103 -0.08558805  0.06099342][-0.00134926 -0.13563682 -0.02863023 -0.05452826  0.03290743 -0.12423715-0.0582641  -0.10854103 -0.08558805  0.06099342][-0.00134926 -0.13563682 -0.02863023 -0.05452826  0.03290743 -0.12423715-0.0582641  -0.10854103 -0.08558805  0.06099342][-0.00134926 -0.13563682 -0.02863023 -0.05452826  0.03290743 -0.12423715-0.0582641  -0.10854103 -0.08558805  0.06099342]...[-0.00134926 -0.13563682 -0.02863023 -0.05452826  0.03290743 -0.12423715-0.0582641  -0.10854103 -0.08558805  0.06099342][-0.00134926 -0.13563682 -0.02863023 -0.05452826  0.03290743 -0.12423715-0.0582641  -0.10854103 -0.08558805  0.06099342][-0.00134926 -0.13563682 -0.02863023 -0.05452826  0.03290743 -0.12423715-0.0582641  -0.10854103 -0.08558805  0.06099342][-0.00134926 -0.13563682 -0.02863023 -0.05452826  0.03290743 -0.12423715-0.0582641  -0.10854103 -0.08558805  0.06099342]]

静态图模式

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

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

如需要手动控制框架采用静态图模式,可以通过以下代码进行网络构建:

import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
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)
print(output)
[[ 0.05363735  0.05117104 -0.03343301  0.06347139  0.07546629  0.032630910.02790363  0.06269836  0.01838502  0.04387159][ 0.05363735  0.05117104 -0.03343301  0.06347139  0.07546629  0.032630910.02790363  0.06269836  0.01838502  0.04387159][ 0.05363735  0.05117104 -0.03343301  0.06347139  0.07546629  0.032630910.02790363  0.06269836  0.01838502  0.04387159][ 0.05363735  0.05117104 -0.03343301  0.06347139  0.07546629  0.032630910.02790363  0.06269836  0.01838502  0.04387159]...[ 0.05363735  0.05117104 -0.03343301  0.06347139  0.07546629  0.032630910.02790363  0.06269836  0.01838502  0.04387159][ 0.05363735  0.05117104 -0.03343301  0.06347139  0.07546629  0.032630910.02790363  0.06269836  0.01838502  0.04387159][ 0.05363735  0.05117104 -0.03343301  0.06347139  0.07546629  0.032630910.02790363  0.06269836  0.01838502  0.04387159][ 0.05363735  0.05117104 -0.03343301  0.06347139  0.07546629  0.032630910.02790363  0.06269836  0.01838502  0.04387159]]

静态图模式的使用场景

MindSpore编译器重点面向Tensor数据的计算以及其微分处理。因此使用MindSpore API以及基于Tensor对象的操作更适合使用静态图编译优化。其他操作虽然可以部分入图编译,但实际优化作用有限。另外,静态图模式先编译后执行的模式导致其存在编译耗时。因此,如果函数无需反复执行,那么使用静态图加速也可能没有价值。

有关使用静态图来进行网络编译的示例,请参考网络构建。

静态图模式开启方式

通常情况下,由于动态图的灵活性,我们会选择使用PyNative模式来进行自由的神经网络构建,以实现模型的创新和优化。但是当需要进行性能加速时,我们需要对神经网络部分或整体进行加速。MindSpore提供了两种切换为图模式的方式,分别是基于装饰器的开启方式以及基于全局context的开启方式。

基于装饰器的开启方式

MindSpore提供了jit装饰器,可以通过修饰Python函数或者Python类的成员函数使其被编译成计算图,通过图优化等技术提高运行速度。此时我们可以简单的对想要进行性能优化的模块进行图编译加速,而模型其他部分,仍旧使用解释执行方式,不丢失动态图的灵活性。无论全局context是设置成静态图模式还是动态图模式,被jit修饰的部分始终会以静态图模式进行运行。

在需要对Tensor的某些运算进行编译加速时,可以在其定义的函数上使用jit修饰器,在调用该函数时,该模块自动被编译为静态图。需要注意的是,jit装饰器只能用来修饰函数,无法对类进行修饰。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)
[[-0.12126954  0.06986676 -0.2230821  -0.07087803 -0.01003947  0.010633920.10143848 -0.0200909  -0.09724037  0.0114444 ][-0.12126954  0.06986676 -0.2230821  -0.07087803 -0.01003947  0.010633920.10143848 -0.0200909  -0.09724037  0.0114444 ][-0.12126954  0.06986676 -0.2230821  -0.07087803 -0.01003947  0.010633920.10143848 -0.0200909  -0.09724037  0.0114444 ][-0.12126954  0.06986676 -0.2230821  -0.07087803 -0.01003947  0.010633920.10143848 -0.0200909  -0.09724037  0.0114444 ]...[-0.12126954  0.06986676 -0.2230821  -0.07087803 -0.01003947  0.010633920.10143848 -0.0200909  -0.09724037  0.0114444 ][-0.12126954  0.06986676 -0.2230821  -0.07087803 -0.01003947  0.010633920.10143848 -0.0200909  -0.09724037  0.0114444 ][-0.12126954  0.06986676 -0.2230821  -0.07087803 -0.01003947  0.010633920.10143848 -0.0200909  -0.09724037  0.0114444 ][-0.12126954  0.06986676 -0.2230821  -0.07087803 -0.01003947  0.010633920.10143848 -0.0200909  -0.09724037  0.0114444 ]]

除使用修饰器外,也可使用函数变换方式调用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)
[[ 0.11027216 -0.09628229  0.0457969   0.05396656 -0.06958974  0.0428197-0.1572069  -0.14151613 -0.04531277  0.07521383][ 0.11027216 -0.09628229  0.0457969   0.05396656 -0.06958974  0.0428197-0.1572069  -0.14151613 -0.04531277  0.07521383][ 0.11027216 -0.09628229  0.0457969   0.05396656 -0.06958974  0.0428197-0.1572069  -0.14151613 -0.04531277  0.07521383][ 0.11027216 -0.09628229  0.0457969   0.05396656 -0.06958974  0.0428197-0.1572069  -0.14151613 -0.04531277  0.07521383]...[ 0.11027216 -0.09628229  0.0457969   0.05396656 -0.06958974  0.0428197-0.1572069  -0.14151613 -0.04531277  0.07521383][ 0.11027216 -0.09628229  0.0457969   0.05396656 -0.06958974  0.0428197-0.1572069  -0.14151613 -0.04531277  0.07521383][ 0.11027216 -0.09628229  0.0457969   0.05396656 -0.06958974  0.0428197-0.1572069  -0.14151613 -0.04531277  0.07521383][ 0.11027216 -0.09628229  0.0457969   0.05396656 -0.06958974  0.0428197-0.1572069  -0.14151613 -0.04531277  0.07521383]]

当我们需要对神经网络的某部分进行加速时,可以直接在construct方法上使用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))@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)
[[ 0.10522258  0.06597593 -0.09440921 -0.04883489  0.07194916  0.1343117-0.06813788  0.01986085  0.0216996  -0.05345828][ 0.10522258  0.06597593 -0.09440921 -0.04883489  0.07194916  0.1343117-0.06813788  0.01986085  0.0216996  -0.05345828][ 0.10522258  0.06597593 -0.09440921 -0.04883489  0.07194916  0.1343117-0.06813788  0.01986085  0.0216996  -0.05345828][ 0.10522258  0.06597593 -0.09440921 -0.04883489  0.07194916  0.1343117-0.06813788  0.01986085  0.0216996  -0.05345828]...[ 0.10522258  0.06597593 -0.09440921 -0.04883489  0.07194916  0.1343117-0.06813788  0.01986085  0.0216996  -0.05345828][ 0.10522258  0.06597593 -0.09440921 -0.04883489  0.07194916  0.1343117-0.06813788  0.01986085  0.0216996  -0.05345828][ 0.10522258  0.06597593 -0.09440921 -0.04883489  0.07194916  0.1343117-0.06813788  0.01986085  0.0216996  -0.05345828][ 0.10522258  0.06597593 -0.09440921 -0.04883489  0.07194916  0.1343117-0.06813788  0.01986085  0.0216996  -0.05345828]]

基于context的开启方式

context模式是一种全局的设置模式。代码示例如下:

import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
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)
print(output)
[[ 0.08501796 -0.04404321 -0.05165704  0.00357929  0.00051521  0.009464560.02748473 -0.19415936 -0.00278988  0.04024826][ 0.08501796 -0.04404321 -0.05165704  0.00357929  0.00051521  0.009464560.02748473 -0.19415936 -0.00278988  0.04024826][ 0.08501796 -0.04404321 -0.05165704  0.00357929  0.00051521  0.009464560.02748473 -0.19415936 -0.00278988  0.04024826][ 0.08501796 -0.04404321 -0.05165704  0.00357929  0.00051521  0.009464560.02748473 -0.19415936 -0.00278988  0.04024826]...[ 0.08501796 -0.04404321 -0.05165704  0.00357929  0.00051521  0.009464560.02748473 -0.19415936 -0.00278988  0.04024826][ 0.08501796 -0.04404321 -0.05165704  0.00357929  0.00051521  0.009464560.02748473 -0.19415936 -0.00278988  0.04024826][ 0.08501796 -0.04404321 -0.05165704  0.00357929  0.00051521  0.009464560.02748473 -0.19415936 -0.00278988  0.04024826][ 0.08501796 -0.04404321 -0.05165704  0.00357929  0.00051521  0.009464560.02748473 -0.19415936 -0.00278988  0.04024826]]

静态图的语法约束

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

JitConfig配置选项

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

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

静态图高级编程技巧

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

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

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

相关文章

Open3D 删除点云中重叠的点(方法一)

目录 一、概述 二、代码实现 三、实现效果 3.1原始点云 3.2处理后的点云 3.3计算结果 一、概述 在点云处理中,重叠点(即重复点)可能会对数据分析和处理的结果产生负面影响。因此,删除重叠点是点云预处理中常见且重要的步骤。…

C++标准库常用的遍历和查找算法

文章目录 1.常用遍历算法1.for_each2.transform 2.常用查找算法1. find2. find_if3. adjacent_find4. binary_search5. count6. count_if 1.常用遍历算法 1.for_each C的std::for_each算法是标准库中的一个迭代器算法,它对容器或范围内的每个元素执行指定的操作。…

缺失行处理(R和python)

R(complete.cases) rm(listls()) # 创建一个包含缺失值的数据框 # df <- data.frame( # x c(1, 2, NA, 4), # y c(NA, 2, 3, 4), # z c(1, NA, 3, 3) # ) # # # 使用complete.cases函数筛选包含缺失值的数据行 # missing_rows <- !complete.cases(df) # # # …

Java的垃圾回收机制解说

Java 内存运行时区域中的程序计数器、虚拟机栈、本地方法栈随线程而生灭&#xff1b;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的&#xff08;尽管在运行期会由 JIT 编译器进行一些优化&…

STM32+ESP8266连接阿里云

完整工程文件&#xff08;百度网盘免费下载&#xff0c;提取码&#xff1a;0625&#xff09;在文章末尾&#xff0c;需要请移步至文章末尾。 目录 宏定义配置 串口通信配置 消息解析及数据发送 ESP8266初始化 注意事项 完整工程文件 经过基础教程使用AT指令连接阿里云后…

使用vue3-treeselect问题

1.当vue3-treeselect是单选时&#xff0c;使用watch监听绑定value&#xff0c;无法监听到值清空 对照后将:value改为v-model&#xff0c;如图 2.使用vue3-treeselect全部清空按钮如何置空select的值&#xff0c;使用watch监听 多选&#xff1a;pageInfo.officeName(val) {// …

华为OD面试 - 简易Linux路径解析(Java JS Python C C++)

题目描述 某简易的 linux 目录系统 cd 命令(change directory)功能如下: cd:进入 home 目录 /home/usercd -:进入上一次停留的目录(连续两个以上 cd - 会在两个目录之间来回跳转,而不是回到更早之前的目录)cd <绝对路径>:以 / 开头的为绝对路径cd <相对路径…

【手写数据库内核组件】0201 哈希表hashtable的实战演练,多种非加密算法,hash桶的冲突处理,查找插入删除操作的代码实现

hash表原理与实战 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 文章目录 hash表…

【TB作品】51单片机 Proteus仿真 MAX7219点阵驱动数码管驱动

1、8乘8点阵模块&#xff08;爱心&#xff09; 数码管测试程序与仿真 实验报告: MAX7219 数码管驱动测试 一、实验目的 通过对 MAX7219 芯片的编程与控制&#xff0c;了解如何使用单片机驱动数码管显示数字&#xff0c;并掌握 SPI 通信协议的基本应用。 二、实验器材 51…

多项式求和之九(给定程序中函数 fun 的功能是:求出以下分数序列的前 n 项之和,并通过函数值返回 main 函数。)

代码 #include <stdio.h> /********found********/ double fun(int n){double a2,b1,c,s0;while(n>0){n--; /********found********/ssa/b;ca;aab;bc;}return s; } void main(){int n;scanf("%d",&n);printf("%lf\n",fun(n)); }友情提示 1、…

期末上分站——计组(5)

简答题11-21 11、为了提高计算机系统的输入/输出能力&#xff0c;可以在总线的设计与实现中采用哪些方案&#xff1f; 答&#xff1a;1. 提高总线时钟频率 2. 增加数据总线的位数 3. 采用成组数据传送&#xff08;BURST传送&#xff09;方式 4. 采用多总线结构 5. 优化总线传输…

微深节能 煤码头自动化翻堆及取料集控系统 格雷母线

微深节能格雷母线高精度位移测量系统是一种先进的工业自动化位置检测解决方案&#xff0c;它被广泛应用于煤码头自动化翻堆及取料集控系统中&#xff0c;以实现对斗轮堆取料机等大型机械设备的精准定位和自动化控制。 系统原理简述&#xff1a; 格雷母线系统的工作原理基于电磁…

如何在Spring Boot中实现数据加密

如何在Spring Boot中实现数据加密 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 一、数据加密的重要性与应用场景 在当今信息安全日益受到重视的背景下&…

软件工程需求之:业务需求与用户需求

在软件开发项目中&#xff0c;"业务需求"和"用户需求"是两个核心概念&#xff0c;它们分别从不同的角度描述了软件应该具备的功能和特性。理解这两个概念的区别对于成功地规划和开发软件至关重要。 业务需求 业务需求主要关注于软件项目如何帮助实现企业…

EOF 为 (End Of File) 的缩写 , 值通常为 -1

EOF是一个计算机术语&#xff0c;为 End Of File 的缩写 EOF 的值通常为 -1 EOF 的值通常为 -1&#xff0c;但它依系统有所不同。巨集 EOF会在编译原始码前展开实际值给预处理器。 与 feof 与 feof C语言中&#xff0c;当把数据以二进制形式存放到文件中时&#xff0c;就会有…

[AIGC] ClickHouse的表引擎介绍

ClickHouse是一种高性能的列式数据库管理系统&#xff0c;支持各种不同的表引擎。表引擎是数据库系统中的核心组件&#xff0c;它定义了数据的存储方式和访问方式。本文将介绍ClickHouse中常见的表引擎及其特点。 文章目录 一、MergeTree引擎二、ReplacingMergeTree引擎三、Sum…

阿里云ecs服务器,nginx多域名多项目部署教程,含本地部署教程

nginx多域名部署项目 本地部署线上部署 一、本地部署 第一步&#xff1a; winr 输入drivers 打开hosts文件&#xff0c;编辑 加行 127.0.0.1 自定义域名 … 第二步&#xff1a; 下载 nginx 安装好以后 打开ngin安装目录&#xff0c;选择nginx.conf 打开 #user Administ…

前端面试题10(js多位数组变一维数组)

1. 使用concat()和递归 function flatten(arr) {return arr.reduce((acc, val) > Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val), []); }let multiDimArray [[1, 2, [3]], 4]; let flatArray flatten(multiDimArray); console.log(flatArray); // 输…

C++ STL IO流介绍

目录 一:IO流的继承关系: 二:输入输出功能 1. 基本用法 2. 格式化输入 3.非格式化输入 4. 格式化输出 三:流 1. 字符流 2. 向字符流中写入数据 3. 从字符流中读出数据 4. 清空字符流 5.完整的例子 四:文件流 一:IO流的继承关系: 类含义basic_streambuf 读取…

Python的`queue`模块

队列&#xff08;Queue&#xff09; 在Python的queue模块中&#xff0c;Queue类是一个线程安全的队列实现&#xff0c;用于在多线程编程中安全地交换信息。它遵循先入先出&#xff08;FIFO&#xff09;的原则。Queue类提供了几种主要的方法&#xff1a; put(item): 将一个项目…