昇思25天学习打卡营第10天|使用静态图加速

运行模式

AI编译框架分为静态图模式和动态图模式。MindSpore默认动态图,支持手动切换。

动态图模式

这种模式下每一步执行时即时构建计算图,操作和数据流在执行 过程中即时定义。在定义一个Tensor时,这个值就已经被计算和确定了。因此所有中间结果的值都能实时得到,方便进行模型调试。

MindSpore中,动态图也叫PyNative模式。在脚本开发和网络流程调试过程中,推荐使用动态图模式。

ms.set_context(mode=ms.PYNATIVE_MODE)  

静态图模式

这种模式下,图的构建和计算是分开的。在执行前会先构建一个计算图(Computational Graph),所有的操作和数据流在图中定义好,然后一次性将整个图编译和优化。

MindSpore中,静态图称为Graph模式。基于图计算、计算图整图下沉等技术,编译器可以针对图进行全局优化以获得比较好的性能。

ms.set_context(mode=ms.GRAPH_MODE)

静态图使用场景

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

静态图开启方式

当需要性能加速时,会对神经网络的部分或整体进行加速。MindSpore提供了两种方式。

基于装饰器

MindSpore提供了jit装饰器,可以通过修饰python函数或python类的成员函数使其被编译成计算图,再通过图优化等技术提高运行速度。可以单独对想进行性能优化的模块进行图编译加速(使用jit修饰),其他模块依然使用解释的方式执行,而不会丢失动态图的灵活性。

调用jit函数的模块会自动被编译成静态图,可用来修饰函数,不能修饰类。

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)

或者也可以在调用时使用jit

# 函数定义保持不变,input保持不变

def run(x):
    model = Network()
    return model(x)

# 通过调用jit将函数转换为以静态图方式执行
run_with_jit = ms.jit(run)  
output = run(input)

可在construct方法上使用jit修饰器。在实例化对象时,这个模块就自动会被编译成静态图。

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
基于context

最开始给的示例就是set_context, 这是一种全局的设置方式。

ms.set_context(mode=ms.GRAPH_MODE)  # 使用set_context进行运行静态图模式的配置

静态图的语法约束

该模式下,python代码不是由编译器执行,而是将代码编译成静态计算图,再执行静态计算图。由此有些python语法可能不会被全部支持。

JitConfig配置选项

图模式下,通过某些参数可以自定义编译流程。

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

总结

本章介绍了静态图加速的相关操作。

打卡凭证

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值