我想在移动设备上运行神经网络。目前,我正在探索 Mxnet ( http://mxnet.io ) 框架来部署它(仅用于推理)。由于我关心移动设备上的执行时间性能,我想知道它是否在手机(Android/iOS)的 GPU 上运行。文档中提到它可以使用多个 CPU 以及 GPU 进行训练,但尚不清楚它是否可以在手机上使用 GPU 进行推理。它提到了对 BLAS 的依赖,因此它似乎在移动设备上使用 CPU。谁能告诉我是否可以使用带有 mxnet 的移动 GPU 进行推理?如果没有,我的其他选择是什么?
1 回答
更新:神经网络 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 Optimizing Converter 将 protobuf 转换为“预解析”
tflite
模型格式
我进行了使用Deeplearning4j为 Android 创建神经网络应用程序的练习。因为 Deeplearning4j 是基于 Java 的,所以我认为它会很好地匹配 Android。根据我在这方面的经验,我可以回答你的一些问题。
要回答您最基本的问题:
谁能告诉我是否可以使用带有 mxnet 的移动 GPU 进行推理?
答案是:不。对此的解释如下。
它提到了对 BLAS 的依赖,因此它似乎在移动设备上使用 CPU。
BLAS(基本线性代数子程序)是人工智能计算的核心。由于这些复杂模型中涉及大量的数字运算,因此必须尽可能优化数学例程。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 的复杂性。