Qualcomm SNPE блокирует поток пользовательского интерфейса
Используя Qualcomm NeturalNetwork SDK. я могу запустить пример SNPE SDK и перейти на модель inception_v3, работает отлично.
но snpe будет блокировать поток в execute();
У меня нет возможности это остановить. пользователь Android получит плохой UX.
Я попробовал: поток с низким приоритетом, планировщик заданий и т. д.
когда я выполняю snpe с GPU, он всегда блокирует пользовательский интерфейс.
Как я могу настроить SNPE, пользовательский интерфейс Android имеет высокий приоритет, SNPE является более низким приоритетом, поэтому мы можем быстро получить результат и не блокировать пользовательский интерфейс
благодарю вас.
3 ответа
Массовая операция на GPU блокирует рендеринг новых кадров. Трудно решить эту проблему, и она на самом деле не имеет ничего общего с SNPE, потому что мы можем воспроизвести эту проблему, используя реализацию не-SNPE (внутренняя структура на основе OpenCL). Вы можете просто изменить размещение тензорных операций, чтобы смягчить эту проблему. Например, вы можете выполнять вычисления на процессоре (например, tenorflow mobile), и пользовательский интерфейс может отображаться правильно, в то время как он значительно медленнее и требует больше ресурсов процессора.
Мое объяснение можно визуализировать с помощью параметров разработчика на устройстве. Для получения дополнительной информации перейдите по этой ссылке: https://developer.android.com/studio/profile/inspect-gpu-rendering. Вы увидите, что несколько операций "Буфер обмена 1" могут занимать необычно большие интервалы.
Лучшее решение - выполнить вычисления на DSP с квантованной сетью, но есть много ограничений на доступные операторы и память.
Возможно, что Android 8.1 мог бы решить эти проблемы с помощью абстракции NN-API и планирования ресурсов GPU на уровне операционной системы, но я не ожидал бы слишком многого от Google.
Кстати, у меня есть гипотетическая схема, чтобы смягчить эту проблему путем фрагментации массовых операций. Теоретически, если рабочий поток будет спать в течение 20 мс между операциями менее 50 мс, чтобы поток пользовательского интерфейса мог правильно отображаться, взаимодействие с пользователем должно быть терпимым, поскольку FPS может поддерживаться выше 15. Мы попробуем эту схему, потому что эта схема с недостатками все равно должно быть намного быстрее, чем схемы, основанные на CPU.
Для времени выполнения SNPE GPU вы можете использовать подсказку низкого выполнения, которая установит SNPE на самый низкий приоритет GPU.
Путем установки ExecutionPriorityHint_t::Low через SNPEBuilder::setExecutionPriorityHint()
Вы должны быть в состоянии использовать AsyncTask для запуска вашего вывода в фоновом потоке. Посмотрите 'ClassifyImageTask' в SNPE SDK для примера этого.