使用高通NeturalNetwork软件开发工具包。我可以运行SNPE SDK示例并更改为inception_v3模型,运行良好。
但是snpe会在execute()中阻塞UI线程;
我没办法阻止这一切。android用户将得到糟糕的用户体验。
我尝试过:低优先级线程、作业调度程序等
当我使用GPU执行snpe时,它总是阻塞UI。
如何配置SNPE,Android UI是高优先级,SNPE是低优先级,这样我们就可以快速得到结果,而不会阻塞UI
谢谢。
发布于 2018-05-25 22:24:47
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资源的OS级调度来解决这些问题,但我对Google不会有太高的期望。
顺便说一句,我有一个假设的方案,可以通过将批量操作分段来缓解这个问题。从理论上讲,如果工作线程在低于50ms的操作之间休眠20ms,以便UI线程能够正确呈现,那么用户体验应该是可以容忍的,因为FPS可以保持在15以上。我们将尝试这种方案,因为这种有缺陷的方案仍然应该比基于CPU的方案快得多。
发布于 2018-03-24 13:51:54
您应该能够使用AsyncTask在后台线程上运行推理。请参阅SNPE SDK中的'ClassifyImageTask‘以获取此示例。
发布于 2018-07-12 22:46:57
对于SNPE GPU运行时,您可以使用low execution提示,这会将SNPE设置为最低GPU优先级。
通过SNPEBuilder::setExecutionPriorityHint()设置ExecutionPriorityHint_t::Low
https://stackoverflow.com/questions/49398221
复制相似问题