本文将详细介绍全场景 AI 框架 MindSpore 在端侧的应用,通过简单的实践案例
环境清单
本文使用的是 Windows 环境,大概是 16 年的粗粮牌笔记本,希望能完成本次实战使命。
请注意:暂不支持在 Windows 进行端侧训练。 如想体验,可遵循 MindSpore 官方文档:编译 MindSpore Lite: Linux 环境编译.
安装 CMake
从 CMake 官网来看,支持 Windows 、 Linux 、 MacoS 等平台,也支持源码安装、绿色安装等安装方式,我采用的是健康的绿色。下载建议使用 X 雷辅助,像我这种贫民窟的网速,几分钟也能下载完这个不到 35 M 的 zip 文件。解压之后,我们发现可执行的 .exe 文件在 bin 目录下,因此,我们需要将 bin 目录加到环境变量中。
正确添加环境变量之后,我们按下 Win + R 输入 CMD 打开命令行窗口,就会发现 cmake 等命令就变得有效了,这就说明我们成功安装了 Cmake 。
安装 MinGW GCC
下载速度如果很慢的话,而且又恰好 X 雷也不管用的话,可以尝试一下用手机下载。下载完毕,同样是解压,然后找到 bin 目录 再配置环境变量;最后依旧是同样的验证一下, 新开一个命令行窗口,输入 gcc , 验证一下是否成功安装。
接着安装 git 我就不介绍了,记得上一次安装 git 应该是 19 年前的,对版本的要求可能没这么严格,我的依旧是 2.24 ,应该不会影响使用。
获取源码 & 编译
由于之前已经 clone 了 MindSpore 的源码,这里就不再演示源码的获取,如果您是第一次下载 MindSpore 源码,可以执行:
git clone https://gitee.com/mindspore/mindspore.git
为了和 MindSpore 仓库保持同步,我执行git pull
拉取了最新的代码。
此处,我并未使用 git bash 或者 Powershell,主要是她们都不支持 call 命令,我也没有深入去研究。
执行编译命令开始编译:
call build.bat lite
当然您也可以根据自己的机器调整线程数(默认是 6),比如call build.bat lite 8
和文档中描述一样,需要依赖 git 来安装一些存储在 github 的依赖,因此我们可能会遇到 time off 等问题,解决的方式比较粗暴:重试/手机热点/翻 Q。 我们所做的其实只为了获取两个文件:
-
mindspore-lite-{version}-converter-win-x64.zip:包含模型转换工具 converter。
-
mindspore-lite-{version}-inference-win-x64.zip:包含模型推理框架 runtime、基准测试工具 benchmark。
其中 version 为输出件版本号,与所编译的分支代码对应的版本一致。 再不济我们可以直接获取 官方提供的工具包:www.mindspore.cn/tutorial/li…。
想使用现成的工具可以参考 Copy 攻城狮 1 小时入门 AI 开发工程师
此时,漫长的等待,一个小时过去了,输出的日志也变成幽绿,绿中还带点粉,像极了大学校园春天的情人坡--绿油油的草地零散的粉色小花点缀。
……
最终实在熬住,直接洗洗睡了……早上起来看到了 md5 文件和压缩包如愿以偿地编译出来了,赶紧试试能不能进行模型转换。
模型转换
尽管我们可以直接使用官方的模型转换工具包,就如同我的历史文章《Copy 攻城狮 1 小时入门 AI 开发工程师》},就是使用的官方提供的 converter 。这次,为了验证我们自行编译的 MindSpore Lite 这些工具包是否能正常使用,我们将mindspore-lite-1.1.0-converter-win-x64.zip
解压至本地目录,获得 converter 工具。
此外,我们还需要一个 .mindir 文件,关于如何在线获取 .mindir 文件可参考《5 分钟在线体验 MindSpore 的图层 IR--MindIR》。这里,我们先直接下载使用官方提供的模型mobilenetv2.mindir,因此根据我个人的情况,执行:
call converter_lite --fmk=MINDIR --modelFile=../../mobilenetv2.mindir --outputFile=mobilenetv2
简单粗暴的CONVERT RESULT SUCCESS:0,并且生成了我们想要的可用于端侧的 .ms 文件。
Android 项目使用 MindSpore Lite 推理
其实关于 Android 项目使用 MindSpore Lite 推理,笔者有幸在 2020 年的 【Mindspore 21 天实战营】中学习过,有兴趣的小伙伴可以看看《基于 MindSpore Lite 开发目标检测的安卓 APP 实战》。目前 MindSpore Lite 提供 C++ 和 java 两种运行时的推理,MindSpore 官方文档给出了详细的实践步骤:读取模型--创建会话--图编译--输入数据--图执行--获取输出--释放内存,大体的流程如下图:
接下来,我们从实际 Android 项目的代码来看看整个推理实践过程。 如果您选用的是 C++ 的运行时,我们可以将模型加载和预测主要逻辑封装类放置到 cpp 目录下,另外还需实现 JNI 层,在 JNI 层通过端侧生成的库文件包调用 C++ API。这里我们选用 Java 运行时,使用 Java 运行时的时候,我们需要先在 linux 环境生成 AAR 包,当然也可以在官方下载。 自行编译 ARR 包:
bash build.sh -A java
编译结果如下:
-
Android 项目引用 AAR 包
首先我们将 mindspore-lite-{version}.aar 文件移动到目标module的libs目录,然后在 dependencies 中添加aar的依赖:
repositories { flatDir { dirs 'libs' } } dependencies { implementation fileTree(dir: "libs", include: ['*.aar', '*.jar']) }
-
端侧推理模型
-
读取模型
MindSpore Lite中进行模型推理时,首先需要读取
.ms
模型文件。import com.mindspore.lite.Model; private Model model; // …… // 读取 .ms 模型文件. model = new Model(); if (!model.loadModel(mContext, "some_model.ms")) { Log.e("MS_LITE", "加载模型失败!"); return false; }
-
创建Session
-
在Session中进行图编译
-
读取inputs内容
-
RunGraph推理
-
读取Outputs内容
-
删除Session
-
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情