【发布时间】:2020-06-19 09:03:42
【问题描述】:
我根据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-reference等主要操作,NNAPI的CPU实现,作为fallback执行。
消息如下。
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 或 false)让 nnapi-reference 作为后备工作。
请多多指教!
【问题讨论】:
标签: tensorflow-lite nnapi huawei-developers