❝众所周知,人工智能能有今天的发展离不开数据、算力和算法。作为普通的Copy攻城狮,手头没有良好的硬件支撑AI的学习,焦头烂额,还好有她--ModelArts 。ModelArts是华为云的一站式AI开发平台,其中有个「我的笔记本」功能,是即开即用、用于机器学习的在线集成开发环境,可以轻松的构建、训练、调试、部署机器学习算法与模型。关键是免费!免费!免费!
❞
此次 MindSpore 第五期集训营的第一节课主要讲的就是 MindIR 。MindIR是MindSpore提供的中间表达形式,可以帮助我们实现一次训练多处部署,实现端云互通。比如我们可以在Ascend AI处理器、GPU、CPU等不同平台上训练并导出MindIR文件,然后快速部署到手机端或者用MindSpore Serving服务等环境上,体验到MindSpore的全场景能力。MindIR的具体实现细节请阅读《AI框架中图层IR的分析》。因为,Copy攻城狮只关心如何应用:
接下来通过两个具体的在线案例了解一下 MindIR 格式的模型是如何生成的。
官方文档:保存模型
查看源码 | 下载notebook | 在云上体验 |
---|---|---|
这是一个可以在 CPU 环境运行的案例,使用的是 LeNet 网络 和 MNIST 数据集。具体的实现本文不再赘述,总之这个案例详细介绍了 MindSpore 中数据处理、网络定义、模型训练、模型保存、模型验证等相关知识点。本文关注点在「导出MindIR格式文件」。 点击上边或者官方文档的 「Run in ModelArts」 就可跳转到华为云一站式AI开发平台,我们进入的其实是 ModelArts 的 「我的笔记本」功能--一个基于 JupyterLab 构建的在线集成开发环境,还可以快速切换不同环境平台。当前案例使用的是 GPU 环境,MindSpore 版本为 1.0.1 。根据文档并执行代码,我们很快就能实现一个 LeNet 网络并得到训练之后的模型。
目前导出 MINDIR 格式模型文件基于前置步骤生成的 CheckPoint 文件。官方文档建议使用.mindir作为MINDIR格式文件的后缀名。导出 MINDIR 格式文件的代码如下:
from mindspore.train.serialization import export, load_checkpoint, load_param_into_net
from mindspore import Tensor
import numpy as np
lenet = LeNet5()
# 返回模型的参数字典
param_dict = load_checkpoint("./models/ckpt/mindspore_save_model/lenet-1_1875.ckpt")
# 加载参数到网络
load_param_into_net(lenet, param_dict)
input = np.random.uniform(0.0, 1.0, size=[32, 1, 32, 32]).astype(np.float32)
# 以指定的名称和格式导出文件
export(lenet, Tensor(input), file_name='lenet-1_1875.mindir', file_format='MINDIR',)
导出完成之后,在当前目录下会生成一个MINDIR格式文件,如下图中名为lenet-1_1875.mindir
的文件。
当然如果您想将 LeNet 模型导出为不同格式的文件,建议您进行封装,具体实践请参考mindspore/model_zoo/official/cv/lenet/export.py
官方文档:使用ResNet-50网络实现图像分类
查看源码 | 下载notebook | 在云上体验 |
---|---|---|
有了上一次的在线体验,在进行训练ResNet50网络导出MindIR格式模型的时候,可谓“轻车熟路”,同样的点击「Run in ModelArts」开始我们的云端AI开发之旅。这次我们使用的是ResNet-50网络,CIFAR-10数据集,依旧是 MIndSpore 1.0.1 版本,不过是 GPU 环境的。
目前, ModelArts 中 「我的笔记本」要想使用 GPU 版本的 MIndSpore,好像暂时只有这个入口。 当然,这个案例中并没有实现将模型导出为 MindIR 格式,需要我们手动添加,唯一值得注意的是 MindSpore 1.0.1 和 MIndSpore 1.1.0 中 导出的方法「export」放在不同的命名空间下,1.1.0版本的引入方法是
from mindspore import Tensor, export, load_checkpoint, load_param_into_net
而 1.1.0版本中的引入方法是
from mindspore.train.serialization import export, load_checkpoint, load_param_into_net
因此,这里导出ResNet50网络 MindIR 格式的代码为:
from resnet import resnet50
from mindspore.train.serialization import export, load_checkpoint, load_param_into_net
from mindspore import Tensor
import numpy as np
resnet = resnet50(batch_size=32, num_classes=10)
# return a parameter dict for model
param_dict = load_checkpoint("./models/ckpt/mindspore_vision_application/train_resnet_cifar10-10_1562.ckpt")
# load the parameter into net
load_param_into_net(resnet, param_dict)
input = np.random.uniform(0.0, 1.0, size=[32, 3, 224, 224]).astype(np.float32)
export(resnet, Tensor(input), file_name='resnet_cifar10-10_1562.mindir', file_format='MINDIR')
不过这两个在线案例导出之后的 MindIR 格式,我还没来得及验证是否能正常使用。如果您知道快速验证的方法,请您分享与我,感谢大家多多指教!