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

文章目录

  • 今日所学:
  • 一、背景介绍
    • 1. 动态图模式
    • 2. 静态图模式
  • 三、静态图模式的使用场景
  • 四、静态图模式开启方式
    • 1. 基于装饰器的开启方式
    • 2. 基于context的开启方式
  • 总结:


今日所学:

在上一集中,我学习了保存与加载的方法,在接下来的这一期将会继续的学习有关AI编译框架的两种运行模式。下面是我今天通过本节学习内容所学到的相关知识与心得。


一、背景介绍

首先学习了AI编译框架包括动态图模式和静态图模式两种运行方式。在默认情况下,MindSpore采用动态图模式运行,但用户也可以手动切换到静态图模式。下面就详细介绍这两种模式:

1. 动态图模式

我了解到了动态图模式是一种即时执行模式,也就是说在构建计算图的同时进行计算(Define by Run),这种模式非常符合Python的解释执行特质。当我们在计算图中定义一个Tensor时,它的值会立即被计算和确定。这种模式在模型调试时非常便利,因为我们可以实时得到中间结果的值。但是,需要注意的是,所有的节点都需要被保存,这可能会导致对整个计算图进行优化的难度增大。

在MindSpore框架中,动态图模式被称为PyNative模式。由于动态图的解释执行特性,我们建议在进行脚本开发和网络流程调试的过程中使用动态图模式。如果需要手动设定框架使用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 logitsmodel = Network()
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
output = model(input)
print(output)

可以得到如下结果:

在这里插入图片描述

2. 静态图模式

我还学习了静态图模式的原理和应用。静态图模式的特点是将计算图的构建和计算过程分离,在MindSpore中,这种模式被称为Graph模式。在Graph模式下,可以利用图优化和计算图整图下沉等技术进行全局优化,从而获得优质的性能表现,特别适合对网络结构较固定且需要高性能的场景。如果需要手动将框架设置为静态图模式,我学习了相应的网络构建代码。这些都将对我使用MindSpore深度学习框架进行模型训练和推理带来极大的便利。代码如下:

import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
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 logitsmodel = Network()
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
output = model(input)
print(output)

可以得到如下结果:

在这里插入图片描述

三、静态图模式的使用场景

我学习到了MindSpore编译器主要针对Tensor数据和其微分处理。因此,使用MindSpore API和基于Tensor对象的操作更适合用静态图模式进行编译优化。所以一些非Tensor的操作,虽然也可以编译,但优化的效果有限。另外,由于静态图模式采用的是先编译后执行的方式,这就会导致有编译的时间消耗。因此,如果函数无需执行多次,使用静态图模式进行加速可能就变得不太有价值了。

使用静态图来进行网络编译示例可以见:《昇思25天学习打卡营第6天|网络构建》

四、静态图模式开启方式

进一步学习了如何选择并切换不同的模式来优化神经网络的构建和性能。动态图模式或者称作PyNative模式,由于其灵活性,通常被用来进行自由的神经网络构建,以实现模型的创新和优化。但是,当我需要对神经网络进行性能加速时,我了解到可以转向使用静态图或称作Graph模式。MindSpore为此提供了两种切换方式,包括基于装饰器的开启方式和基于全局context的开启方式。这些知识对于优化我的神经网络模型构建和提升性能都非常有用。

1. 基于装饰器的开启方式

MindSpore提供了jit装饰器,它允许我们将Python函数或类的成员函数编译成计算图,进而利用图优化等技术提升运行效率。这样我们就可以为需要加速的模块简单地应用图编译,同时保留模型其他部分的动态图灵活性。值得注意的是,无论全局context设置为何种模式,被jit装饰的部分总是以静态图模式运行。

当需要对Tensor的特定运算进行编译加速时,我们可以在函数定义时使用jit装饰器。调用这个函数时,该模块会自动被编译为静态图。但请注意,jit装饰器只能用于修饰函数,不能用于修饰类。下面是使用jit的示例代码:

import numpy as np
import mindspore as ms
from mindspore import nn, Tensorclass 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 logitsinput = 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, Tensorclass 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 logitsinput = 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)

可以得到如下结果:

在这里插入图片描述

如果我们需要对神经网络的某部分进行加速时,可以直接在construct方法上使用jit修饰器,在调用实例化对象时,该模块自动被编译为静态图,代码如下:

