自用华为ICT云赛道AI第三章知识点-AI开发框架MindSpore
MindSpore架构
全场景统一

- MindSpore旨在提供端边云全场景的AI框架。MindSpore可部署于端、边、云不同的硬件环境,满足不同环境的差异化需求,如支持端侧的轻量化部署,支持云侧丰富的训练功能如自动微分、混合精度、模型易用编程等。
- MindSpore全场景的几个重要特性:
- 端边云统一的C++推理接口,支持算法代码可快速迁移到不同硬件环境执行。
- 模型统一,端云使用相同的模型格式和定义,软件架构一致。MindSpore支持Ascend、GPU、CPU(x86、arm、..)等多种硬件的执行,一次训练多处部署使用。
- 多样化算力支持。提供统一的南向接口,支持新硬件的快捷添加使用。
- 模型小型化技术,适配不同硬件环境和业务场景的要求,如量化等。以及端边云协同技术的快速应用,如联邦学习等技术。
MindSpore架构

- MindSpore整体架构分为四层:
- 模型层,为用户提供开箱即用的功能,该层主要包含预置的模型和开发套件,以及图神经网络(GNN)、深度概率编程等热点研究领域拓展库;
- 表达层(MindExpression),为用户提供AI模型开发、训练、推理的接口,支持用户用原生Python语法开发和调试神经网络,其特有的动静态图统一能力使开发者可以兼顾开发效率和执行性能,同时该层在生产和部署阶段提供全场景统一的C++接口;
- 编译优化(MindCompiler),作为AI框架的核心,以全场景统一中间表达(MindIR)为媒介,将前端表达编译成执行效率更高的底层语言,同时进行全局性能优化,包括自动微分、代数化简等硬件无关优化,以及图算融合、算子生成等硬件相关优化;
- 运行时,按照上层编译优化的结果对接并调用底层硬件算子,同时通过“端-边-云”统一的运行时架构,支持包括联邦学习在内的“端-边-云”AI协同。
层次结构
- MindSpore向用户提供了3个不同层次的API,支撑用户进行AI应用(算法/模型)开发,从高到低分别为High-LevelPythonAPI、Medium-Level Python API以及Low-Level Python API。
- 高阶API提供了更好的封装性,低阶API提供更好的灵活性,中阶API兼顾灵活及封装,满足不同领域和层次的开发者需求。

- MindExpression层次结构。
- High-Level Python API:
- 第一层为高阶API,其在中阶API的基础上又提供了训练推理的管理、混合精度训练、调试调优等高级接口,方便用户控制整网的执行流程和实现神经网络的训练推理及调优。例如用户使用Model接口,指定要训练的神经网络模型和相关的训练设置,对神经网络模型进行训练。
- Medium-Level Python API:
- 第二层为中阶API,其封装了低阶API,提供网络层、优化器、损失函数等模块,用户可通过中阶API灵活构建神经网络和控制执行流程,快速实现模型算法逻辑。例如用户可调用Cell接口构建神经网络模型和计算逻辑,通过使用Loss模块和Optimizer接口为神经网络模型添加损失函数和优化方式,利用Dataset模块对数据进行处理以供模型的训练和推导使用。
- Low-Level Python API:
- 第三层为低阶API,主要包括张量定义、基础算子、自动微分等模块,用户可使用低阶API轻松实现张量定义和求导计算。例如用户可通过Tensor接口自定义张量,使用ops.composite模块下的GradOperation算子计算函数在指定处的导数。
MindSpore全场景支持模式

- MindSpore作为全场景AI框架,所支持的有端(手机与IOT设备)、边(基站与路由设备)、云(服务器)场景的不同系列硬件,包括昇腾系列产品、英伟达NVIDIA系列产品、Arm系列的高通骁龙、华为麒麟的芯片等系列产品。
- 左边蓝色方框的是MindSpore主体框架,主要提供神经网络在训练、验证相关的基础API功能,另外还会默认提供自动微分、自动并行等功能。
- 蓝色方框往下是MindSporeData模块,可以利用该模块进行数据预处理,包括数据采样、数据选代、数据格式转换等不同的数据操作。在训练的过程会遇到很多调试调优的问题,因此有MindSporeInsight模块对loss曲线、算子执行情况、权重参数变量等调试调优相关的数据进行可视化,方便用户在训练过程中进行调试调优。
- AI安全最简单的方式就是从攻防的视角来看,例如,攻击者在训练阶段掺入恶意数据,影响AI模型推理能力,于是MindSpore推出了MindSporeArmour模块,为MindSpore提供AI安全机制。
- 蓝色方框往上的内容跟算法开发相关的用户更加贴近,包括存放大量的AI算法模型库ModelZoo,提供面向不同领域的开发工具套件MindSporeDevKit,另外还有高阶拓展库MindSporeExtend,这里面值得一提的就是MindSporeExtend中的科学计算套件MindSciences,MindSpore首次探索将科学计算与深度学习结合,将数值计算与深度学习相结合,通过深度学习来支持电磁仿真、药物分子仿真等等。
- 神经网络模型训练完后,可以导出模型或者加载存放在MindSporeHub中已经训练好的模型。接着有MindIR提供端云统一的IR格式,通过统一IR定义了网络的逻辑结构和算子的属性,将MindIR格式的模型文件与硬件平台解耦,实现一次训练多次部署。因此如图所示,通过IR把模型导出到不同的模块执行推理。
MindSpore框架基础
张量
- MindSpore中最基础的数据结构就是张量(tensor)。所有数据都被封装在tensor中。
- 张量定义:一个多维数组。
- 零阶张量:标量;
- 一阶张量:向量;
- 二阶张量:矩阵。
- 在MindSpore中,可以通过以下方式快速创建张量:
- mindspore.Tensor。
- 接受一组数据,用于生成张量,在创建时可以指定维度。

