Я успешно преобразовал модель 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. Результаты модели float32 сильно различались между SetAllowFp16PrecisionForFp32 (false) и SetAllowFp16PrecisionForFp32 (true).
Итак, я пришел к выводу, что вам нужно квантование float16 для NNAPI.)
Ниже приводится краткое изложение наблюдений.
Предполагая, что setUseNNAPI (true),
- Модель float32 и SetAllowFp16PrecisionForFp32 (true) позволяют liteadapter работать, но вывод неверен.
- Модель float32 и SetAllowFp16PrecisionForFp32 (false) позволяют armnn работать как резервный вариант.
- Модель float16 и SetAllowFp16PrecisionForFp32 (true или false) позволяют nnapi-reference работать как резервный вариант.
Пожалуйста, дайте мне совет!