今天是参加昇思25天学习打卡营的第9天,今天打卡的课程是“使用静态图加速”,这里做一个简单的分享。
1.简介
今天学习的内容是了解动态图模式和静态图模式的区别和应用场景。
1.动态图模式
2.静态图模型
2.动态图模式
动态图模式是mindspore的默认运行模式,特点是计算图的构建和运行同时生成。好处是因为可以实时查看计算结果,可以用于模型的调试和修改。
默认开启方式代码如下:
import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
ms.set_context(mode=ms.PYNATIVE_MODE) # 使用set_context进行动态图模式的配置
其它代码与之前相同。
3.静态图模式
静态图模式的特点是构建和计算分析,在MindSpore中,静态图模式又称为Graph模式(前面讲云端训练、本地运行支持Graph模式讲的就是这个静态图模式)。静态图模式将模型的编译优化和运行分离(类似C++),以达到模型优化和性能提升的效果。
3.1静态图模式的使用场景
MindSpore编译器重点面向Tensor数据的计算以及其微分处理。因此使用MindSpore API以及基于Tensor对象的操作更适合使用静态图编译优化。其他操作虽然可以部分入图编译,但实际优化作用有限。另外,静态图模式先编译后执行的模式导致其存在编译耗时。因此,如果函数无需反复执行,那么使用静态图加速也可能没有价值。
3.2静态图模式的开启方式
静态图开启的方法有两种:一种是基于全局上下文的开启方法,二是基于装饰器的开启方法
3.2.1 全局开启(基于context设置)
import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
ms.set_context(mode=ms.GRAPH_MODE) # 使用set_context进行运行静态图模式的配置
3.2.2基于装饰器的开启方法
- 基本开启方法
import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
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
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)
- 基于函数变换方式调用
#前面的代码相同
#...
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, Tensor
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)
)
@ms.jit # 使用ms.jit装饰器,使被装饰的函数以静态图模式运行
def construct(self, x):
x = self.flatten(x)
logits = self.dense_relu_sequential(x)
return logits
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
model = Network()
output = model(input)
print(output)
- jit_level: 用于控制优化等级。
- exec_mode: 用于控制模型执行方式。
- jit_syntax_level: 设置静态图语法支持级别
4.小结
本节学习的内容就是使用静态图加速相关的内容,属于程序优化的范畴。这里主要需要掌握动态图和静态图的概念,静态图加速的基本原理、应用场景以及各类开启和配置加速图的相关参数。
至此,入门课程已经请全部完成,接下来就是实战应用。
以上是第9天的学习内容,附上今日打卡记录: