使用Qualcomm NeturalNetwork SDK。 我可以运行SNPE SDK示例并更改为inception_v3模型,工作正常。
但是snpe会在execute();
中阻塞ui线程我无法阻止这一点。 android用户将获得糟糕的用户体验。
我尝试过:低优先级线程,作业调度程序等
当我用GPU执行snpe时,它总是阻止UI。
我如何配置SNPE,Android UI是高优先级,SNPE是较低优先级,因此我们可以快速获得结果并且不会阻止UI
谢谢。答案 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()