MindSpore中的数据类型
- MindSpore支持Int,Uint 和Float 等数据类型。具体类型如图。
- 在MindSpore中可以通过mindspore.dtype来创建一个数据类型对象。
- MindSpore很好的兼容了numpy和Python中的数据类型,并可以通过mindspore.dtype_to_nptype、mindspore.dtype_to_pytype实现数据类型的转换。

运行环境配置
- MindSpore在运行时需要指定运行时的具体环境参数,包括计算图的模式、运行时的设备、内存空间大小等,同时也可以使用API获取当前运行环境的具体信息。
- 运行环境相关API:
- mindspore.context.set_context,设置运行环境的context。
- mindspore.context.get_context,根据输入key获取context中的属性值。
- mindspore. context. ParallelMode,并行模式。
- mindspore.context.set_ps_context,设置参数服务器训练模式的上下文。
- …
context
- MindSporecontext,用于配置当前执行环境,包括执行模式、执行后端和其他特性开关。
- mindspore.context.set_context(**kwargs):

- 在运行程序之前,应配置context。如果没有配置,默认情况下将根据设备目标进行自动设置。
MindSpore数据处理模块
- 在MindSpore中提供了对于数据集处理的子模块dataset。
- mindspore.dataset:该模块提供了加载和处理各种通用数据集的API,如MNIST、CIFAR-10、CIFAR-100、VOC、COCO、ImageNet、CelebA、CLUE等,也支持加载业界标准格式的数据集,包括MindRecord、TFRecord、Manifest等。此外,用户还可以使用此模块定义和加载自己的数据集。
- 此外,该模块下还提供了针对于语音、文本、图像等数据的数据增强功能。
MindRecord
- 为了高效地读取数据,比较有帮助的一种做法是对数据进行序列化并将其存储在一组可线性读取的文件(每个文件100-200MB)中。这尤其适用于通过网络进行流式传输的数据。对缓冲任何数据预处理也十分有用。
- MindRecord是MindSpore开发的一种高效数据格式。
- 此模块(mindspore.mindrecord)提供了一些方法将不同数据集转换为MindRecord格式,也提供了一些操作MindRecord数据文件的方法如读取、写入、检索等。
- MindRecord数据格式可以减少磁盘IO、网络IO开销。

- 其中数据文件包含文件头、标量数据页、块数据页,用于存储用户归一化后的训练数据,且单个MindSporeRecord文件建议小于20G,用户可将大数据集进行分片存储为多个MindSporeRecord文件。而索引|文件则包含基于标量数据(如图像Label、图像文件名等)生成的索引信息,用于方便的检索、统计数据集信息。数据文件中的文件头、标量数据页、块数据页的具体用途如下所示:
- 文件头:是MindSporeRecord文件的元信息,主要用来存储文件头大小、标量数据页大小、块数据页大小、Schema信息、索引|字段、统计信息、文件分区信息、标量数据与块数据对应关系等。
- 标量数据页:主要用来存储整型、字符串、浮点型数据,如图像的Label、图像的文件名、图像的长宽等信息,即适合用标量来存储的信息会保存在这里。
- 块数据页:主要用来存储二进制串、NumPy数组等数据,如二进制图像文件本身、文本转换成的字典等。
- MindSporeRecord数据格式具备的特征如下:
- 实现数据统一存储、访问,使得训练时数据读取更加简便。
- 数据聚合存储、高效读取,使得训练时数据方便管理和移动。
- 高效的数据编解码操作,使得用户可以对数据操作无感知。
- 可以灵活控制数据切分的分区大小,实现分布式数据处理。
MindSpore中的神经网络模块
- mindspore.nn,用于构建神经网络中的预定义构建块或计算单元。
- 该模块中包含了构建神经网络的组件,包括了:
- RNN、CNN、LSTM等网络结构;
- MSELoss、SoftmaxCrossEntropyWithLogits等损失函数;
- Momentum、Adam等优化器;
- F1 Score、AUC等模型评价指标。
- mindspore.Model,模型训练或推理的高阶接口。
回调函数Callback
- 回调函数Callback本身并不是一个函数,而是一个类。可以使用回调函数来观察训练过程中网络内部的状态和相关信息,或在特定时期执行特定动作。例如监控loss、保存模型参数、动态调整参数、提前终止训练任务等。
- MindSpore提供Callback能力,支持用户在训练/推理的特定阶段,插入自定义的操作。包括:
- MindSpore框架提供的ModelCheckpoint、LossMonitor、SummaryCollector等Callback类。
- MindSpore支持用户自定义Callback。
推理-模型文件
- MindSpore可以基于训练好的模型,在不同的硬件平台上执行推理任务。
- 推理模型文件保存支持两种类型的数据:训练参数和网络模型。
-
-
- 网络模型包括MindIR、AIR和ONNX三种格式文件。
