Как я могу позволить NPU Kirin 990 работать на TensorFlow Lite?

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

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

И я успешно запустил его на 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. Результаты модели float32 сильно различались между SetAllowFp16PrecisionForFp32 (false) и SetAllowFp16PrecisionForFp32 (true).

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

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

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

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

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


person Yuji    schedule 19.06.2020    source источник


Ответы (1)


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

  1. Квантование float16 предотвращает это.

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

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

person Yuji    schedule 23.06.2020