我根据Post-training float16 quantization成功将 TensorFlow 模型转换为 TensorFlow Lite float16 模型。
我通过我的 C++ 代码在 MatePad Pro(Kirin 990) 上成功运行了它。
我专门为 NNAPI 写的是 SetAllowFp16PrecisionForFp32 和 AllocateTensors 之前的 UseNNAPI。
m_interpreter->SetAllowFp16PrecisionForFp32(true);
m_interpreter->UseNNAPI(true);
m_interpreter->AllocateTensors();
但性能并不好。
我查看了日志adb logcat
,发现armnn和liteadapter,我认为是华为的NNAPI驱动,不支持CONV_2D和NNAPI的CPU实现的nnapi-reference等主要操作作为回退执行。
消息如下所示。
AndroidNN: AnnOpConvParser::isSupport1_1(280)::"Conv para is model Input err"
为什么 NNAPI 驱动程序除了 nnapi-reference 不支持操作?
我该如何解决?
我想知道转换后的模型中的 Dequantize 操作不应该存在,并且每个操作都应该有 float16 参数。
我不知道我的猜测是否正确,即使它是正确的,我也不知道要消除 Dequantize 操作。
(当然,我尝试了 float32 转换模型。float32 模型的输出在 SetAllowFp16PrecisionForFp32(false) 和 SetAllowFp16PrecisionForFp32(true) 之间有很大不同。
所以我得出结论,你需要对 NNAPI 进行 float16 量化。)
以下是观察总结。
假设 setUseNNAPI(true),
- float32 模型和 SetAllowFp16PrecisionForFp32(true) 让 liteadapter 工作但输出错误。
- float32 模型和 SetAllowFp16PrecisionForFp32(false) 让 armnn 作为后备工作。
- float16 模型和 SetAllowFp16PrecisionForFp32(true or false) 让 nnapi-reference 作为后备工作。
请给我建议!