【mindspore系列】- 算子源码分析
本文会介绍mindspore的算子源码结构、执行过程以及如何编写一个自定义的mindspore算子。
源码介绍
首先,我们先从https://gitee.com/mindspore/mindspore/ 官网中clone源代码下来。
clone好代码后,可以看到源码的文件夹结构如下(只列出比较重要的文件夹):
- docs
- mindspore
- ccsrc
- core
- ops
- python
- tests
前端接口
在算子开发过程中,主要涉及这三个文件夹。
docs
文件夹是所有mindspore API的接口文档,包括中英文接口文档。
tests
文件夹是所有的测试代码,包括UT用例和ST用例等。
mindspore
文件夹是重点关注对象,核心实现逻辑基本都在这个文件夹里。
在mindspore
文件夹里,有四个子文件夹。其中 python
文件夹是前端的接口定义。
例如mindspore/python/mindspore/ops/function/array_func.py
这个文件里定义了很多关于array相关的算子,譬如def min(xxx)
, def max(xxx)
等这些常见算子。
如果你仔细研究过这个文件夹,你会发现在这个文件夹下,有的函数有时候会被定义两次,但是他们所属的包路径却不一样。
例如包路径下有ops.min这个函数定义,同时还有mint.min这个函数的定义。
实际上,mindspore目前的有两套接口定义。例如:
import mindspore
from mindspore import ops, mint, Tensor# ops下的接口
print(ops.max(Tensor([1,2,3]))# mint下的接口
print(mint.max(Tensor([1,2,3])))
这两个的区别从官网上就能看出。之所有会搞两套接口定义,是因为mindspore前期是抄袭TensorFlow的架构和接口定义,因此细心的你能发现ops下的接口定义基本与Tensorflow的接口定义保持一致。但是随着Torch的火爆,越来越多的人在使用Torch,mindspore为了让这部分人无痛迁移脚本,就搞出来一套mint下的接口,简称 mindspore is not torch,翻译过来大概就是此地无银三百两吧。
目前ops和mint的关系:如果ops下的接口定义与Torch的定义一致,那么mint的接口会直接引用ops下的接口。如果不一致,则会新增xxx_ext接口,即增加后缀名以区分函数的方式来增加mint下的接口。
后端实现
mindspore.ops
文件夹是算子具体的后端实现,