为 Android 插上 AI 的翅膀|技术点评

529 阅读5分钟

本文将详细介绍全场景 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 春招闯关活动」, 点击查看 活动详情