MindSpore尝鲜之爱因斯坦求和
技术背景
在前面的博客中,我们介绍过关于numpy中的张量网络的一些应用,同时利用相关的张量网络操作,我们可以实现一些分子动力学模拟中的约束算法,如LINCS等。在最新的nightly版本的MindSpore中也支持了爱因斯坦求和的算子,这是在张量网络中非常核心的一个操作,本文就简单介绍一下MindSpore中使用爱因斯坦求和的方法。
安装最新版的MindSpore
Einsum是在1.6之后的版本才支持的,MindSpore的Master分支就是官网上面的Nightly版本,我们可以安装这个已经实现了爱因斯坦求和算子的版本。
安装指令如下:
python3 -m pip install mindspore-cuda11-dev -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade
简单示例
我们可以先将张量缩并,理解成是一个普通的矩阵乘积即可,只是相乘的矩阵维度大小略有区别。可以先看一个简单的案例,再解析其中的原理:
Python 3.9.0 (default, Nov 15 2020, 14:28:56)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ['GLOG_v'] = '4' # 设定日志等级,防止屏幕上出现大量的MindSpore告警信息
>>> from mindspore import Tensor, ops
>>> a = Tensor([[1.,2.],[3.,4.]])
>>> b = Tensor([1.,1.])
>>> ein_0 = ops.Einsum('ij,j->i') # 对第二个维度进行缩并
>>> print (ein_0((a,b)))
[3. 7.]
>>> ein_1 = ops.Einsum('ij,i->j') # 对第一个维度进行缩并
>>> print (ein_1((a,b)))
[4. 6.]
原理解析
我们日常所见的矩阵,可以采用张量这样的“章鱼图”表示方法来标记,每一个张量都是一个“章鱼”的头,而矩阵的每一个维度代表一条“章鱼腿”,比如一个维度为\((2,2,2)\)的矩阵,就可以用一只“三条腿的章鱼”来表示。而学习张量网络的时候经常可以看到的如下这张图,就分别用于表示一维、二维和三维的矩阵:
这些是张量的基本概念,而如果我们把“章鱼腿”都连接起来,就表示规定了这个张量的运算方向,张量只能跟相互连接的张量进行缩并(矩阵运算)操作。比如上一个章节中的案例,就可以用这样的一个张量图来表示:
可以看到,这两个矩阵运算之后得到的结果,是一个“单腿”的张量,对应于矩阵运算的维度变化就是:\((2,2)\times(2,)->(2,)\)。如果我们把这个运算推广开来,建立一个带有复杂链接信息的张量拓扑图,那么就得到了一个张量网络。在一个大型的张量网络中,我们不仅可以通过高性能的GPU来加速张量缩并的运算,还有路径搜索和图分解等算法可以进一步加速张量网络缩并,得到我们想要的结果。
我们可以再细化的讲解一下上一个章节中的案例,当我们使用ij,j->i这个路径时,得到的结果的第一个元素为\(a[0]\cdot b=3\),得到的第二个元素为\(a[1]\cdot b=7\)。当我们使用ij,i->j这个路径时,得到的结果的第一个元素为\(a[:,0]\cdot b=4\),得到的第二个元素为:\(a[:,1]\cdot b=4\)。从这个过程可以发现,对于二维的张量,其实取不同的“腿”,就是取行和取列运算的区别而已。对于更加高维的张量,我们很难用行、列这样的指标来衡量和理解,但是我们还是可以通过python的这种矩阵运算来理解。更多的参考示例,可以阅读MindSpore的官方文档(参考链接2)。
总结概要
张量网络计算,已经在众多的领域中得到了应用,不仅仅是传统的计算化学,当下医药研发领域的分子动力学模拟、计算化学和材料模拟,甚至是未来的量子计算,张量网络技术都在当中发挥重要作用。本文介绍的是MindSpore最新对张量网络计算的支持的第一步:用爱因斯坦求和计算张量网络缩并。
版权声明
本文首发链接为:https://www.cnblogs.com/dechinphy/p/mseinsum.html
作者ID:DechinPhy
更多原著文章请参考:https://www.cnblogs.com/dechinphy/
打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958
CSDN同步链接:https://blog.csdn.net/baidu_37157624?spm=1008.2028.3001.5343
51CTO同步链接:https://blog.51cto.com/u_15561675
参考链接
- https://www.cnblogs.com/dechinphy/p/lincs.html
- https://www.mindspore.cn/docs/zh-CN/r1.7/api_python/ops/mindspore.ops.Einsum.html?highlight=einsum#mindspore.ops.Einsum
- https://www.cnblogs.com/dechinphy/p/tensor.html
- https://www.zhihu.com/question/54786880/answer/147099121
MindSpore尝鲜之爱因斯坦求和的更多相关文章
- MindSpore尝鲜之Vmap功能
技术背景 Vmap是一种在python里面经常提到的向量化运算的功能,比如之前大家常用的就是numba和jax中的向量化运算的接口.虽然numpy中也使用到了向量化的运算,比如计算两个numpy数组的 ...
- C++17尝鲜
https://cloud.tencent.com/developer/article/1351910 [译]C++17,optional, any, 和 variant 的更多细节 用户261520 ...
- Windows 10 周年版尝鲜
早在今年的 Build 大会上,微软就开始宣传最新的 Windows 10 周年版更新,炫了不少特技,直到昨天(2016/8/2 PST)才正式放出,相关新闻可以参考这里,正式的版本为 Version ...
- 【翻译】五步快速使用LINQPad尝鲜StreamInsight
StreamInsight 学习地址:http://www.cnblogs.com/StreamInsight/archive/2011/10/26/StreamInsight-Query-Seri ...
- 小程序新能力-个人开发者尝鲜微信小程序
个人开发者的福利 微信小程序,刚听到这个新名词的时候,我就兴冲冲的去找入口,看看自己能不能搞个微信小程序的HelloWorld,毕竟能在微信上把自己写的一些小工具跑起来还是满炫酷的. 没想,网上一查, ...
- 【响应式】foundation栅格布局的“尝鲜”与“填坑”
提到响应式,就不得不提两个响应式框架--bootstrap和foundation.在标题上我已经说明白啦,今天给大家介绍的是foundation框架. 何为"尝鲜"?就是带大伙 ...
- Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例
前言:由于之前没有接触过Hibernate框架,但是最近看一些博客深深被它的"效率"所吸引,所以这就来跟大家一起就着一个简单的例子来尝尝Spring全家桶里自带的JPA的鲜 Spr ...
- 微信团队分享:Kotlin渐被认可,Android版微信的技术尝鲜之旅
本文由微信开发团队工程是由“oneliang”原创发表于WeMobileDev公众号,内容稍有改动. 1.引言 Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发( ...
- Linux下尝鲜IDE Rider .NET又一开发利器
RiderRS 扯淡:很多人说:jetbrains出品,必属精品,jetbrains确实出了不少好东西,但是他的产品总感觉越用越慢,我的小Y430P高配版也倍感压力,内存占用率高. Multiple ...
随机推荐
- Could not find the main class
最近开发了一个短信报警的服务,打成程序包之后,再本地windows启动(start.bat)没有问题,但是发到生产环境,报如下错: Could not find the main class 莫名其妙 ...
- kafka消费组创建和删除原理
0.10.0.0版本的kafka的消费者和消费组已经不在zk上注册节点了,那么消费组是以什么形式存在的呢? 1 入口 看下kafka自带的脚本kafka-consumer-groups.sh,可见脚本 ...
- Mybatis中的分页
Mybatis中有哪些分页方式? 数组分页:查询出全部数据,然后再list中截取需要的部分.(逻辑分页) 优点:效率高 缺点:占用内存比较高 sql分页:只从数据库中查询当前页的数据.(物理分 ...
- MyBatis 实现一对一有几种方式?具体怎么操作的?
有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在 resultMap 里面配置 association 节点配置一对一的类就可以完成: 嵌套查询是先查一个表,根据这个表里面的结果的 ...
- 学习Solr(一)
一.安装 1.需要的安装包:apache-tomcat-7.0.47.tar.gz.solr-4.10.3.tgz.tgz(jdk自行安装) 2.解压tomcat并创建solr文件夹 [root@lo ...
- 学习Cobbler(一)
一. http://cobbler.github.io/ Cobbler is a Linux installation server that allows for rapid setup of n ...
- vue中基于sortablejs与el-upload实现文件上传后拖拽排序
今天做冒烟测试的时候发现商品发布有一个拖拽图片排序功能没做,赶紧加上 之前别的同事基于 vuedraggable 实现过这个功能,我这里自己深度封装了 el-upload ,用这种方式改动很大,而且感 ...
- SDS-redis动态字符串
与C语言类似,redis自己创建了简单动态字符串SDS(Simple Dynamic String)即简单动态字符串,创建字符串类型的键值对,SDS表示字符串值,键值对的值为字符串对象 SDS用途可以 ...
- CPU架构:CPU架构详细介绍
1 概述 CPU架构是CPU商给CPU产品定的一个规范,主要目的是为了区分不同类型的CPU.目前市场上的CPU分类主要分有两大阵营,一个是intel.AMD为首的复杂指令集CPU,另一个是以IBM.A ...
- vim的vimrc配置
windows "# modified by Neoh set helplang=cn "使用中文帮助文档 set encoding=utf-8 "查看utf-8格式的帮 ...