import numpy as np
import mindspore as ms
from mindspore import nn, Tensorclass 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 logitsinput = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
model = Network()
output = model(input)
print(output)

可以得到如下结果:

在这里插入图片描述

2. 基于context的开启方式

context模式是一种全局的设置模式。代码示例如下:

import numpy as np
import mindspore as ms
from mindspore import nn, Tensor
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 logitsmodel = Network()
input = Tensor(np.ones([64, 1, 28, 28]).astype(np.float32))
output = model(input)
print(output)

可以得到如下结果:

在这里插入图片描述
并且还进一步的了解了静态图的语法约束:MindSpore的静态图编译器维护了Python常用语法子集,以支持神经网络的构建及训练可参考静态图语法支持,以及还学习了JitConfig配置选项与静态图高级编程技巧

在这里插入图片描述

总结:

今日学习的重点是使用静态图加速,并理解和区分动态图模式和静态图模式的异同,并了解各自的使用场景。学习了如何在MindSpore框架中切换这两种模式,包括基于装饰器和基于context的切换方式。这些知识将有助于我们在实际的模型训练和推理中选择更适合的模式,提升工作效率和模型性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/41383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第6天|简单的深度学习模型实战 - 函数式自动微分

自动微分(Automatic Differentiation)是什么?微分是函数在某一处的导数值,自动微分就是使用计算机程序自动求解函数在某一处的导数值。自动微分可用于计算神经网络反向传播的梯度大小,是机器学习训练中不可或缺的一步。 这些公式难免让人头大…

论文浅尝 | 从最少到最多的提示可在大型语言模型中实现复杂的推理

笔记整理:王泽元,浙江大学博士 链接:https://openreview.net/forum?idWZH7099tgfM 1. 动机 尽管深度学习已经取得了巨大的成功,但它与人类智慧仍然存在一些明显差距。这些差距包括以下几个方面:1)学习新任…

SQL Server查看所有的数据库、所有的表 以及表的描述

文章目录 -- 查看所有的数据库 select name from sys.databases order by name;-- 查看所有的表 use [你的数据库名]; -- select * from sys.objects order by type; -- select * from sys.objects where type u; -- select object_id,name from sys.objects where type u; s…

【代码大全2 选读】看看骨灰级高手消灭 if-else 逻辑的瑞士军刀长啥样

