更新:Neural Networks API 现在可在从 API 27 (Oreo 8.1) 开始的 Android 设备上使用。 API 提供了一个较低级别的工具,较高级别的机器学习框架(例如 Tensorflow、Caffe)可以使用它来构建模型。它是一个 C 语言 API,可以通过 Android 原生开发工具包 (NDK) 访问。
NNAPI 为硬件供应商提供服务提供者接口 (SPI),以便为图形处理单元 (GPU) 和数字信号处理器 (DSP) 等计算硬件提供驱动程序。因此,NNAPI 为高性能计算提供了抽象。如果不存在硬件加速驱动程序,则 CPU 会回退。
对于那些想要在 Android 上实现机器学习模型的人来说,现在选择的框架是Tensorflow Lite。适用于 Android 的 Tensorflow Lite 是在 NNAPI 之上实现的,因此 Tensorflow 模型将在可用时获得硬件加速。 Tensorflow Lite 还进行了其他优化,以充分利用移动平台的性能。
流程如下:
- 在 Keras 上开发和训练您的模型(使用 Tensorflow 后端)
- 或使用预训练模型
- 以 Tensorflow protobuf 格式保存“冻结”模型
- 使用 Tensorflow 优化转换器将 protobuf 转换为“预解析”
tflite 模型格式
见Tensorflow Lite Developer Guide
我完成了一个使用Deeplearning4j 为Android 创建神经网络应用程序的练习。因为 Deeplearning4j 是基于 Java 的,所以我认为它会很好地匹配 Android。根据我在这方面的经验,我可以回答您的一些问题。
回答你最基本的问题:
谁能告诉我是否可以使用移动 GPU 和 mxnet 进行推理?
答案是:不。对此的解释如下。
它提到了对 BLAS 的依赖,因此它似乎在移动设备上使用 CPU。
BLAS (Basic Linear Algebraic Subprograms) 是 AI 计算的核心。由于这些复杂模型中涉及大量的数字运算,因此必须尽可能优化数学例程。 GPU 的计算能力使其成为 AI 模型的理想处理器。
MXNet 似乎可以使用 Atlas (libblas)、OpenBLAS 和 MKL。这些是基于 CPU 的库。
目前,在 GPU 上运行 BLAS 的主要(并且 - 据我所知 - 唯一)选项是专为 NVIDIA (CUDA) GPU 开发的 CuBLAS。显然,除了 CPU 库之外,MXNet 还可以使用 CuBLAS。
许多移动设备中的 GPU 是一种低功耗芯片,适用于尚无专用 BLAS 库的 ARM 架构。
我还有哪些其他选择?
只需使用 CPU。由于训练是计算密集型的,因此使用 CPU 进行推理并不是您认为的阻碍。在 OpenBLAS 中,例程是用汇编语言编写的,并针对可以运行的每个 CPU 进行手动优化。这包括 ARM。
在服务器上进行识别。在开发了另一个演示应用程序后,该应用程序将图像发送到执行识别并将结果返回到设备的服务器,我认为这种方法对用户有一些好处,例如更好的整体响应时间并且不必寻找空间来安装 100MB (!) 应用程序。
由于您还标记了 iOS,因此如果您尝试跨平台,使用 MXNet 等基于 C++ 的框架可能是最佳选择。但是他们创建一个巨大的 .cpp 文件并提供简单的本机界面的方法可能无法为您提供足够的 Android 灵活性。 Deeplearning4j 使用 JavaCPP 非常优雅地解决了这个问题,这消除了 JNI 的复杂性。