1

我根据Post-training float16 quantization成功将 TensorFlow 模型转换为 TensorFlow Lite float16 模型。

下图是转换后的模型图。 tflite模型

我通过我的 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 作为后备工作。

请给我建议!

4

1 回答 1

1

我发现它不能在 NPU 上运行的原因如下。

  1. float16 量化可以防止它。

  2. 不支持的操作不仅可能导致操作的 CPU 回退,还可能导致整个模型编译失败。

一个更简单的模型在 NPU 上运行,无需更改代码。

于 2020-06-23T01:10:18.347 回答