技术背景

Vmap是一种在python里面经常提到的向量化运算的功能,比如之前大家常用的就是numba和jax中的向量化运算的接口。虽然numpy中也使用到了向量化的运算,比如计算两个numpy数组的加和,就是一种向量化的运算。但是在numpy中模块封装的较好,定制化程度低,但是使用便捷,只需要调用最上层的接口即可。现在最新版本的mindspore也已经推出了vmap的功能,像mindspore、numba还有jax,与numpy的最大区别就是,需要在使用过程中对需要向量化运算的函数额外嵌套一层vmap的函数,这样就可以实现只对需要向量化运算的模块进行扩展。用一个公式来理解向量化运算的话就是:

\[a_1+b_1=c_1\\
a_2+b_2=c_2\\
.\\
.\\
.\\
a_n+b_n=c_n\\
\Downarrow\\
\vec{a}+\vec{b}=\vec{c}
\]

安装最新版MindSpore

关于jax中的vmap使用案例,可以参考前面介绍的LINCS约束算法实现SETTLE约束算法批量化实现这两篇文章,都有使用到jax的vmap功能,这里我们着重介绍的是MindSpore中最新实现的vmap功能。首先我们需要安装mindspore最新的Nightly版本,其对应的是MindSpore的Gitee仓库中的master分支,具体安装指令可以参考其官方链接

因为我们本地已经安装过Mindspore的旧版本,因此还需要在安装指令之后加上--upgrade操作,否则会导致系统误以为本地已经安装成功,不会执行安装的操作:

$ python3 -m pip install mindspore-cuda11-dev -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade

Vmap功能测试

这里我们先来看一个比较简单的示例:

In [1]: from mindspore import Tensor

In [2]: from mindspore.ops.functional import vmap

In [3]: y = lambda a,b: a+b

In [4]: A = Tensor([1,2,3])

In [5]: B = Tensor([3,4,5])

In [6]: vmap_y = vmap(y,in_axes=(0,0))

In [7]: y(A[0],B[0]) # 元素加和
Out[7]: Tensor(shape=[], dtype=Int64, value= 4) In [8]: vmap_y(A,B) # 矢量加和
Out[8]: Tensor(shape=[3], dtype=Int64, value= [4, 6, 8])

在上面的这个示例中,我们定义了一个加法函数y,作用就是把输入的两个对象相加。这里需要注意的是,如果输入给y的是两个Mindspore的Tensor对象,那么会直接返回两个Tensor对应位置相加的结果。但是如果输入给y的是两个普通python的list,则输出的结果会是两个list的拼接,这跟不同类型的加法的实现方式有关,在文末总结中会进行解释。这里我们只是想说明:y本身是一个元素加和的函数,可以通过vmap使其称为矢量加和的函数。关于输入的in_axes参数,指的是扩展的维度。比如我们写了一个支持\((A,A)\times(A,1)\)维度的函数,如果把in_axes参数设置为0,那么就可以得到一个支持计算\((B,A,A)\times(B,A,1)\)维度的函数。其中in_axes参数,决定的是被扩展的维度B所在的位置。这一点我们可以看一下vmap的官方示例:

在这个案例中,也是定义了一个普通的加和函数,通过vmap去扩展不同的维度,大致的计算逻辑为:

\[(A,)+(A,)+(A,)\\
\Downarrow^{in\_axes=(0,1,None)}\\
(B,A)+(A,B)+(A,)=(B,A)+(B,A)+(1,A)=(B,A)\\
\Downarrow^{out\_axes=1}\\
(A,B)
\]

其实这个过程中关于in_axes是比较容易可以理解的,但是这个out_axes有时候会让人难以捉摸,在github上专门有人提出了这个issue并有人做出了解释:

结合上面的案例,其实out_axes就是决定了扩展的维度B在结果中的位置,比如out_axes=1,所对应的结果中就是\((x,B,x,...x)\)。也就是说,其不影响计算的结果,但是有可能会对计算结果进行转置操作,在MindSpore和Numpy中称为swap_axes

总结概要

本文介绍了华为推出的深度学习框架MindSpore中最新支持的vmap功能函数,可以用于向量化的计算,本质上的主要作用是替代并加速python中的for循环的操作。最早是在numba和pytroch、jax中对vmap功能进行了支持,其实numpy中的底层计算也用到了向量化的运算,因此速度才如此之快。vmap在python中更多的是与即时编译功能jit一同使用,能够起到简化编程的同时对性能进行极大程度的优化,尤其是python中的for循环的优化。但是对于一些numpy、jax或者MindSpore中已有的算子而言,还是建议直接使用其已经实现的算子,而不是vmap再手写一个。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/ms-vmap.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958

参考链接

  1. https://gitee.com/mindspore/mindspore/blob/master/mindspore/python/mindspore/ops/functional.py#L845

