【问题标题】:Qualcomm SNPE block the UI ThreadQualcomm SNPE 阻塞 UI 线程
【发布时间】:2018-03-21 04:30:26
【问题描述】:

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

但是snpe会在execute()中阻塞-ui线程;

我没有办法阻止它。 android 用户会得到糟糕的用户体验。

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

当我用 GPU 执行 snpe 时,它​​总是阻塞 UI。

如何配置SNPE,Android UI 是高优先级,SNPE 是低优先级,所以我们可以快速得到结果而不阻塞UI

谢谢。

【问题讨论】:

    标签: android deep-learning qualcomm snpe


    【解决方案1】:

    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 的操作之间休眠 20ms 以便 UI 线程可以正常渲染,那么用户体验应该是可以忍受的,因为 FPS 可以保持在 15 以上。我们会尝试这个方案,因为这个有残障的方案应该仍然比基于 CPU 的方案快得多。

    【讨论】:

    • DSP方案只有高通? Google Pixel2 没有 SNPE GPU 和 DSP 支持,但是是 835 CPU,没有关于 NN-API 或 Tensorflow-lite(如果你是谷歌)中哪些硬件支持非 CPU 模式的文档,所以我无法制作真正的 CNN 应用程序安卓。你有适用于 Android 手机的真正 GPU 解决方案/github 参考吗? (是 Open CL 吗?)
    【解决方案2】:

    您应该能够使用 AsyncTask 在后台线程上运行推理。有关此示例,请参见 SNPE SDK 中的“ClassifyImageTask”。

    【讨论】:

    • 这不起作用,snpe 使用 GPU 资源,我可以在任何线程中运行 SNPE 但它仍然阻塞 ui,我已将线程设置为低优先级或使用作业调度程序,根本不工作。
    【解决方案3】:

    对于 SNPE GPU 运行时,您可以使用 low 执行提示,这会将 SNPE 设置为最低 GPU 优先级。

    通过设置 ExecutionPriorityHint_t::LowSNPEBuilder::setExecutionPriorityHint()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      相关资源
      最近更新 更多