静态图加速
动态图模式
- 首先说动态图,动态图是指计算图的构建与计算同时发生,所有节点都可以方便存取,但是同时难以对整个计算图优化,在MIndspore中动态图模式又称为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 logits
model = Network()
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
output = model(input)
print(output)
静态图模式
-
通过修改context就可以方便的转换为静态图模式了
-
静态图模式又被称为Graph模式,可以进行全局优化,应用于稳定的网络和有高性能需求的场景
-
注意在MIndspore中,静态图模式主要面向Tensor对象的优化,在其他对象的应用中,Graph模式的效果有限
基于装饰器的开启方式
- MIndspore提供了jit装饰器,使用jit装饰器即可完成静态图模式的转换,这样我们也可以在想要使用静态图模式的块中使用装饰器来灵活运用静态图模式优化,在其它模型部分依然可以使用动态图模式。
@ms.jit # 使用ms.jit装饰器,使被装饰的函数以静态图模式运行
基于context全局的开启方式
- 上述提到的context修改就是全局模式修改,比起装饰器模式更加直接也更加不灵活,总的来说就是提供了部分转换和全局转换的选择。
ms.set_context(mode=ms.GRAPH_MODE) # 使用set_context进行运行静态图模式的配置