From 5204aa8fd1da75ccc052269f358178b54bc7792f Mon Sep 17 00:00:00 2001 From: Keith Davis Date: Mon, 27 Jan 2020 15:24:59 +0000 Subject: IVGCVSW-4306 Verify the tflite Yolo v3 * Added debug layer support for QSymmS8 * QSymmS8 support for workloads Signed-off-by: Keith Davis Change-Id: I51af92fadc0be290629dd9198beab5abef9e351f --- src/backends/backendsCommon/MakeWorkloadHelper.hpp | 8 +-- src/backends/backendsCommon/WorkloadData.cpp | 13 ++++- src/backends/reference/RefLayerSupport.cpp | 62 +++++++++++++--------- src/backends/reference/RefWorkloadFactory.cpp | 14 ++++- src/backends/reference/workloads/Debug.cpp | 6 +++ .../reference/workloads/RefDebugWorkload.cpp | 1 + .../reference/workloads/RefDebugWorkload.hpp | 9 ++-- .../reference/workloads/RefQuantizeWorkload.cpp | 2 +- 8 files changed, 79 insertions(+), 36 deletions(-) diff --git a/src/backends/backendsCommon/MakeWorkloadHelper.hpp b/src/backends/backendsCommon/MakeWorkloadHelper.hpp index 75db73c32f..f876c6b781 100644 --- a/src/backends/backendsCommon/MakeWorkloadHelper.hpp +++ b/src/backends/backendsCommon/MakeWorkloadHelper.hpp @@ -41,7 +41,7 @@ struct MakeWorkloadForType // Makes a workload for one the specified types based on the data type requirements of the tensorinfo. // Specify type void as the WorkloadType for unsupported DataType/WorkloadType combos. template + typename BooleanWorkload, typename Int8Workload, typename QueueDescriptorType, typename... Args> std::unique_ptr MakeWorkloadHelper(const QueueDescriptorType& descriptor, const WorkloadInfo& info, Args&&... args) @@ -58,6 +58,8 @@ std::unique_ptr MakeWorkloadHelper(const QueueDescriptorType& descrip return MakeWorkloadForType::Func(descriptor, info, std::forward(args)...); case DataType::QAsymmU8: return MakeWorkloadForType::Func(descriptor, info, std::forward(args)...); + case DataType::QSymmS8: + return MakeWorkloadForType::Func(descriptor, info, std::forward(args)...); case DataType::Signed32: return MakeWorkloadForType::Func(descriptor, info, std::forward(args)...); case DataType::Boolean: @@ -72,14 +74,14 @@ std::unique_ptr MakeWorkloadHelper(const QueueDescriptorType& descrip // Makes a workload for one the specified types based on the data type requirements of the tensorinfo. // Calling this method is the equivalent of calling the five typed MakeWorkload method with . +// FloatWorkload, Uint8Workload, NullWorkload, NullWorkload, NullWorkload>. // Specify type void as the WorkloadType for unsupported DataType/WorkloadType combos. template std::unique_ptr MakeWorkloadHelper(const QueueDescriptorType& descriptor, const WorkloadInfo& info, Args&&... args) { - return MakeWorkloadHelper( + return MakeWorkloadHelper( descriptor, info, std::forward(args)...); diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index 075884b2da..5057c8c4df 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -32,6 +32,8 @@ DataType GetBiasDataType(DataType inputDataType) return DataType::Float32; case DataType::QAsymmU8: return DataType::Signed32; + case DataType::QSymmS8: + return DataType::Signed32; case DataType::QSymmS16: return DataType::Signed32; default: @@ -418,8 +420,8 @@ void ValidatePerAxisQuantization(const TensorInfo& inputInfo, const DataType inputDataType = inputInfo.GetDataType(); const DataType outputDataType = outputInfo.GetDataType(); - const bool canHavePerAxisQuantization = - inputDataType == DataType::QAsymmU8 && inputDataType == outputDataType; + const bool canHavePerAxisQuantization = (inputDataType == DataType::QSymmS8 || + inputDataType == DataType::QAsymmU8) && inputDataType == outputDataType; if (!canHavePerAxisQuantization) { @@ -1038,6 +1040,7 @@ void AdditionQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const DataType::Float32, DataType::QAsymmU8, DataType::QSymmS16, + DataType::QSymmS8, DataType::Float16 }; @@ -1071,6 +1074,7 @@ void MultiplicationQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) c { DataType::Float32, DataType::QAsymmU8, + DataType::QSymmS8, DataType::QSymmS16, DataType::Float16 }; @@ -1178,6 +1182,7 @@ void Convolution2dQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) co DataType::Float32, DataType::QAsymmU8, DataType::QSymmS16, + DataType::QSymmS8, DataType::Float16 }; @@ -1377,6 +1382,7 @@ void ResizeQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const DataType::Float16, DataType::Float32, DataType::QAsymmU8, + DataType::QSymmS8, DataType::QSymmS16 }; @@ -1529,6 +1535,7 @@ void ConstantQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const DataType::Float16, DataType::Signed32, DataType::QAsymmU8, + DataType::QSymmS8, DataType::QSymmS16 }; @@ -1554,6 +1561,7 @@ void ReshapeQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const DataType::Float16, DataType::Signed32, DataType::QAsymmU8, + DataType::QSymmS8, DataType::QSymmS16 }; @@ -2098,6 +2106,7 @@ void MaximumQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const DataType::Float32, DataType::Signed32, DataType::QAsymmU8, + DataType::QSymmS8, DataType::QSymmS16 }; diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp index b801f70724..8410c303ae 100644 --- a/src/backends/reference/RefLayerSupport.cpp +++ b/src/backends/reference/RefLayerSupport.cpp @@ -147,9 +147,10 @@ bool RefLayerSupport::IsAdditionSupported(const TensorInfo& input0, { bool supported = true; - std::array supportedTypes = { + std::array supportedTypes = { DataType::Float32, DataType::Float16, + DataType::QSymmS8, DataType::QAsymmU8, DataType::QSymmS16 }; @@ -329,10 +330,11 @@ bool RefLayerSupport::IsConcatSupported(const std::vector inp ignore_unused(descriptor); bool supported = true; - std::array supportedTypes = + std::array supportedTypes = { DataType::Float32, DataType::Float16, + DataType::QSymmS8, DataType::QAsymmU8, DataType::QSymmS16 }; @@ -355,11 +357,12 @@ bool RefLayerSupport::IsConcatSupported(const std::vector inp bool RefLayerSupport::IsConstantSupported(const TensorInfo& output, Optional reasonIfUnsupported) const { - std::array supportedTypes = + std::array supportedTypes = { DataType::Float32, DataType::Signed32, DataType::QAsymmU8, + DataType::QSymmS8, DataType::QSymmS16 }; @@ -417,22 +420,23 @@ bool RefLayerSupport::IsConvolution2dSupported(const TensorInfo& input, bool supported = true; // Define supported types. - std::array supportedTypes = + std::array supportedTypes = { DataType::Float32, DataType::Float16, DataType::QAsymmU8, + DataType::QSymmS8, DataType::QSymmS16 }; supported &= CheckSupportRule(TypeAnyOf(input, supportedTypes), reasonIfUnsupported, - "Reference convolution2d: input is not a supported type."); + "Reference Convolution2d: input is not a supported type."); supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported, - "Reference convolution2d: output is not a supported type."); + "Reference Convolution2d: output is not a supported type."); supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported, - "Reference convolution2d: input and output types mismatched."); + "Reference Convolution2d: input and output types mismatched."); const DataType inputType = input.GetDataType(); if (inputType == DataType::QAsymmU8) @@ -447,15 +451,15 @@ bool RefLayerSupport::IsConvolution2dSupported(const TensorInfo& input, ARMNN_NO_DEPRECATE_WARN_END supported &= CheckSupportRule(TypeAnyOf(weights, supportedWeightTypes), reasonIfUnsupported, - "Reference convolution2d: weights type not supported for quantized input."); + "Reference Convolution2d: weights type not supported for quantized input."); } else { supported &= CheckSupportRule(TypeAnyOf(weights, supportedTypes), reasonIfUnsupported, - "Reference convolution2d: weights is not a supported type."); + "Reference Convolution2d: weights is not a supported type."); supported &= CheckSupportRule(TypesAreEqual(input, weights), reasonIfUnsupported, - "Reference convolution2d: input and weights types mismatched."); + "Reference Convolution2d: input and weights types mismatched."); } if (biases.has_value()) @@ -468,7 +472,7 @@ bool RefLayerSupport::IsConvolution2dSupported(const TensorInfo& input, }; supported &= CheckSupportRule(TypeAnyOf(biases.value(), biasesSupportedTypes), reasonIfUnsupported, - "Reference convolution2d: biases is not a supported type."); + "Reference Convolution2d: biases is not a supported type."); } ignore_unused(descriptor); @@ -481,23 +485,24 @@ bool RefLayerSupport::IsDebugSupported(const TensorInfo& input, { bool supported = true; - std::array supportedTypes = + std::array supportedTypes = { DataType::Float16, DataType::Float32, DataType::QAsymmU8, + DataType::QSymmS8, DataType::QSymmS16, DataType::Signed32 }; supported &= CheckSupportRule(TypeAnyOf(input, supportedTypes), reasonIfUnsupported, - "Reference debug: input type not supported"); + "Reference for Debug layer: input type not supported"); supported &= CheckSupportRule(TypeAnyOf(output, supportedTypes), reasonIfUnsupported, - "Reference debug: output type not supported"); + "Reference for Debug layer: output type not supported"); supported &= CheckSupportRule(TypesAreEqual(input, output), reasonIfUnsupported, - "Reference debug: input and output types are mismatched"); + "Reference for Debug layer: input and output types are mismatched"); return supported; } @@ -612,7 +617,10 @@ bool RefLayerSupport::IsDequantizeSupported(const TensorInfo& input, }; supported &= CheckSupportRule(TypeAnyOf(input, supportedInputTypes), reasonIfUnsupported, - "Reference dequantize: input type not supported."); + "Reference for Dequantize layer: input type not supported."); + + supported &= CheckSupportRule( TypeNotPerAxisQuantized(input), reasonIfUnsupported, + "Reference for Dequantize layer: per-axis quantized input not support ."); supported &= CheckSupportRule(TypeNotPerAxisQuantized(input), reasonIfUnsupported, "Reference dequantize: per-axis quantized input not support ."); @@ -623,10 +631,11 @@ bool RefLayerSupport::IsDequantizeSupported(const TensorInfo& input, }; supported &= CheckSupportRule(TypeAnyOf(output, supportedOutputTypes), reasonIfUnsupported, - "Reference dequantize: output type not supported."); + "Reference for Dequantize layer: output type not supported."); supported &= CheckSupportRule(ShapesAreSameTotalSize(input, output), reasonIfUnsupported, - "Reference dequantize: input and output shapes have different num total elements."); + "Reference for Dequantize layer: input/output shapes have different num total " + "elements."); return supported; } @@ -1104,9 +1113,10 @@ bool RefLayerSupport::IsMaximumSupported(const TensorInfo& input0, { bool supported = true; - std::array supportedTypes = { + std::array supportedTypes = { DataType::Float32, DataType::Float16, + DataType::QSymmS8, DataType::QAsymmU8, DataType::QSymmS16 }; @@ -1270,9 +1280,10 @@ bool RefLayerSupport::IsMultiplicationSupported(const TensorInfo& input0, { bool supported = true; - std::array supportedTypes = { + std::array supportedTypes = { DataType::Float32, DataType::Float16, + DataType::QSymmS8, DataType::QAsymmU8, DataType::QSymmS16 }; @@ -1428,8 +1439,9 @@ bool RefLayerSupport::IsQuantizeSupported(const TensorInfo& input, bool supported = true; // Define supported input types. - std::array supportedInputTypes = { - DataType::Float32, + std::array supportedInputTypes = { + DataType::QSymmS8, + DataType::Float32 }; supported &= CheckSupportRule(TypeAnyOf(input, supportedInputTypes), reasonIfUnsupported, @@ -1458,12 +1470,13 @@ bool RefLayerSupport::IsReshapeSupported(const TensorInfo& input, ignore_unused(output); ignore_unused(descriptor); // Define supported output types. - std::array supportedOutputTypes = + std::array supportedOutputTypes = { DataType::Float32, DataType::Float16, DataType::Signed32, DataType::QAsymmU8, + DataType::QSymmS8, DataType::QSymmS16 }; return CheckSupportRule(TypeAnyOf(input, supportedOutputTypes), reasonIfUnsupported, @@ -1502,10 +1515,11 @@ bool RefLayerSupport::IsResizeSupported(const TensorInfo& input, { boost::ignore_unused(descriptor); bool supported = true; - std::array supportedTypes = + std::array supportedTypes = { DataType::Float32, DataType::Float16, + DataType::QSymmS8, DataType::QAsymmU8, DataType::QSymmS16 }; diff --git a/src/backends/reference/RefWorkloadFactory.cpp b/src/backends/reference/RefWorkloadFactory.cpp index e7a9c19fc7..792bd7d3ad 100644 --- a/src/backends/reference/RefWorkloadFactory.cpp +++ b/src/backends/reference/RefWorkloadFactory.cpp @@ -24,7 +24,8 @@ template RefWorkloadFactory::MakeWorkload(const QueueDescriptorType& descriptor, const WorkloadInfo& info) const { - return MakeWorkloadHelper(descriptor, info); + return MakeWorkloadHelper + (descriptor, info); } template @@ -54,6 +55,11 @@ bool IsQSymm16(const WorkloadInfo& info) return IsDataType(info); } +bool IsQSymm8(const WorkloadInfo& info) +{ + return IsDataType(info); +} + RefWorkloadFactory::RefWorkloadFactory(const std::shared_ptr& memoryManager) : m_MemoryManager(memoryManager) { @@ -185,6 +191,10 @@ std::unique_ptr RefWorkloadFactory::CreateDebug(const DebugQueueDescr { return std::make_unique(descriptor, info); } + if (IsQSymm8(info)) + { + return std::make_unique(descriptor, info); + } if (IsDataType(info)) { return std::make_unique(descriptor, info); @@ -419,7 +429,7 @@ std::unique_ptr RefWorkloadFactory::CreatePermute(const PermuteQueueD return std::make_unique(descriptor, info); } return MakeWorkloadHelper(descriptor, info); + NullWorkload, NullWorkload, NullWorkload>(descriptor, info); } std::unique_ptr RefWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor, diff --git a/src/backends/reference/workloads/Debug.cpp b/src/backends/reference/workloads/Debug.cpp index 0f192f3ab3..49e9e02ffb 100644 --- a/src/backends/reference/workloads/Debug.cpp +++ b/src/backends/reference/workloads/Debug.cpp @@ -106,6 +106,12 @@ template void Debug(const TensorInfo& inputInfo, const std::string& layerName, unsigned int slotIndex); +template void Debug(const TensorInfo& inputInfo, + const int8_t* inputData, + LayerGuid guid, + const std::string& layerName, + unsigned int slotIndex); + template void Debug(const TensorInfo& inputInfo, const int16_t* inputData, LayerGuid guid, diff --git a/src/backends/reference/workloads/RefDebugWorkload.cpp b/src/backends/reference/workloads/RefDebugWorkload.cpp index 59b836da09..2f0b4276c0 100644 --- a/src/backends/reference/workloads/RefDebugWorkload.cpp +++ b/src/backends/reference/workloads/RefDebugWorkload.cpp @@ -48,6 +48,7 @@ template class RefDebugWorkload; template class RefDebugWorkload; template class RefDebugWorkload; template class RefDebugWorkload; +template class RefDebugWorkload; template class RefDebugWorkload; } // namespace armnn diff --git a/src/backends/reference/workloads/RefDebugWorkload.hpp b/src/backends/reference/workloads/RefDebugWorkload.hpp index 58e4464b00..a15a863892 100644 --- a/src/backends/reference/workloads/RefDebugWorkload.hpp +++ b/src/backends/reference/workloads/RefDebugWorkload.hpp @@ -37,10 +37,11 @@ private: DebugCallbackFunction m_Callback; }; -using RefDebugFloat16Workload = RefDebugWorkload; -using RefDebugFloat32Workload = RefDebugWorkload; -using RefDebugQAsymm8Workload = RefDebugWorkload; -using RefDebugQSymm16Workload = RefDebugWorkload; +using RefDebugFloat16Workload = RefDebugWorkload; +using RefDebugFloat32Workload = RefDebugWorkload; +using RefDebugQAsymm8Workload = RefDebugWorkload; +using RefDebugQSymm16Workload = RefDebugWorkload; +using RefDebugQSymm8Workload = RefDebugWorkload; using RefDebugSigned32Workload = RefDebugWorkload; } // namespace armnn diff --git a/src/backends/reference/workloads/RefQuantizeWorkload.cpp b/src/backends/reference/workloads/RefQuantizeWorkload.cpp index 31534abe3e..ab2ee7fc4e 100644 --- a/src/backends/reference/workloads/RefQuantizeWorkload.cpp +++ b/src/backends/reference/workloads/RefQuantizeWorkload.cpp @@ -50,7 +50,7 @@ void RefQuantizeWorkload::Execute() const } case DataType::QSymmS8: { - QuantizeImpl(input, output, m_NumElements, m_Scale, m_Offset); + QuantizeImpl(input, output, m_NumElements, m_Scale, 0); break; } case DataType::QSymmS16: -- cgit v1.2.1