From dedac5053f1ca2d6a7820e330714e50d2d724cee Mon Sep 17 00:00:00 2001 From: Marat Dukhan Date: Wed, 27 May 2020 21:41:37 -0700 Subject: [PATCH] Fix edge case bug in handling FP16 weights in XNNPACK delegate Quasi-static tensors may become subgraph outputs after partitioning; we need to explicitly exclude them from outputs and treat as static tensors. PiperOrigin-RevId: 313522428 Change-Id: I621cb575b52caa59910a281078c3c505e796880f --- .../lite/delegates/xnnpack/xnnpack_delegate.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tensorflow/lite/delegates/xnnpack/xnnpack_delegate.cc b/tensorflow/lite/delegates/xnnpack/xnnpack_delegate.cc index 32fcbee4c22..9cbdea60706 100644 --- a/tensorflow/lite/delegates/xnnpack/xnnpack_delegate.cc +++ b/tensorflow/lite/delegates/xnnpack/xnnpack_delegate.cc @@ -101,9 +101,15 @@ class Subgraph { const std::unordered_set inputs( ¶ms->input_tensors->data[0], ¶ms->input_tensors->data[params->input_tensors->size]); - const std::unordered_set outputs( - ¶ms->output_tensors->data[0], - ¶ms->output_tensors->data[params->output_tensors->size]); + std::unordered_set outputs; + for (int o = 0; o < params->output_tensors->size; o++) { + const int output_tensor_idx = params->output_tensors->data[o]; + // Exclude quasi-static tensors which may have become subgraph outputs + // after partitioning. + if (delegate->static_unpacked_data_map_.count(output_tensor_idx) == 0) { + outputs.insert(output_tensor_idx); + } + } std::unordered_set externals(outputs); TfLiteIntArray* execution_plan;