SIGSEGV в helpl-service-armnn-gpu при инициализации делегата TFLite NNAPI на устройствах конкретного поставщика (Vivo/MaC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 SIGSEGV в helpl-service-armnn-gpu при инициализации делегата TFLite NNAPI на устройствах конкретного поставщика (Vivo/Ma

Сообщение Anonymous »

Я разрабатываю собственную систему вывода C++ для Android, используя TensorFlow Lite C API. Движок скомпилирован как общая библиотека () и загружается через JNI.
Движок отлично работает на устройствах Pixel и Samsung. Однако на устройствах некоторых китайских производителей (в частности, Vivo V2419 под управлением Android 14) приложение аварийно завершает работу сразу после инициализации делегата NNAPI.
Сбой происходит не в моем коде, а внутри процесса Android Hardware Service (

Код: Выделить всё

android.hardware.neuralnetworks@aidl-service-armnn-gpu). Поскольку это ошибка сегментации на уровне драйвера (SIGSEGV), я не могу ее обнаружить с помощью стандартного блока try-catch
C++, и это приводит к сбою всего процесса моего приложения.
Соответствующие журналы (LogCat):

Код: Выделить всё

tflite  I  Created TensorFlow Lite delegate for NNAPI.

tflite  I  Initialized TensorFlow Lite runtime.

tflite  W  NNAPI SL driver did not implement SL_ANeuralNetworksDiagnostic_registerCallbacks!

TypeManager I  Failed to read /vendor/etc/nnapi_extensions_app_allowlist ; No app allowlisted for vendor extensions use.

tflite  W  NNAPI SL driver did not implement SL_ANeuralNetworksDiagnostic_registerCallbacks!

...
... After a few milliseconds
...

libc  and...tworks@aidl-service-armnn-gpu  A  Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xb4000080bd37b900 in tid 20214 (android.hardwar), pid 20202 (android.hardwar)
Если я отключу NNAPI и буду работать строго на процессоре (

Код: Выделить всё

TfLiteInterpreterOptionsSetNumThreads
), приложение отлично работает на затронутом устройстве. Модель представляет собой стандартную модель Quantized TFLite, которая работает на других устройствах, и приложение имеет стандартные разрешения.
Вот код, который я использую для инициализации NNAPI:

Код: Выделить всё

options = TfLiteInterpreterOptionsCreate();

// types must be recognized
TfLiteNnapiDelegateOptions nnapiOpts = TfLiteNnapiDelegateOptionsDefault();
nnapiOpts.allow_fp16 = 1;

nnapiDelegate = TfLiteNnapiDelegateCreate(&nnapiOpts);

if (nnapiDelegate) {
TfLiteInterpreterOptionsAddDelegate(options, nnapiDelegate);
interpreter = TfLiteInterpreterCreate(model, options);

if (interpreter && TfLiteInterpreterAllocateTensors(interpreter) == kTfLiteOk) {
LOGI("Using NNAPI delegate");
valid = true;
return;
}
LOGE("NNAPI Failed");
if (interpreter) TfLiteInterpreterDelete(interpreter);
interpreter = nullptr;
TfLiteNnapiDelegateDelete(nnapiDelegate);
nnapiDelegate = nullptr;
Поскольку это сбой на уровне драйвера на ПЗУ/оборудовании конкретного поставщика, который невозможно обнаружить с помощью try-catch:
Существует ли рекомендуемый способ безопасного использования NNAPI на Android без сбоя основного процесса? Известны ли конкретные флаги (например, отключение определенных ускорителей), которые уменьшают сбои в драйверах Armnn-GPU? Если у вас есть другая информация по этой проблеме, просветите.
Окружающая среда
  • NDK: r26b / r29
  • TensorFlow Lite: 2.16 (C API)
  • Устройство (для воспроизведения сбоя): Vivo V2419 (графический процессор Mali-G57)
  • ОС: Android 14


Подробнее здесь: https://stackoverflow.com/questions/798 ... ate-on-spe
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»