移动 GPU 上的 Mxnet

Mxnet on mobile GPU

我想 运行 移动设备上的神经网络。目前,我正在探索用于部署它的 Mxnet (http://mxnet.io) 框架(仅用于推理)。由于我担心移动设备上的执行时间性能,我想知道它是否在移动设备的 GPU 上 运行s phones (Android/iOS)。文档中提到它可以使用多个 CPU 以及 GPU 进行训练,但目前还不清楚是否可以使用移动 phone 的 GPU 在移动设备上进行推理。它提到了对 BLAS 的依赖,因此它似乎在移动设备上使用 CPU。谁能告诉我是否可以将移动 GPU 与 mxnet 一起用于推理?如果没有,我的其他选择是什么?

更新:Neural Networks API 现在可以在 Android 设备上使用,从 API 27 (Oreo 8.1) 开始。 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 格式保存 "frozen" 模型
  • 使用 Tensorflow 优化转换器将 protobuf 转换为 "pre-parsed" tflite 模型格式

Tensorflow Lite Developer Guide


我完成了使用 Deeplearning4j 为 Android 创建神经网络应用程序的练习。因为 Deeplearning4j 基于 Java,我认为它会很适合 Android。根据我的经验,我可以回答你的一些问题。

回答你最基本的问题:

Could anyone please tell me if I can use mobile GPU with mxnet for inference?

答案是:否。对此的解释如下。

It mentions about dependency on BLAS, because of which it seems it uses CPU on mobile.

BLAS (Basic Linear Algebraic Subprograms) 是人工智能计算的核心。由于这些复杂模型涉及大量的数字计算运行,因此必须尽可能优化数学例程。 GPU 的计算能力使其成为 AI 模型的理想处理器。

看来 MXNet 可以使用 Atlas (libblas)、OpenBLAS 和 MKL。这些是基于 CPU 的库。

目前,运行在 GPU 上使用 BLAS 的主要(而且——据我所知——唯一的)选项是 CuBLAS,专为 NVIDIA (CUDA) GPU 开发。显然,除了 CPU 库之外,MXNet 还可以使用 CuBLAS。

许多移动设备中的 GPU 是一种低功耗芯片,适用于 ARM 架构,但还没有专用的 BLAS 库。

what are my other options?

  • 就用 CPU 吧。由于这是计算量极大的训练,因此使用 CPU 进行推理并不是您想象的那样。在 OpenBLAS 中,例程是用汇编编写的,并针对它可以 运行 的每个 CPU 进行了手动优化。这包括 ARM。

  • 在服务器端进行识别。在开发了另一个将图像发送到执行识别的服务器并将结果返回到设备的演示应用程序之后,我认为这种方法对用户有一些好处,例如更好的整体响应时间和不必查找 space安装一个 100MB(!) 的应用程序。

由于您还标记了 iOS,如果您尝试跨平台,使用基于 C++ 的框架(如 MXNet)可能是最佳选择。但是他们创建一个巨大的 .cpp 文件并提供简单的本机界面的方法可能无法为 Android 提供足够的灵活性。 Deeplearning4j 通过使用 JavaCPP 非常优雅地解决了这个问题,它消除了 JNI 的复杂性。