为SciPy插上异构的翅膀,MindSpore SciPy教程详解

1、MindSpore框架的SciPy模块

SciPy 是基于NumPy实现的科学计算库,主要用于数学、物理学、生物学等科学以及工程学领域。诸如高阶迭代,线性代数求解等都会需要用到SicPy。SciPy大体上有数值最优化、线性代数、积分、插值、信号处理、常微分方程求解等计算求解模块。

原生的SciPy科学计算库仅可CPU平台下使能,对于GPU、Ascend等计算平台无法使用且没有高效的实现。

▪ MindSpore是以Python作为表达语言的AI框架,能够合理利用GPU和Ascend的计算能力进行高效计算,并且MindSopre提供了SciPy模块。

▪ mindsopre.scipy是MindSpore基于mindspore.numpy和自研算子实现的科学计算库,不仅兼容原生的SciPy能在CPU平台高效运行,而且支持在GPU、Ascend等平台加速计算。

▪ mindspore.scipy在CPU后端不仅能借助Minspore底层高效的CPU算子而且针对GPU平台也自实现了一系列的GPU底层高效算子。在GPU场景下能够提升硬件算力利用率,大幅提升科学计算的速度。随着后续的更新迭代,Ascend平台上也会使能高性能的mindspore.scipy模块。

除支持在不同硬件平台加速计算外,mindspore.scipy的接口定义与原生的SciPy保持高度一致,而当前业界已知的TensorFlow和PyTorch等框架中对于科学计算的接口支持与原生SciPy的接口对比存在差异。

对于当前MindSpore已经支持的接口,原生的SciPy实现可以直接替换成mindspore.scipy的实现(后面的例子可以看到)。接口定义的高度一致最大程度地降低用户的迁移成本,提高minspore.scipy的易用性。

2、安装mindspore.scipy

MindSpore的SciPy模块是作为科学计算的组件嵌入在MindSpore中的。当用户成功安装MindSpore框架后,minspore.scipy也会随之安装。

MindSpore的安装命令由下图所示:

为SciPy插上异构的翅膀,MindSpore SciPy教程详解_第1张图片

推荐使用采用pip的方式完成MindSpore的安装。

值得注意的是,mindspore.scipy目前仅支持1.6.0及以上的版本,并且支持的平台仅包含CPU(Linux-x86_64)以及GPU(Linux-x86_64),Windows以及Ascend平台目前尚未支持。

mindspore.scipy还在不断地发展,在后续的更新迭代中会逐渐更丰富、更高效、更便捷的用户接口以及更多计算平台。

Linux系统下CPU的pip安装命令为:

pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.6.0/MindSpore/cpu/x86_64/mindspore-1.6.0-cp37-cp37m-linux_x86_64.whl  --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple

Linux 系统下GPU的pip安装命令为:

pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/1.6.0/MindSpore/cpu/x86_64/mindspore-1.6.0-cp37-cp37m-linux_x86_64.whl  --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple

安装成功后显示的界面如下:

import mindspore  import mindspore.scipy  print(mindspore.__version__)

如果输出1.6.0并且没有错误提示的话,说明mindspore.scipy正确安装了。

为SciPy插上异构的翅膀,MindSpore SciPy教程详解_第2张图片

除了上述的pip命令安装,还可以用别的方式(例如源码)进行安装,详细的执行步骤可以参考:https://www.mindspore.cn/install。

3、如何使用mindspore.scipy

从1、2小节可知,mindspore.scipy的接口是与原生SciPy高度对齐的,以下是一个简单的例子来展示如何极小程度修改原生SciPy的脚本,使能GPU计算。

以下代码是使用原生NumPy和SciPy计算一个正定对称的实数矩阵进行cholesky分解和求解线性方程的过程:

import numpy as np  from scipy.linalg import cho_factor as cho_factor  from scipy.linalg import cho_solve as cho_solve  a = np.array([[9., 3., 1., 5.], [3., 7., 5., 1.], [1., 5., 9., 2.], [5., 1., 2., 6.]])  b = np.array([1., 1., 1., 1.])  c, low = cho_factor(A)  # 计算 A = L L*  x = cho_solve((c, low), b)  # 计算 A x = b  print(np.dot(A, x) - b)  # 输出 A x - b 是否为0

