2 votes

Qualcomm SNPE bloque le fil de l'interface utilisateur

En utilisant le Qualcomm NeturalNetwork SDK. Je peux exécuter l'exemple SNPE SDK et passer au modèle inception_v3, cela fonctionne bien.

mais snpe va bloquer le thread de l'UI dans l'execute() ;

Je n'ai aucun moyen d'arrêter ça. Les utilisateurs d'Android auront une mauvaise interface utilisateur.

J'ai essayé : fil de basse priorité, planificateur de tâches, etc.

quand j'exécute snpe avec le GPU, il bloque toujours l'interface utilisateur.

Comment puis-je configurer le SNPE, l'interface utilisateur Android est la haute priorité, le SNPE est la basse priorité, ainsi nous pouvons obtenir le résultat rapidement et ne pas bloquer l'interface utilisateur.

Merci.

2voto

Droidberg Points 21

L'opération de masse sur le GPU bloque le rendu des nouvelles images. Il est difficile de résoudre ce problème et il n'a en fait rien à voir avec la SNPE, car nous pouvons reproduire ce problème en utilisant une implémentation non-SNPE (cadre interne basé sur OpenCL). Vous pouvez simplement modifier le placement des opérations tensorielles pour atténuer ce problème. Par exemple, vous pouvez effectuer le calcul sur le CPU (par exemple : tensorflow mobile), et l'interface utilisateur peut être rendue correctement tout en étant beaucoup plus lente et gourmande en CPU.

Il est possible de visualiser mon explication par les options du développeur sur l'appareil. Pour plus d'informations, suivez ce lien : https://developer.Android.com/studio/profile/inspect-gpu-rendering#profile_rendering . Vous pourrez voir que plusieurs "Tampon d'échange" 1 les opérations pourraient prendre des intervalles anormalement longs.

La meilleure solution est de faire le calcul sur un DSP avec un réseau quantifié, mais il y a de nombreuses limitations sur les opérateurs disponibles et la mémoire.

Il est possible qu'Android 8.1 puisse résoudre ces problèmes grâce à l'abstraction NN-API et à la programmation au niveau du système d'exploitation des ressources GPU, mais je n'en attendrais pas trop de Google.

BTW : J'ai un schéma hypothétique pour atténuer ce problème en fragmentant les opérations de masse. En théorie, si le worker-thread dormait pendant 20 ms entre les opérations inférieures à 50 ms afin que le thread de l'interface utilisateur puisse effectuer le rendu correctement, l'expérience utilisateur devrait être tolérable puisque le FPS pourrait être maintenu au-dessus de 15. Nous allons essayer ce schéma parce que ce schéma handicapé devrait quand même être beaucoup plus rapide que les schémas basés sur le CPU.

0voto

Nic Dahlquist Points 490

Vous devriez pouvoir utiliser une AsyncTask pour exécuter votre inférence sur un thread d'arrière-plan. Voir "ClassifyImageTask" dans le SDK SNPE pour un exemple.

0voto

Quanlong Points 28

Pour le runtime GPU de SNPE, vous pouvez utiliser faible qui définira SNPE sur la priorité GPU la plus basse.

En fixant ExecutionPriorityHint_t::Low à travers SNPEBuilder::setExecutionPriorityHint()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X