昇思MindSpore学习入门-静态图高级编程技巧二

如何优化执行性能

使用jit_class

使用场景:使用@jit_class装饰器修饰自定义类,提高执行性能。jit_class应用于静态图模式,在动态图模式下,@jit_class会被忽略,不影响动态图模式的执行逻辑。

jit_class的介绍

用户在网络脚本中定义一个类时,可以写成继承于Cell的类、自定义类、@jit_class修饰的类,它们的用法和区别如下:

  • 继承于Cell的类

Cell是MindSpore中神经网络的基本构成单元,模型或者神经网络层应当继承该类。静态图模式下,使用Cell类并且在construct函数中编写执行代码,此时construct函数的代码会被编译成静态计算图。

  • 自定义类

定义自定义类后,可以对类进行实例化、调用类对象的属性和方法,请参考自定义类的使用。相比于Cell的类定义,自定义类更贴近用户调用Python类的使用习惯。自定义类在静态图模式下的实现方式与Cell不同,例如,调用自定义类对象的函数方法时,其函数方法中的代码不会被编译成静态计算图,而是通过Python解释器进行解释执行。

  • @jit_class修饰的类

为了兼顾用户的Python使用习惯和静态图编译带来的性能优势,提供了@jit_class装饰器。给自定义类修饰@jit_class装饰器后,该类的函数代码会被编译成静态计算图,基于图优化、静态图整图下沉等技术,编译器可以针对计算图进行全局的优化,从而获得较好的执行性能。

在静态图模式下,通过使用@jit_class修饰自定义类,用户可以创建、调用该类的实例,并且可以获取其属性和方法。

jit_class装饰器的使用

jit_class装饰器仅支持修饰自定义类,不支持修饰继承于Cell的类。

jit_class支持自定义类嵌套使用、自定义类与Cell嵌套使用的场景。需要注意的是,类继承时,如果父类使用了jit_class,子类也会具有jit_class的能力。

获取类的属性和方法

支持通过类名或类实例调用属性和方法。

创建类的实例

对于将会被编译成静态计算图的函数,如Cell的construct函数、@jit修饰的函数或前两者调用的子函数,如果需要在函数内创建@jit_class所修饰的类的实例,参数要求为常量。

调用类的实例

调用@jit_class所修饰的类的实例时,将会调用该类的__call__函数方法。

使用select算子

使用场景:Select算子来替代if控制流语句,减少静态图子图生成,提高执行性能(也可以提高编译性能)。

编写网络时,会经常使用到if语句,如果if语句的条件是变量条件,每个if语句都会产生额外的子图。在静态图模式下,子图数量越多,编译耗时越久,因此部分场景可以通过Select算子等价替换if语句来优化编译性能。

需要注意的是,使用Select算子替换if语句会影响网络的运行性能。一方面,Select算子会同时执行true分支和false分支,而if语句只执行其一个分支,因此使用if运行耗时相比使用Select算子耗时减少;另一方面,Select算子性能优于if语句产生的控制流算子,使用if运行耗时相比使用Select算子运行耗时增加。综合上述两种因素,最终运行性能变化情况需要结合实际情况判断。一般来讲,当分支中算子数量较少,建议使用Select算子;当分支中算子数量较多,建议使用if语句。

一个使用Select算子替代if语句来优化编译性能的代码样例如下:

使用Vmap进行批处理

使用场景:在处理无依赖关系的批量数据且相关的算子支持Vmap功能时,可以使用Vmap替代for循环处理批量数据来优化执行性能(也可以提高编译性能)。

MindSpore已支持Vmap特性,Vmap的详细介绍可参考自动向量化Vmap。

一个使用Vmap替换for循环处理批量数据来优化编译性能的代码样例如下:

代码的运行结果如下(实际耗时与硬件环境有关,以下数据仅供参考):

依赖控制保证执行序

如果函数的运行结果依赖或影响外部状态,我们认为该函数具有副作用,比如函数会改变外部全局变量、函数的结果依赖全局变量的值。如果算子会改变输入参数的值或者算子的输出依赖全局参数的值,我们认为这是带副作用的算子。

根据内存属性和IO状态,将副作用划分为内存副作用和IO副作用。当前内存副作用主要有Assign、优化器算子等等,IO副作用主要有Print算子。详细可以查看算子定义,内存副作用算子在定义中有side_effect_mem属性,IO副作用算子在定义中有side_effect_io属性。

Depend用于处理依赖项操作。在大多数情况下,如果操作符有IO副作用或内存副作用,则将根据用户的语义执行它们,不需要另外使用Depend算子来保证执行顺序。在某些情况下,如果两个运算符A和B没有顺序依赖关系,并且A必须在B之前执行,我们建议使用Depend指定它们的执行顺序。使用方法如下:

a = A(x)

b = B(y)

在插入Depend算子后,如下:

a = A(x)

y = Depend(y, a)

b = B(y)