文章目录 1 【写在前面】2 【心法】这把瑞士军刀长啥样3 【示例1】确定某个月份的天数(Days-in-Month Example)4 【示例2】确定保险费率(Insurance Rates Example)5 【示例3】灵活的消息格式(Flexible-Message-Format …

NFC风险高?不要被误导

在我们日常生活中,经常会听到NFC这个词,尤其是在智能手机、银行卡和公共交通卡等场景中。NFC,全称近场通信(Near Field Communication),就像是一位随时待命的便捷小助手,但它是否安全可靠呢&…

14-27 剑和诗人 1 – 请称呼我AI工程师

​​​​​ 仅初创企业的收入就超过 10 亿美元,随着 Gen AI 的早期成功迹象,每家有远见的科技公司都在竞相将 Gen AI 功能融入其产品、客户支持机器人和营销中。作为一种技术,AI 正处于与 90 年代末互联网相似的阶段,甚至完全相同…

【前端】上传和下载zip文件,有进度条(el-progess)

文章目录 上传下载进度条 场景:要上传一个zip,调用接口,然后下载一个zip。调用接口的接口响应要显示在进度条中。 上传 上传用的是input原生控件,在页面中隐藏。accept"application/zip"限制只能上传zip。 点击button…

【unity实战】Unity中使用A*寻路+有限状态机制作一个俯视角敌人AI

最终效果 文章目录 最终效果前言A*寻路插件介绍下载导入AI插件生成寻路网格节点的类型障碍物寻路测试A*只打印报错信息 代码控制寻路动画配置敌人状态机各种状态脚本效果完结 前言 前面做过有限状态机制作一个敌人AI:【unity实战】在Unity中使用有限状态机制作一个…

vxe-table合并行数据;element-plus的el-table动态合并行

文章目录 一、vxe-table合并行数据1.代码 二、使用element-plus的el-table动态合并行2.代码 注意&#xff1a;const fields 是要合并的字段 一、vxe-table合并行数据 1.代码 <vxe-tableborderresizableheight"500":scroll-y"{enabled: false}":span-m…

信创-办公软件应用工程师认证

随着国家对信息技术自主创新的战略重视程度不断提升&#xff0c;信创产业迎来前所未有的发展机遇。未来几年内&#xff0c;信创产业将呈现市场规模扩大、技术创新加速、产业链完善和国产化替代加速的趋势。信创人才培养对于推动产业发展具有重要意义。应加强高校教育、建立人才…

【信息学奥赛】CSP-J/S初赛07 排序算法及其他算法在初赛中的考察

本专栏&#x1f449;CSP-J/S初赛内容主要讲解信息学奥赛的初赛内容&#xff0c;包含计算机基础、初赛常考的C程序和算法以及数据结构&#xff0c;并收集了近年真题以作参考。 如果你想参加信息学奥赛&#xff0c;但之前没有太多C基础&#xff0c;请点击&#x1f449;专栏&#…

全面掌握如何应对DDoS攻击,一文带你轻松保护网站安全

一、引言 在当今互联网时代&#xff0c;DDoS&#xff08;Distributed Denial of Service&#xff0c;分布式拒绝服务&#xff09;攻击已经成为威胁网站安全的主要手段之一。这种攻击通过大量恶意流量占用服务器资源&#xff0c;导致网站无法正常访问。如何有效应对DDoS攻击&am…

C++|海康摄像头实时预览时设置音量大小

使用海康API设置音量的函数是&#xff1a;NET_DVR_OpenSound。 在实际代码中我遇到了以下问题&#xff1a; 1&#xff1a;调用NET_DVR_OpenSound接口一直返回失败&#xff0c;错误是调用顺序出错。 2&#xff1a;音量设置不成功。 对于以上两种问题&#xff0c;我相信很多人…

实现Java应用的数据加密与解密技术

实现Java应用的数据加密与解密技术 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 数据加密与解密的重要性 数据安全是当今互联网应用开发中的重要问题之…

FineBI在线学习资源-数据处理

FineBI在线学习资源汇总&#xff1a; 学习资源 视频课程 帮助文档 问答 数据处理学习文档&#xff1a; 相关资料&#xff1a; 故事背景概述-https://help.fanruan.com/finebi6.0/doc-view-1789.html 基础表处理-https://help.fanruan.com/finebi6.0/doc-view-1791.html …

六西格玛绿带培训如何告别“走过场”?落地生根

近年来&#xff0c;六西格玛绿带培训已经成为了众多企业提升管理水平和员工技能的重要途径。然而&#xff0c;不少企业在实施六西格玛绿带培训时&#xff0c;往往陷入形式主义的泥潭&#xff0c;导致培训效果大打折扣。那么&#xff0c;如何避免六西格玛绿带培训变成“走过场”…

【重磅】万能模型-直接能换迪丽热巴的模型

万能模型&#xff0c;顾名思义&#xff0c;不用重新训练src&#xff0c;直接可以用的模型&#xff0c;适应大部分原视频脸 模型用法和正常模型一样&#xff0c;但可以跳过训练阶段&#xff01;直接到合成阶段使用该模型 本模型没有做Xseg&#xff0c;对遮挡过多的画面不会自动适…

LiteFlow介绍、原理解析以及应用场景

LiteFlow介绍 LiteFlow是一个由Baidu开源的轻量级、快速、稳定且可编排的组件式规则引擎框架。它专注于逻辑驱动流程编排&#xff0c;通过组件化方式快速构建和执行业务流程&#xff0c;有效解耦复杂业务逻辑。LiteFlow的设计基于工作台模式&#xff0c;其中每个业务组件相当于…

【C++】 解决 C++ 语言报错:Double Free or Corruption

文章目录 引言 双重释放或内存破坏&#xff08;Double Free or Corruption&#xff09;是 C 编程中常见且严重的内存管理问题。当程序尝试多次释放同一块内存或对已经释放的内存进行操作时&#xff0c;就会导致双重释放或内存破坏错误。这种错误不仅会导致程序崩溃&#xff0c…

谷粒商城学习-07-虚拟机网络设置

文章目录 一&#xff0c;找到配置文件Vagrantfile二&#xff0c;查询虚拟机网卡地址1&#xff0c;查看虚拟机网络配置2&#xff0c;查看宿主机网络配置 三&#xff0c;修改配置文件下的IP配置四&#xff0c;重新启动虚拟机即可生效五&#xff0c;Vagrantfile 的作用1&#xff0…