打卡
目录
打卡
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 logits
model = 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 logits
model = 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, 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)
运行输出
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)
)
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))
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, 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)
运行输出
静态图的语法约束
在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: 设置静态图语法支持级别,详细介绍请见静态图语法支持。
使用静态图高级编程技巧可以有效地提高编译效率以及执行效率,并可以使程序运行的更加稳定。详情可参考静态图高级编程技巧。