Я успешно преобразовал модель TensorFlow в модель float16 TensorFlow Lite в соответствии с квантованием float16 после обучения .
Ниже представлена диаграмма преобразованной модели.
И я успешно запустил его на 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 работает как резерв.
Пожалуйста, дайте мне совет!