介绍
全场景、深度学习计算框架,可支持CPU、GPU、华为AI昇腾系列处理器等硬件,可使用Linux、windows、MacOS系统。
教程目的:熟悉框架语法结构,熟悉从构建数据集到训练的全流程
MindSpore安装
MindSpore安装
验证安装成功会显示如下信息:
1 | MindSpore version: 版本号 |
注意:
- 版本选择2.7.0-rc1,选择2.6.0的时候会导致下载失败。
- 下载请在管理员下的命令提示符下进行。
Tensor: 创建-属性-操作-NumPy
张量(Tensor)是MindSpore中的基本数据结构,存储多维数组的数据结构。
- 张量属性:形状(shape)和数据类型(dtype)
形状:定义张量的维度,是tuple类型,使用张量.shape查看
数据类型:使用张量.dtype查看,定义张量的数据类型和大小,包括基础数据类型、其他类型、类型转换规则,必须使用mindspore.dtype中定义的类型。 - 张量初始化:
- 直接创建:mindspore.Tensor()。Tensor参考API文档
- 使用numpy创建:mindspore.Tensor(numpy.array())
- 从旧张量中创建新张量:mindspore.ops.OnesLike(Tensor())
- 张量运算:涉及算术、线性代数、矩阵运算等。可使用类numpy的索引和切片使用方式,存在和pandas类似的连接(cancat)和合并使用方式.
- 与NumPy的数据转换:
- NumPy转换为Tensor: mindspore.Tensor(numpy.array())
- Tensor转转换为NumPy:mindspore.Tensor.asnumpy(),Tensor和ndarray会共享内存地址。
- 注意:
使用前需要设置环境上下文,设置模式和目标设备类型,例如:
from mindspore import context context.set_context(mode=context.GRAPH_MODE, device_target="CPU")模式包括GRAPH_MODE(静态图模式)和PYNATIVE_MODE(动态图模式)两种。
目标设备类型包括CPU、GPU、Ascend(昇腾)mindspore.obs提供function接口,涉及Tensor操作函数、数学运算函数、神经网络函数、微分函数、调试函数等。
使用时需要注意有些API函数中存在支持平台的限制,例如Ascend(昇腾)、GPU、CPU,有些函数只支持CPU或者GPU,有些实验性质的API只支持Ascend。
当使用 init 参数来初始化 Tensor 时,通常需要使用 Tensor.init_data 来加载 Tensor 的数据
数据:创建-自定义-数据处理
- mindspore.dataset:
性质:核心数据加载模块,基于Pipeline的数据引擎。
作用:提供数据采样、增强变换、数据批处理等功能,通过使用不同的数据加载方式,和数据集加载API配合使用。
数据加载方式三种:开源数据集加载、标准格式数据集加载、自定义数据集加载
开源数据集加载:视觉数据集、文本数据集、音频数据集
标准格式数据集加载:加载业界标准数据格式的数据集文件,例如TFRecord、MindRecord等格式。
自定义数据集加载(mindspore.dataset.GeneratorDataset):自定义Python数据源,自定义数据读取和处理逻辑。 - 数据处理步骤:加载数据集、数据集操作、批处理、迭代器、数据增强(数据集样本变换)
- 数据加载:
- 加载数据集(自定义、开源和标准格式数据集)
- 加载数据集(开源和标准格式):先用模块提供的API加载和处理数据集import mindspore.dataset as ds。再通过使用jupyter notebook中运行linux命令下载数据集并解压,存放到指定路径中,注意数据集的目录结构。使用时需要注意使用的数据集文件所在的根目录路径,有些加载必须使用该路径才能使用数据。
- 加载自定义数据集:使用GeneratorDataset接口自定义数据集加载。可以先自定义数据集类(DatasetGenerator),包含数据初始化操作__init__, 数据访问方法__getitem__, 数据量统计方法__len__等,再通过GeneratorDataset接口加载自定义数据集类访问数据集中的数据样本。
- 数据集操作、批处理、迭代器、数据增强(数据集样本变换)
- 数据集操作(filter/ skip):通过使用对象方法 .filter / .skip/ .shuffle来实现数据集的进一步过滤、跳过、混洗等操作。注意:.shuffle等方法是实例方法,使用时需要先创建实例,再调度数据集操作方法。
- 批处理(mindspore.dataset.Dataset.batch):将数据集中的多条数据组合为一个批数据。
- 迭代器(mindspore.dataset.Dataset.create_dict_iterator):创建数据集迭代器,返回字典样式的样本数据,可实现预处理过程中的数据循环输出。
- 数据增强:数据集样本变换(mindspore.dataset.transforms),一种通用数据增强方法,特别是在数据量过小或在样本单一等问题场景下影响模型训练效果时,通过使用数据增强操作进一步扩展样本多样性和操作,从而提升模型的泛化能力。
模型:定义-模型结构-模型层-模型参数
以神经网络模型的构建为例
- 关键模块:
mindspore.nn:神经网络模块,用于构建神经网络中的预定义构建块或者计算单元。
其中包括基本构成单元、容器(构造神经元)、封装层、卷积神经网络层、循环神经网络层、Transformer层、嵌入层、非线性激活函数层、线性层、Dropout层(随机丢弃层)、归一化层、池化层、填充层、损失函数、优化器、动态学习率、图像处理层、公共层、工具等部分组成。 - 关键类:
mindspore.nn.Cell:MindSpore中神经网络的基本构成单元,是所有网络的基类,所有模型或神经网络层应当继承该基类,并重新其中的__init__方法和construct方法。Cell(神经元)在GRAPH_MODE(静态图模式)下将编译为一张计算图,在PYNATIVE_MODE(动态图模式)下作为神经网络的基础模块。
- construct:定义要执行的计算逻辑,所有子类必须重写此方法。
- parameters_and_names:返回当前Cell或所有子Cell的参数名称和参数本身
- 关键成员函数:
- 二维卷积神经网络层(mindspore.nn.Conv2d):根据输入Tensor张量计算二维卷积。先根据参数建立卷积神经网络模型,再根据输入Tensor,输出Tensor.可用于在神经网络中提取特征。
- 全连接线性层(mindspore.nn.Dense):根据输入Tensor,计算出线性变换后的输出Tensor, 可用于对输入张量做线性变换。使用的激活函数可以指定具体的激活函数名,例如mindspore.nn.ReLU
- 非线性激活函数层(mindspore.nn.ReLU):逐元素计算修正线性单元激活函数,逐位输出各位中数值和零的最大值。输入和输出都是Tensor,在网络中添加非线性激活函数,可用于神经网络学习复杂特征。
- 池化层(mindspore.nn.MaxPool2d):在输入Tensor上应用2D最大池化运算,组成2D平面,可用于数组降采样。
- 公共层(mindspore.nn.Flatten):对输入的Tensor按照输入维到输出维进行展平。
自动微分:求导-梯度缩放-停止计算-梯度
- 参数设置:
mindspore.Parameter:Tensor子类,当被绑定为Cell属性时,可以同Cell的方法获取。
mindspore.ParameterTuple:用于管理多个mindspore.Parameter,实现将网络参数存储到参数元祖集合中。 - 梯度计算:
mindspore.ops.matmul:计算输入的两个Tensor乘积,输入的两个Tensor数据类型必须一致。
mindspore.ops.GradOperation (get_all=False, get_by_list=False, sens_param=False),一阶导数方法,来自mindspore.ops.primitive的框架算子,一个高阶函数,为输入函数生成对应的梯度函数。可实现对输入求导(返回第一个输入的梯度和所有输入的梯度)、对参数求导和同时对输入和参数求导。其中
- get_all为False时,只会对第一个输入求导,为True时,会对所有输入求导
- get_by_list为False时,不会对权重求导,为True时,会对权重求导
- sens_param对网络的输出值做缩放以改变最终梯度,配合缩放指数,确保缩放指数的维度和输出维度保持一致。
- mindspore.ops.stop_gradient:用于消除某个值对梯度的影响,例如截断来自于函数输出的梯度传播,可以用来禁止网络内的算子对梯度的影响。
- 求导步骤:
- 定义使用算子定义网络结构、定义求导网络、根据具体输入值计算计算求导值。
- 对权重求一阶导,需要将mindspore.ops.GradOperation中的get_by_list设置为Trure.如果对某些权重不进行求导,则在定义网络结构中,对相应权重参数值mindspore.Parameter中的requires_grad设置为False.
- 对梯度值做缩放,需要将mindspore.ops.GradOperation中的sens_param设置为Trure,并在求导网络中定义缩放指数self.grad_wrt_output,再将该指数用于求导函数中。
优化模型:损失函数-优化器
- 超参:可调整参数,用于控制模型训练优化过程,影响模型训练和收敛速度等。
一般超参如下:
- 训练轮次(epoch):训练时遍历数据集的次数,一般用于训练mindspore.train.Model.train方法中
- 批次大小(batch size):用于构造训练数据集,数据集进行分批次读取训练,并设定每个批次数据大小。
- 学习率(learning rate):用于优化器参数设置中,学习率偏小会导致收敛速度偏慢,过大则导致训练不收敛等不可预测问题。
- 损失函数:评价模型的预测值和真实值不一样的程度,损失函数可以直接使用mindspore.nn.L1Loss(计算预测值和目标值之间的平均绝对误差)这类损失函数定义。
- 优化器:用于计算和更新梯度,优化器的选择直接影响最终模型的性能。优化器在模块mindspore.nn中,mindspore的所有优化逻辑都封装在Optimizer对象中,要使用优化器,需要构建Optimizer对象,要能够保持参数状态并基于计算得到的梯度能进行参数更新。构造Optimizer对象前,需要先确定包含所有需要优化参数的迭代器,如网络中需要训练的参数parameter等。
优化器可以直接使用mindspore.nn.SGD(随机梯度下降的实现)这类优化器函数定义。 - mindspore.train.Model:模型训练和推理高阶接口,根据用户的传入参数、损失函数、优化器,封装可训练或推理的实例。
train方法:模型训练接口,可根据训练执行轮次epoch,训练数据集train_dataset,开始模型训练。 - 模型训练四步骤:
- 定义神经网络
- 构建数据集
- 定义超参、损失函数和优化器
- 输入训练轮次和数据集开始模型训练。
保持加载:保存模型-加载权重-导出IR
保存模型:
- 主要使用Callback机制,使用API函数如下:
- mindspore.train.ModelCheckpoint:checkpoint回调函数,用于在训练过程中,保存网络参数。注意:在分布式训练场景下,每个训练进程都需要指定不同的目录,保存checkpoint文件,否则可能训练失败。
- mindspore.train.CheckpointConfig:保存checkpoint配置策略
- 注意:
- 保存模型步骤:先设置checkpoint配置策略,再创建ModelCheckpoint对象,在将ModelCheckpoint对象传递给model.train训练方法,开始训练。
- MindSpore为方便用户区分每次生成的CheckPoint文件,会在用户定义的前缀后添加”_”和数字加以区分。如果想要删除.ckpt文件时,请同步删除.meta 文件。
加载模型:
- mindspore.load_checkpoint:加载checkpoint文件,返回值是字典。主要用于将参数文件中的网络参数存入自定义的参数字典中,配合模型实例,将参数加载入网络中。
- mindspore.load_param_into_net:将自定义参数字典中的参数加载到网络或优化器中,加载后,网络中的参数就是之前CheckPoint保存的参数,返回网络中没有被加载的参数列表。
验证模型:
- 推理场景:
mindspore.train.Model:模型训练或推理高阶接口。 根据用户传入的参数,封装可训练或推理的实例。
- eval方法:模型评估接口。
- train方法:模型训练接口。
- 验证步骤:先定义验证数据集,再利用数据集,调度eval方法进行推理验证。
- 任务中断再训练或者微调场景:
- 验证步骤:先定义训练轮次和训练数据集,再利用数据集,调度train方法进行训练。可用于迁移学习。
导出模型:
通过网络和CheckPoint格式文件生成对应模型格式文件,实现在不同硬件平台上的推理。
- mindspore.export:将MindSpore网络模型导出为指定格式的文件。可导出ONNX/AIR/MINDIR三种格式文件。当导出文件格式为AIR、ONNX时,单个Tensor的大小不能超过2GB。
- 文件导出格式:
- ONNX(Open Neural Network eXchange):一种针对机器学习所设计的开放式的文件格式,由微软提出,与环境和平台无关的标准格式,2.2 用于在不同深度学习框架共享和交换已训练好的模型。推荐的输出文件后缀是”.onnx”.
- AIR(Ascend Intermediate Representation):一种Ascend模型的中间表示格式。类似ONNX,由华为提出,能更好适配昇腾AI处理器。推荐的输出文件后缀是”.air”.
- MINDIR(MindSpore Native Intermediate Representation for Anf):一种MindSpore模型的中间表示格式。推荐的输出文件后缀是”.mindir”.
- 格式导出:
ONNX格式:可在第三方硬件平台上推理。导出文件名称会自动添加“.onnx”后缀。
export(..., file_format = 'ONNX')AIR格式:可在昇腾AI处理器上推理。导出文件名称会自动添加“.air”后缀。
export(..., file_format = 'AIR')MINDIR格式:可在MindSpore端侧(GPU/CPU/Ascend)上推理。导出文件名称会自动添加“.mindir”后缀。
export(..., file_format = 'MINDIR')
端侧推理:模型加载-植入APP-推理
不同推理设备有不同的推理方法,模型可以在昇腾Ascend处理器和移动设备上进行推理,由于昇腾Ascend处理器推理配置复杂,本文主要介绍移动设备推理。
- MindSpore Lite:AI引擎,支持GPU/CPU/NPU异构调度,支持模型轻量化、全场景(IOS/安卓/Huawei LiteOS系统)部署,支持MindSpore、TensorFlow Lite、Caffe和ONNX 4类AI框架(不支持Pytorch)。
- 工作流程和步骤:
- 选择模型:可使用预置的终端模型,或者使用自己已训练好的模型。
- 模型转换:主要是格式转换
转换工具下载:按照linux和windows系统的不同,选择不同的转换工具压缩包。
转换工具使用:不同系统转换工具不同,执行转换命令时,–fmk参数表示输入模型的原始格式,例如MINDIR;–modeFile表示输入模型路径;–outputFile表示模型输出路径,转换后的模型会自动添加.ms后缀,转换为.ms格式。 - 构建环境和运行:不同系统编译和推理有差异。
编译构建:windows系统要比linux麻烦一点,需要下载库和模型。
执行推理:编译完成后,进入模型目录,调用.ms格式的模型文件
基于公开来源资料mindspore教程1.3版本,详情请看MindSpore官网