高通SNPE阻止UI线程



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

但是 SNPE 会在 execute() 中阻塞 UI 线程;

我没有办法阻止这一点。 安卓用户会得到糟糕的用户体验。

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

当我使用 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()

相关内容

  • 没有找到相关文章

最新更新