网站首页图片素材长图大全,做医疗网站需要,织梦cms 5.6网站地图,机械网站建设开发文章目录 今日所学#xff1a;一、背景介绍1. 动态图模式2. 静态图模式 三、静态图模式的使用场景四、静态图模式开启方式1. 基于装饰器的开启方式2. 基于context的开启方式 总结#xff1a; 今日所学#xff1a;
在上一集中#xff0c;我学习了保存与加载的方法#xff… 文章目录 今日所学一、背景介绍1. 动态图模式2. 静态图模式 三、静态图模式的使用场景四、静态图模式开启方式1. 基于装饰器的开启方式2. 基于context的开启方式 总结 今日所学
在上一集中我学习了保存与加载的方法在接下来的这一期将会继续的学习有关AI编译框架的两种运行模式。下面是我今天通过本节学习内容所学到的相关知识与心得。 一、背景介绍
首先学习了AI编译框架包括动态图模式和静态图模式两种运行方式。在默认情况下MindSpore采用动态图模式运行但用户也可以手动切换到静态图模式。下面就详细介绍这两种模式
1. 动态图模式
我了解到了动态图模式是一种即时执行模式也就是说在构建计算图的同时进行计算Define by Run这种模式非常符合Python的解释执行特质。当我们在计算图中定义一个Tensor时它的值会立即被计算和确定。这种模式在模型调试时非常便利因为我们可以实时得到中间结果的值。但是需要注意的是所有的节点都需要被保存这可能会导致对整个计算图进行优化的难度增大。
在MindSpore框架中动态图模式被称为PyNative模式。由于动态图的解释执行特性我们建议在进行脚本开发和网络流程调试的过程中使用动态图模式。如果需要手动设定框架使用PyNative模式可以通过以下代码进行设置
import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
ms.set_context(modems.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)可以得到如下结果 2. 静态图模式
我还学习了静态图模式的原理和应用。静态图模式的特点是将计算图的构建和计算过程分离在MindSpore中这种模式被称为Graph模式。在Graph模式下可以利用图优化和计算图整图下沉等技术进行全局优化从而获得优质的性能表现特别适合对网络结构较固定且需要高性能的场景。如果需要手动将框架设置为静态图模式我学习了相应的网络构建代码。这些都将对我使用MindSpore深度学习框架进行模型训练和推理带来极大的便利。代码如下
import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
ms.set_context(modems.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)可以得到如下结果 三、静态图模式的使用场景
我学习到了MindSpore编译器主要针对Tensor数据和其微分处理。因此使用MindSpore API和基于Tensor对象的操作更适合用静态图模式进行编译优化。所以一些非Tensor的操作虽然也可以编译但优化的效果有限。另外由于静态图模式采用的是先编译后执行的方式这就会导致有编译的时间消耗。因此如果函数无需执行多次使用静态图模式进行加速可能就变得不太有价值了。
使用静态图来进行网络编译示例可以见《昇思25天学习打卡营第6天|网络构建》
四、静态图模式开启方式
进一步学习了如何选择并切换不同的模式来优化神经网络的构建和性能。动态图模式或者称作PyNative模式由于其灵活性通常被用来进行自由的神经网络构建以实现模型的创新和优化。但是当我需要对神经网络进行性能加速时我了解到可以转向使用静态图或称作Graph模式。MindSpore为此提供了两种切换方式包括基于装饰器的开启方式和基于全局context的开启方式。这些知识对于优化我的神经网络模型构建和提升性能都非常有用。
1. 基于装饰器的开启方式
MindSpore提供了jit装饰器它允许我们将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)可以得到如下结果 并且了解到除使用修饰器外也可使用函数变换方式调用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)可以得到如下结果 如果我们需要对神经网络的某部分进行加速时可以直接在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)可以得到如下结果 2. 基于context的开启方式
context模式是一种全局的设置模式。代码示例如下
import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
ms.set_context(modems.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)可以得到如下结果 并且还进一步的了解了静态图的语法约束MindSpore的静态图编译器维护了Python常用语法子集以支持神经网络的构建及训练可参考静态图语法支持以及还学习了JitConfig配置选项与静态图高级编程技巧 总结
今日学习的重点是使用静态图加速并理解和区分动态图模式和静态图模式的异同并了解各自的使用场景。学习了如何在MindSpore框架中切换这两种模式包括基于装饰器和基于context的切换方式。这些知识将有助于我们在实际的模型训练和推理中选择更适合的模式提升工作效率和模型性能。