运行上述脚本输出为:

[0.00000000e+00 2.22044605e-16 0.00000000e+00 0.00000000e+00]

上述脚本中的分解和求解方程只能通过CPU进行计算,因为原生NumPy和SciPy只能在CPU上运行。安装了GPU下的MindSpore之后,将import的包改为mindspore.scipy,便可在GPU下对矩阵进行运算。修改后的脚本为:​​​​​​​

import mindspore.numpy as np  # 修改为mindspore.numpy  from mindspore.scipy.linalg import cho_factor as cho_factor  # 修改为mindspore.scipy  from mindspore.scipy.linalg import cho_solve as cho_solve  # 修改为mindspore.scipy  a = np.array([[9., 3., 1., 5.], [3., 7., 5., 1.], [1., 5., 9., 2.], [5., 1., 2., 6.]])  b = np.array([1., 1., 1., 1.])  c, low = cho_factor(A)  x = cho_solve((c, low), b)  print(np.dot(A, x) - b)

运行上述脚本,输出结果为:

[-5.9604645e-08  0.0000000e+00  0.0000000e+00 -5.9604645e-08]

值得注意的是,mindspore.numpy.array默认构造的浮点类型是float32,如果需要更高的精度,用户可以将对应输入数据类型指定为float64,即

a = np.array([[9., 3., 1., 5.], [3., 7., 5., 1.], [1., 5., 9., 2.], [5., 1., 2., 6.]], dtype=np.float64)

若用户使用mindspore.scipy时存在编译时间过长的问题,可以尝试使用动态图模式运行MindSpore。

mindspore.scipy的接口支持动静态图两种模式运行。默认情况下,MindSpore的运行是图模式(GRAPH_MODE),用户进需要输入代码,即可切换为动态图模式(PYNATIVE_MODE):​​​​​​​

from mindspore import context  context.set_context(mode=context.PYNATIVE_MODE)关于cholesky分解,mindspore.scipy.linalg中有mindspore.scipy.linalg.cho_factor、mindspore.scipy.linalg.cholesky两个对外接口,对应的api描述可点击下方链接查看:

https://www.mindspore.cn/docs/api/zh-CN/master/api_python/scipy/mindspore.scipy.linalg.cho_factor.html#mindspore.scipy.linalg.cho_factor 

为SciPy插上异构的翅膀,MindSpore SciPy教程详解_第3张图片

4、更多的mindspore.scipy接口

更多具体的接口开放信息,可以查看对应的官方文档链接。

为SciPy插上异构的翅膀,MindSpore SciPy教程详解_第4张图片

目前mindspore.scipy模块初步完成了scipy.linalg(线性代数)、scipy.sparse.linalg(稀疏线性代数)、scipy.optimize(数值优化)这几个模块中的部分基础接口的开发。

接口和文档都在持续完善中,最新、最全面的接口信息均可在以下链接中查看:

https://www.mindspore.cn/docs/api/zh-CN/master/api_python/mindspore.scipy.html 

其中包含了mindspore.scipy模块支持的所有接口,以及每个接口对应的输入输出,简单用例代码等。

Q&A

Q1:我安装了MindSpore 1.5的cpu 版本,为什么无法使用SciPy?

A1:mindspore.scipy 是r1.6以后开源到MindSpore的,用户可以安装更新的版本(r1.6)或者master上的MindSpore源码进行安装体验。

Q2:  我安装了MindSpore 1.6的cpu windows版本,为什么无法使用SciPy?

A2:mindspore.scipy 当前还未支持windows操作系统,后续会加紧迭代加入,可以使用linux-x86-64下的cpu或者gpu版本安装体验。

Q3:我想用mindspore.scipy模块下的xxx API,但是在官网的并未查询到相应的支持,怎么办?

A3:如果在官网的最新介绍中没有查询到xxx API,可以在MindSpore的社区提issue给社区维护人员,我们会根据计划尽快开发xxx API。

为SciPy插上异构的翅膀,MindSpore SciPy教程详解_第5张图片

MindSpore官方资料

GitHub : https://github.com/mindspore-ai/mindspore

Gitee : https : //gitee.com/mindspore/mindspore

官方QQ群 : 486831414 

你可能感兴趣的:(MindSpore,机器学习,深度学习,transformer)