【问题标题】:How can I let Kirin 990's NPU work on TensorFlow Lite?如何让 Kirin 990 的 NPU 在 TensorFlow Lite 上运行?
【发布时间】: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


    【解决方案1】:

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

    1. float16 量化可以防止它。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 1970-01-01
      • 2020-04-21
      相关资源
      最近更新 更多