使用 Qualcomm 神经网络 SDK。我可以运行 SNPE SDK 示例并更改为 inception_v3 模型,工作正常。
但是snpe会在execute()中阻塞ui线程;
我没有办法阻止这一切。android 用户会得到糟糕的用户体验。
我尝试过:低优先级线程、作业调度程序等
当我用 GPU 执行 snpe 时,它总是阻塞 UI。
我如何配置SNPE,Android UI 是高优先级,SNPE 是低优先级,所以我们可以快速得到结果而不阻塞UI
谢谢你。
使用 Qualcomm 神经网络 SDK。我可以运行 SNPE SDK 示例并更改为 inception_v3 模型,工作正常。
但是snpe会在execute()中阻塞ui线程;
我没有办法阻止这一切。android 用户会得到糟糕的用户体验。
我尝试过:低优先级线程、作业调度程序等
当我用 GPU 执行 snpe 时,它总是阻塞 UI。
我如何配置SNPE,Android UI 是高优先级,SNPE 是低优先级,所以我们可以快速得到结果而不阻塞UI
谢谢你。
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 的期望不高。
顺便说一句:我有一个假设的方案来通过分散批量操作来缓解这个问题。理论上,如果工作线程在低于 50 毫秒的操作之间休眠 20 毫秒,以便 UI 线程可以正常渲染,那么用户体验应该是可以忍受的,因为 FPS 可以保持在 15 以上。我们会尝试这个方案,因为这个有残障的方案应该仍然比基于 CPU 的方案快得多。
您应该能够使用 AsyncTask 在后台线程上运行推理。有关此示例,请参阅 SNPE SDK 中的“ClassifyImageTask”。
对于 SNPE GPU 运行时,您可以使用低执行提示,这会将 SNPE 设置为最低 GPU 优先级。
通过设置ExecutionPriorityHint_t::Low到SNPEBuilder::setExecutionPriorityHint()