MindSpore尝鲜之Vmap功能的更多相关文章

  1. MindSpore尝鲜之爱因斯坦求和

    技术背景 在前面的博客中,我们介绍过关于numpy中的张量网络的一些应用,同时利用相关的张量网络操作,我们可以实现一些分子动力学模拟中的约束算法,如LINCS等.在最新的nightly版本的MindS ...

  2. Leetcode多线程题库练习(新功能尝鲜)& 个人感悟

    大家好, 我是方子龙.很久没有自己写文章了. 一面是因为工作上的需求开发任务比较重,下班回家基本上就躺床玩几把王者,度过闲暇时光. 二面是一有点时间就自己主动地去看书和学习,知道自己还缺少很多知识,由 ...

  3. Windows 10 周年版尝鲜

    早在今年的 Build 大会上,微软就开始宣传最新的 Windows 10 周年版更新,炫了不少特技,直到昨天(2016/8/2 PST)才正式放出,相关新闻可以参考这里,正式的版本为 Version ...

  4. 【翻译】五步快速使用LINQPad尝鲜StreamInsight

    StreamInsight  学习地址:http://www.cnblogs.com/StreamInsight/archive/2011/10/26/StreamInsight-Query-Seri ...

  5. Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例

    前言:由于之前没有接触过Hibernate框架,但是最近看一些博客深深被它的"效率"所吸引,所以这就来跟大家一起就着一个简单的例子来尝尝Spring全家桶里自带的JPA的鲜 Spr ...

  6. 微信团队分享:Kotlin渐被认可,Android版微信的技术尝鲜之旅

    本文由微信开发团队工程是由“oneliang”原创发表于WeMobileDev公众号,内容稍有改动. 1.引言   Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发( ...

  7. Linux下尝鲜IDE Rider .NET又一开发利器

    RiderRS 扯淡:很多人说:jetbrains出品,必属精品,jetbrains确实出了不少好东西,但是他的产品总感觉越用越慢,我的小Y430P高配版也倍感压力,内存占用率高. Multiple ...

  8. 微信小程序“满月”:尝鲜之后你还用过它吗?

    距离 2017 年 1 月 9 日微信小程序上线,整整过去了一个月时间.和互联网时代每天出现的众多新鲜事物相似,小程序甫一诞生,立即占据了各大科技媒体网站头屏并引起社交圈的兴奋讨论.由于背靠微信,纷纷 ...

  9. 基于 Blazui 的 Blazor 后台管理模板 BlazAdmin 正式尝鲜

    简介 BlazAdmin 是一个基于Blazui的后台管理模板,无JS,无TS,非 Silverlight,非 WebForm,一个标签即可使用. 我将在下一篇文章讨论 Blazor 服务器端渲染与客 ...

随机推荐

  1. Python基础(Day1)

    一.Python的简介  1.Python的诞生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发 ...

  2. Dubbo扩展点应用之二负载均衡

    负载均衡其本质就是将请求分摊到多个操作单元上进行,从而共同完成工作任务.其策略主要用于客户端春常在多个提供者时根据算法选择某个提供者.在集群负载均衡时,Dubbo提供了多种均衡策略(包括随机.轮询.最 ...

  3. CentOS7更新OpenSSH8

    今天使用漏洞扫描工具扫描了一下系统漏洞,发现有一个openssh版本的漏洞.所以本着安全的原则修复一下. 第一时间打开百度搜索相关内容,大多数是编译安装的.每个人的环境和版本也不一样.有一定连不上去的 ...

  4. Python3+PyMysql

    原文地址(持续更新ing-):https://www.caituotuo.top/6bf90683.html 1. 安装PyMySQL pip3 install PyMySQL 2. 创建数据库 # ...

  5. 攻防世界 MOBILE RemeberOther

    解题思路: 下载后解压可以得到一个apk文件和word文件.查看word文件,里面写了比较简单的一句话,未获有有效信息.(后续会讲到这个word文档的使用) word内容 运行apk文件,如图: ap ...

  6. 大数据BI系统是怎么助力企业长久发展的

    多元化集团企业在发展到一定阶段后,往往会遇到业务与财务分离.管理缺乏系统决策支持等管理问题.财务决策支持系统建设实施BI是管理升级的内在要求. 1996年,加特纳集团提出了商业智能(Businesin ...

  7. Smartbi报表工具的学习笔记,如何学好报表分析?

    近期,因为工作需要,学习了一个报表工具Smartbi,这是国产BI软件,其功能还是挺强大的,并且学习成本很低,容易上手. 其实在学习Smartbi之前,我还学习了一段时间的微软BI工具sqlserve ...

  8. BI企服界大众点评来袭!Smartbi入围36氪企服软件系列三大榜单!

    近日,36氪企服点评中国商业智能BI金榜揭晓.作为国产民族BI软件的领跑者,思迈特软件凭借深耕多年大数据BI领域中拥有过硬的产品实力与优质的服务,荣获"商业智能BI最佳软件总榜TOP10&q ...

  9. windows系统如何远程桌面连接

    转至:https://jingyan.baidu.com/article/67662997adb46a54d51b84bd.html 远程桌面连接是一种通过网络技术,远程操作另一台电脑的过程,随着wi ...

  10. MongoDB聚合查询及Python连接MongoDB操作

    今日内容概要 聚合查询 Python操作MongoDB 第三方可视化视图工具 今日内容详细 聚合查询 Python操作MongoDB 数据准备 from pymongo import MongoCli ...