网络脚本分析

算子评估

MindSpore算子设计

使用MindSpore框架搭建神经网络流程与其他框架(TensorFlow/PyTorch)类似,但支持的算子存在差异,需要在进行网络迁移(例如由TensorFlow迁移至MindSpore Ascend平台)时找出MindSpore框架缺失的算子。

MindSpore API由各种Python/C++ API算子组成,可以大致分为:

  • 数据框架算子

    包括张量、基本数据类型、训练梯度、优化器算子,如mindspore.int32mindspore.nn.Cell等。

  • 数据预处理算子

    包括图片读取、数据类型转化算子,如mindspore.dataset.MnistDataset等。

  • 网络结构算子

    包括网络构建中使用到的卷积、归一化算子,如mindspore.nn.Conv2dmindspore.nn.Dense等。

    网络结构算子表层为ME算子,即用户调用的算子API(例如mindspore.nn.Softmax),ME算子底层调用TBE算子(C/C++)实现。

    统计缺失ME算子时,需要找出源码脚本中所有算子(含数据框架类、数据预处理、网络结构算子)在MindSpore框架的对应算子(例如tf.nn.relu对应MindSpore算子为mindspore.nn.ReLU)。如果MindSpore中没有对应算子,则计入缺失。

查询算子映射表

在代码库找到网络结构及实现训练功能的Python文件(名称一般为train.py model.py等等),在脚本文件中查找所有相关算子(含数据框架类、数据预处理、网络结构算子),并与MindSpore算子API对比,查找mindspore.nn或者mindspore.ops下算子的平台支持情况。

若该网页均未能找到对应的ME算子,则可继续在MindSpore API列表中搜索算子名称。

若源码为PyTorch脚本,则可以直接查询MindSpore与PyTorch的算子映射找到对应的MindSpore算子。注意,针对相同功能的算子,MindSpore的命名可能与其他框架不同,同名算子参数与功能也可能与其他框架有区别,均以官方描述为准。

缺失算子处理策略

  1. 考虑用其他算子替换:需要分析算子实现公式,审视是否可以用现有MindSpore算子叠加达到预期目标。

  2. 考虑临时规避方案:比如某个loss不支持,可以替换为同类已支持的loss算子。

  3. 在MindSpore社区提交建议开发缺失算子。

语法评估

MindSpore提供GRAPH_MODEPYNATIVE_MODE两种模式。

PyNative模式下模型进行推理的行为与一般Python代码无异。

而在使用GRAPH_MODE时,或使用PYNATIVE_MODE进行训练时,通常会出现语法限制。在这两种情况下,需要对Python代码进行图编译操作,而这一步操作中MindSpore目前还未能支持完整的Python语法全集,所以construct函数的编写会存在部分限制。具体限制内容可以参考MindSpore静态图语法

常见限制原则

相较于详细的语法说明,常见的限制可以归结为以下几点:

  • 构图时不要调用其他Python库,例如numpy、scipy,相关的处理应该前移到__init__阶段。

  • 构图时不要使用自定义类型,而应该使用MindSpore提供的数据类型和Python基础类型,可以使用基于这些类型的tuple/list组合。

  • 构图时不要处理多线程、多进程数据。

常见处理策略

  1. 使用MindSpore内部提供的算子替换其他Python库的功能。常量的处理可以前移到__init__阶段。

  2. 使用基础类型进行组合,可以考虑增加函数参数量。函数入参数没有限制,并且可以使用不定长输入。

  3. 避免网络中出现多线程处理。