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

今天是参加昇思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)
  • JitConfig配置选项

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

4.小结

本节学习的内容就是使用静态图加速相关的内容,属于程序优化的范畴。这里主要需要掌握动态图和静态图的概念,静态图加速的基本原理、应用场景以及各类开启和配置加速图的相关参数。

至此,入门课程已经请全部完成,接下来就是实战应用。

以上是第9天的学习内容,附上今日打卡记录:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值