当前位置: 首页 > 知识库问答 >
问题:

TensorFlow Lite GPU Compute比CPU Compute慢得多

田向荣
2023-03-14

我目前正在将一个模型从TensorFlow转换为TensorFlow Lite。通过首先创建一个检查点和一个保存的失重图(.pbtxt),然后使用freeze\u graph()函数将模型冻结为具有图权重的.pb,最后在冻结的模型文件上运行tflite\u convert命令,我将模型从常规TF1.x会话转换为.tflite文件。在此过程中没有量化-保留了浮动。在那之后,我把模型放进Android Studio,用Adreno 506 GPU在我的摩托罗拉Moto G7电源上运行。

然而,我的原始模型和TF Lite正在运行的模型之间有两个主要区别。在TF-Lite上,我的推理精度大约降低了2%(我目前正在研究这个问题),GPU计算比我手机上的CPU计算慢得多。在计算机上,GPU计算大大加快了推理速度,但在我的手机上,GPU上的推理速度比CPU慢约30倍。

我已经看到我的手机目前运行Android9可能有问题,因为它只支持大约30个NNAPI操作,但Android10支持大约100个(视频:@6:19),但还没有看到关于GPU委托的类似情况。我的模型只是一个隐藏层大小为200的简单MLP,我看不到它的简单操作不被支持并导致CPU-GPU操作切换滞后。

我的输入数组的大小为[N]x[384],并输出一个大小为[N]x[1]的数组,其中N是我希望在给定时间输入的384大小的输入数。对于我输入的所有输入数组,N都在400-800之间,但是我试着用更大的N来看看我注意到的速度减慢是否是由于在运行GPU推断时创建了代理内核。对于大n,GPU的推理时间接近CPU的推理时间,这让我认为GPU代理可能只是在我手机的CPU上进行计算。

以下是与n大小相比的CPU/GPU时序的一些示例:

N = 500
CPU: 21ms
GPU: 601ms

N = 5,000
CPU: 454ms
GPU: 1004ms

N = 10,000
CPU: 949ms
GPU: 1490ms

请注意,GPU时间似乎始终比CPU时间慢480毫秒,这让我认为480毫秒用于委托内核创建,最终只是完全在CPU上运行推理。

我正在使用以下代码创建GPU委托:

    GpuDelegate delegate = new GpuDelegate();
    Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);

使用以下代码创建并运行我的解释器:

    Interpreter tfliteGPU = new Interpreter(loadedFile, options);
    tfliteGPU.run(inputArray, outputArray);

我将TF Lite Nightly 0.0.0用于TF Lite GPU和TF Lite Base:

    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'
    implementation 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly'

为什么会这样?感谢任何帮助!

共有1个答案

阎辰钊
2023-03-14

使用基准测试应用程序检查您的模型,无论所有操作是否都在GPU上运行,问题可能是模型回到了CPU,这会消耗处理时间。

 类似资料:
  • 我正在使用mongoose来计算匹配某个查询的文档数量。此查询的索引为: Mongo版本为3.2,收藏文档数量约为175万。 需要2分多钟。但如果我这么做了: 然后大约需要2.5秒。 我做错什么了吗?我能做些什么来加快速度吗? 编辑:解释日志。 计数: 为了找到。

  • 我刚刚实现了基本的opengl渲染到我的pyplay应用程序中,认为硬件加速会使程序运行得更快。相反,它要慢得多。 看起来问题是绘图功能。 这是我的opengl绘图功能 我的分析器为draw函数提供了什么 我的分析器文本的其余部分:(1个月后到期) http://pastebin.com/ApfiCQzw 我的源代码 https://bitbucket.org/claysmithr/warbots

  • 问题内容: 我正在重写我的一个Android应用程序以利用NDK,并且它每次要做的第一件事之一是打开一个1.5MB的文本文件(大约15万行),并将每一行放入数据中结构体。当我使用Java的BufferedReader.readLine()进行此操作时,从SD卡读取文件大约需要2.5秒。这是我用于此的代码: 将C 与ifstream一起使用需要更长的时间…对于同一文件大约需要3分钟。这是我在C 中使

  • 问题内容: 我正在使用bigquery.go库。 在调查某些性能时,我发现我的导出(从.csv到GCS)作业(仅导出作业)从客户端启动平均需要60秒,而从WebGUI启动的同一作业大约需要20秒。这可能是什么原因? 代码如下: 问题答案: WEB UI通常具有轮询机制来检查作业何时完成,因此您可能会看到更长的时间。通常,导出到GCS的文件在WebUI中显示的时间早于作业实际完成的时间。 为了确保并

  • 问题内容: 我有一个简单的任务:计算每个字母在一个字符串中出现的次数。我已经使用了它,但是在一个论坛上我看到了使用/比每个字母都要慢得多的信息。我认为它只能在字符串中进行一次遍历,而解决方案则必须遍历该字符串四次(在这种情况下)。为什么这么慢? 问题答案: 允许您计算任何可哈希对象,而不仅仅是子字符串。两种解决方案都是-time。您的测量结果表明,迭代和散列单个字符的开销大于运行4倍。 可以 使用

  • 下面的代码将简单的值持有者映射到一个对象,它在Java中的运行速度比使用XCode 7 beta3“最快、积极的优化[-ofast]”的Objective-C快15倍以上。在Java中,我可以获得超过280m/sec的查找,但在objc示例中只有大约19m。(我在这里发布了相应的Java代码,因为这是作为一个Swift比较开始的:Swift Dictionary即使经过优化也很慢:是否不断保留/发