Qualcomm SNPE阻止UI线程

时间:2018-03-21 04:30:26

标签: android deep-learning qualcomm snpe

使用Qualcomm NeturalNetwork SDK。 我可以运行SNPE SDK示例并更改为inception_v3模型,工作正常。

但是snpe会在execute();

中阻塞ui线程

我无法阻止这一点。 android用户将获得糟糕的用户体验。

我尝试过:低优先级线程,作业调度程序等

当我用GPU执行snpe时,它总是阻止UI。

我如何配置SNPE,Android UI是高优先级,SNPE是较低优先级,因此我们可以快速获得结果并且不会阻止UI

谢谢。

3 个答案:

答案 0 :(得分:2)

GPU上的批量操作会阻止新帧的渲染。解决这个问题很困难,它实际上与SNPE无关,因为我们可以使用非SNPE实现(内部基于OpenCL的框架)重现这个问题。您只需更改张量操作的位置即可缓解此问题。例如,您可以在CPU上进行计算(例如:tensorflow mobile),并且可以正常呈现UI,同时速度更慢且占用CPU更多。

可以通过设备上的开发者选项可视化我的解释。有关详细信息,请访问以下链接:https://developer.android.com/studio/profile/inspect-gpu-rendering#profile_rendering。您将能够看到几个"交换缓冲区" 1操作可能需要非常长的时间间隔。

最好的解决方案是使用量化网络对DSP进行计算,但是对可用的运算符和内存有很多限制。

Android 8.1可以通过NN-API抽象和GPU资源的操作系统级别调度来解决这些问题,但我不会对Google产生过多的期望。

BTW:我有一个假设的方案,通过分割批量操作来缓解这个问题。理论上,如果工作线程在50ms以下的操作之间休眠20ms,以便UI线程可以正确呈现,那么用户体验应该是可以忍受的,因为FPS可以保持在15以上。我们将尝试这种方案,因为这残疾人计划应该比基于CPU的计划快得多。

答案 1 :(得分:0)

您应该能够使用AsyncTask在后台线程上运行推理。请参阅' ClassifyImageTask'在SNPE SDK中有一个例子。

答案 2 :(得分:0)

对于SNPE GPU运行时,您可以使用 low 执行提示,它将SNPE设置为最低GPU优先级。

通过设置 ExecutionPriorityHint_t :: Low 通过SNPEBuilder::setExecutionPriorityHint()