值得说明的是,用于浮点数溢出状态检测的一组特殊算子它们存在隐含副作用,但又不属于IO副作用或内存副作用。此外,使用时还有严格的顺序要求,即:在使用NPUClearFloatStatus算子前需要保证NPUAllocFloatStatus已经执行,使用NPUGetFloatStatus算子前需要保证NPUClearFloatStatus已经执行。因为这些算子使用较少,目前的方案是保持它们的定义为无副作用形式,以Depend确保执行顺序。注意:此类浮点数溢出状态检测的算子仅在Ascend平台支持。如下:

优化冗余显存拷贝操作

在函数式编程中,通过参数和返回值之外的渠道和外界存在数据交换的函数,被称为非纯函数,被认为是存在副作用的。在MindSpore框架内部,针对副作用的问题会插入Load算子,该算子属于虚拟算子,不需要在后端执行,不占用显存,仅用于表示需要读取全局变量的值。在图模式下,需要编译完整个图之后才将图中的各个算子下发到后端执行,使用Load算子多次读取全局变量,而不是多次使用真实算子多次保存全局变量的值,这样可以减少显存的消耗。

但是,全局变量的值可能是变化的,如果没有真实算子保存值,某些场景下会存在精度问题。针对这种情况,MindSpore框架内部会插入真实算子,占用一定的显存来保存全局变量的值,从而避免出现精度问题。

我们提供了MS_DEV_SIDE_EFFECT_LOAD_ELIM开关来优化显存占用的程度,即设置export MS_DEV_SIDE_EFFECT_LOAD_ELIM=0/1/2/3。

  • 当将MS_DEV_SIDE_EFFECT_LOAD_ELIM设置为0时,表示对框架内部的Load算子都插入真实算子,即占用显存最多,保证网络精度没有问题。
  • 当将MS_DEV_SIDE_EFFECT_LOAD_ELIM设置为1或者没有设置值时(即默认模式),表示对框架内部的Load算子可能出现精度问题的场景保守地插入真实算子,保证网络精度没有问题。
  • 当将MS_DEV_SIDE_EFFECT_LOAD_ELIM设置为2,在损耗一定编译性能的前提下,尽量少地插入真实算子,优化显存较多,且保证网络精度没有问题。
  • 当将MS_DEV_SIDE_EFFECT_LOAD_ELIM设置为3,不插入真实算子,不保证网络的精度,显存消耗最少。

我们可以通过用例和生成的中间表示(即IR)来进一步理解。

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

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

相关文章

快递代拿系统/快递代领系统

摘 要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括快递代拿系统的网络应用,在外国快递代拿已经是很普遍的方式,不过国内的快递代拿可能还处于起步阶段。快递代拿系统具有代取物品功能。快递代拿系…

武汉工程大学2020GPLT选拔赛

A-L1-1 I LOVE WIT_武汉工程大学2020GPLT选拔赛&#xff08;重现赛&#xff09;&#xff08;重现赛&#xff09;IR101 (nowcoder.com) #include<bits/stdc.h> #define endl \n #define mk make_pair #define int long long #define ll long long using namespace std; t…

androidstudio历史版本下载地址

Android Studio 下载文件归档 | Android Developers

嵌入式学习Day12---C语言提升

目录 一、指针数组 1.1.什么是指针数组 2.2. 格式 2.3.存储 2.4.与字符型二维数组相比 2.5.什么时候使用指针数组 2.6.练习 二、数组指针 2.1.什么是数组指针 2.2.格式 2.3.一维数组 2.3.特点 2.4.什么时候使用 三、指针和数组的关系 3.1.一维数组和指针 …

Linux系统将某ip拉入黑名单

在Linux系统中&#xff0c;如果您想将某个IP地址&#xff08;例如 147.78.103.44&#xff09;拉入黑名单&#xff0c;可以使用 iptables 或 firewalld。下面分别介绍这两种方法。 方法一&#xff1a;使用 iptables 打开终端。 使用以下命令添加规则&#xff1a; sudo iptable…

ps制作镂空文字

1、创建文字。 2&#xff0c;栅格化文字 2、载入选取 3.选择》修改》收缩 4、然后再点击删除键&#xff0c;镂空文字效果就做好了。 同样适用于简单的图片logo

HR模块中 HRP信息类型的相关函数

目录 1、新增:RH_INSERT_INFTY / RH_INSERT_INFTY_EXP2、修改:RH_UPDATE_INFTY / RH_UPDATE_INFTY_EXP3、读取信息类型:RH_READ_INFTY4、定界:RH_CUT_INFTY5、删除:RH_DELETE_INFTY1、新增:RH_INSERT_INFTY / RH_INSERT_INFTY_EXP 说明:这两个函数的用法差不多 代码举例…

AI智能名片小程序在预测性产品管理与营销中的深度应用探索

摘要&#xff1a;本文深入探讨了AI智能名片小程序在预测性产品管理与营销中的广泛应用及其带来的深远影响。通过详细分析该技术在数据收集、市场分析、用户画像构建、个性化推荐、客户关系管理以及风险预测等方面的具体实践&#xff0c;本文揭示了AI智能名片小程序如何助力企业…

