发布时间:2023-10-10 16:00
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的安装命令由下图所示:
推荐使用采用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正确安装了。
除了上述的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
4、更多的mindspore.scipy接口
更多具体的接口开放信息,可以查看对应的官方文档链接。
目前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。
MindSpore官方资料
GitHub : https://github.com/mindspore-ai/mindspore
Gitee : https : //gitee.com/mindspore/mindspore
官方QQ群 : 486831414