使用Qualcomm Neturalnetwork sdk。
我可以运行snpe sdk示例并更改为inception_v3模型,工作正常。
但是snpe会在execute()中阻塞ui线程;
我没办法阻止。android用户将得到糟糕的用户体验。
我尝试过:低优先级线程、作业调度程序等
当我用gpu执行snpe时,它总是阻塞ui。
如何配置snpe,android用户界面是高优先级的,snpe是低优先级的,这样我们就可以快速得到结果而不阻塞用户界面
谢谢您。
最佳答案
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的期望不会太高。
顺便说一句:我有一个假设的方案,通过分割批量操作来缓解这个问题。理论上,如果工作线程在低于50ms的操作之间睡眠20 ms,以便ui线程能够正确呈现,那么用户体验应该是可以忍受的,因为fps可以保持在15以上。我们将尝试此方案,因为此残障方案仍应比基于CPU的方案快得多。
关于android - 高通SNPE阻止UI线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49398221/