刚起步的小型海外仓有必要上WMS系统吗?答案来了

首先&#xff0c;这里的自动化主要是指将库存管理、SKU管理&#xff0c;一件代发、财务管理等海外仓的日常作业流程通过WMS系统实现的自动化。 而不是指海外仓自动化机器人、智能导轨等硬件设备。 文章会针对刚起步的一些小型海外仓是否有必要使用WMS系统进行讨论&#xff0c…

近视配眼镜指南

一、配镜指南&#xff1a; 1.镜架选择 度数不高、光度简单、适应能力强&#xff0c;镜架不那么重要度数高、眼底情况复杂、光度复杂&#xff0c;镜架优于镜片做选择&#xff0c;好镜架不等于贵镜架好的镜架设计&#xff1a;尺寸合适、佩戴舒适、适合矫正视力&#xff08;配镜片…

捷报来袭!上半年HCIE通过120人!证书量总计1767

智汇云校捷报 —上半年华为认证证书量1767本— 2024年上半年&#xff0c;云校HCIA、HCIP、HCIE证书量总计1767本&#xff01; HCIA&#xff1a;1240本 HCIP&#xff1a;407本 HCIE&#xff1a;120本 祝贺以下学员通过HCIE认证&#xff01; 欢迎有考证需求的学员 咨询云校…

js 获取favicon

js 获取favicon 参考文档 挖个坑想着搞一个管理书签的插件。里边有各种推拽排序的功能方便操作管理&#xff0c;还能定时更新检查已经失效的网页链接&#xff0c;还能够根据现有的网站域名归类显示。吧啦吧啦等等功能。 但是其中有一个需要显示各种网站的图标&#xff0c;嗯…

Python文件打包exe文件

作者的一点话 你是否还在为py文件无法像其他可视化项目展示出来&#xff0c;制造图形界面的移动使用&#xff0c;那接下来我会与你一同使用它&#xff0c;并进行study&#xff0c;如有困惑&#xff0c;可随时联系。 然后&#xff0c;需要使用pysimplgui&#xff0c;如果…

react 样式管理方案除了 styled-components,还有什么推荐的

除了 styled-components&#xff0c;React 还有一些其他流行的样式管理方案: CSS Modules&#xff1a;允许你将 CSS 类名局部化&#xff0c;避免全局命名冲突。它与普通 CSS 语法相同&#xff0c;易于学习和使用[2]. Emotion&#xff1a;一个高性能、灵活的 CSS-in-JS 库。它支…

C++笔记---命名空间(namespace)

1. namespace的定义 通过在全局域内使用namespace关键字可以定义出一个域&#xff0c;这个域跟其他的所有域相互独立&#xff0c;不同的域可以定义同名变量&#xff0c;这样定义出的域也被称作是命名空间。 在命名空间中可以定义变量&#xff0c;结构体&#xff0c;函数&…

[网络编程】网络编程的基础使用

系列文章目录 1、 初识网络 网络编程套接字 系列文章目录前言一、TCP和UDP协议的引入二、UDP网络编程1.Java中的UDP2.UDP回显代码案例3.UDP网络编程的注意事项 三、TCP网络编程1.TCP回显代码案例2.TCP多线程使用 总结 前言 在学习完基础的网络知识后&#xff0c;完成跨主机通…

元器件基础学习笔记——二极管基础

一、二极管基础 二极管是用半导体材料(硅、硒、锗等)制成的一种电子器件&#xff0c;具有单向导电性&#xff0c;是现代电子技术的基石。它在电子电路中扮演着至关重要的角色&#xff0c;通过与电阻、电容、电感等元器件的合理连接&#xff0c;能够实现整流、检波、限幅、稳压等…

Midjourney只需输入描述性文本,就能生成栩栩如生的图像

前言 Midjourney 是一款基于人工智能的图像生成工具&#xff0c;由 Midjourney 研究实验室开发。它最初在2022年3月面世&#xff0c;并在同年7月12日开始公开测试。Midjourney 的核心功能是能够根据用户提供的文本提示&#xff08;prompt&#xff09;&#xff0c;利用其内置的…

【软件测试】--接口自动化测试

1. 接口自动化 1.1 概念 接口测试&#xff1a;是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换、传递和控制管理过程&#xff0c;以及相互逻辑依赖关系 自动化测试&#xff1a;是把以人为驱动的测试行为转化为机器执行的一种过程 接口自动化测试&#xff1…

【详细】Ubuntu下安装qt5

Ubuntu下安装qt5 一. QT安装环境准备1、判断gcc是否安装2、安装g3、安装clang编译器4、安装 clang 5、安装make6、安装make-guile7、安装cmake 二. QT5安装1、安装Qt5的组件2、安装Qt的开发工具3、安装qtcreator4、安装qt55、安装qt charts&#xff08;可选&#xff09; 三、安…