Как я могу позволить NPU Kirin 990 работать на TensorFlow Lite? - PullRequest
0 голосов
/ 19 июня 2020

Я успешно преобразовал модель TensorFlow в модель float16 TensorFlow Lite в соответствии с квантованием float16 после обучения .

Ниже представлена ​​диаграмма преобразованной модели. tflite model

И я успешно запустил его на MatePad Pro (Kirin 990) с помощью моего кода C ++.

Специально для NNAPI я написал SetAllowFp16PrecisionForFp32 и UseNNAPI перед AllocateTensors .

m_interpreter->SetAllowFp16PrecisionForFp32(true);
m_interpreter->UseNNAPI(true);
m_interpreter->AllocateTensors();

Но производительность невысока.

Я проверил журналы по adb logcat и обнаружил, что и armnn, и liteadapter, которые я считаю драйвером NNAPI от Huawei, не поддерживают основные такие операции, как CONV_2D и nnapi-reference, которые являются реализацией NNAPI в ЦП, выполняются как резервные.

Сообщения, как показано ниже.

AndroidNN: AnnOpConvParser::isSupport1_1(280)::"Conv para is model Input err"

Почему драйверы NNAPI, кроме nnapi-reference не поддерживает операции?

И как я могу это исправить?

Интересно, что операций деквантования в преобразованной модели не должно быть, и каждая операция должна иметь параметры float16.

Я не знаю, что моя догадка верна, и хотя она верна, я понятия не имею, как исключить операции деквантования.

(И, конечно, я попробовал float32 conv rted модель. Результаты модели float32 сильно различались между SetAllowFp16PrecisionForFp32 (false) и SetAllowFp16PrecisionForFp32 (true).

Итак, я пришел к выводу, что вам нужно квантование float16 для NNAPI.)

Ниже приводится краткое изложение наблюдений.

Предполагая, что setUseNNAPI (true),

  • модель float32 и SetAllowFp16PrecisionForFp32 (true) позволяют liteadapter работать, но вывод неверный.
  • модель float32 и SetAllowFp16PrecisionForFp32 (false) пусть armnn работает как резерв.
  • модель float16 и SetAllowFp16PrecisionForFp32 (true или false) пусть nnapi-reference работает как резерв.

Пожалуйста, дайте мне совет!

1 Ответ

0 голосов
/ 23 июня 2020

Я обнаружил, что причины, по которым он не работает на NPU, следующие.

  1. квантование float16 предотвращает его.

  2. Неподдерживаемая операция может вызывает не только отказ ЦП от операции, но и отказ всей компиляции модели.

Более простая модель работает на NPU без изменения кода.

...