From 57ef0088d20dd708ff92222d244ea02f1e1e5216 Mon Sep 17 00:00:00 2001 From: Narumol Prangnawarat Date: Thu, 26 Mar 2020 09:20:43 +0000 Subject: IVGCVSW-4597 Modify BF16 optimizer to Convert only inputs and weights of Convolution2d and FullyConnected layers * Add InsertConvertFp32ToBf16LayersBefore * Add ConvertWeight to ConvertFp32NetworkToBf16Impl for Conv2d and FullyConnected * Allow different input and output when input is BF16 and output is FP32 Conv2d and FullyConnected layers * Unit tests Signed-off-by: Narumol Prangnawarat Change-Id: Ic8f92ff28edcae08a72a3114a28f50c4619f919b --- src/backends/backendsCommon/WorkloadData.cpp | 33 ++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) (limited to 'src/backends/backendsCommon/WorkloadData.cpp') diff --git a/src/backends/backendsCommon/WorkloadData.cpp b/src/backends/backendsCommon/WorkloadData.cpp index 85c074a500..f968ad78f7 100644 --- a/src/backends/backendsCommon/WorkloadData.cpp +++ b/src/backends/backendsCommon/WorkloadData.cpp @@ -26,10 +26,9 @@ DataType GetBiasDataType(DataType inputDataType) { switch (inputDataType) { - case DataType::BFloat16: - return DataType::BFloat16; case DataType::Float16: return DataType::Float16; + case DataType::BFloat16: case DataType::Float32: return DataType::Float32; case DataType::QAsymmS8: @@ -1009,7 +1008,20 @@ void FullyConnectedQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) c }; ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName); - ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); + + // For FullyConnected, we allow to have BFloat16 input with Float32 output for optimization. + if (inputTensorInfo.GetDataType() == DataType::BFloat16) + { + if (outputTensorInfo.GetDataType() != DataType::BFloat16 && outputTensorInfo.GetDataType() != DataType::Float32) + { + throw InvalidArgumentException(descriptorName + ": " + " Output tensor type must be BFloat16 or Float32 " + "for BFloat16 input."); + } + } + else + { + ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); + } } void NormalizationQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const @@ -1206,7 +1218,20 @@ void Convolution2dQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) co }; ValidateDataTypes(inputTensorInfo, supportedTypes, descriptorName); - ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); + + // For Convolution2d, we allow to have BFloat16 input with Float32 output for optimization. + if (inputTensorInfo.GetDataType() == DataType::BFloat16) + { + if (outputTensorInfo.GetDataType() != DataType::BFloat16 && outputTensorInfo.GetDataType() != DataType::Float32) + { + throw InvalidArgumentException(descriptorName + ": " + " Output tensor type must be BFloat16 or Float32 " + "for BFloat16 input."); + } + } + else + { + ValidateTensorDataTypesMatch(inputTensorInfo, outputTensorInfo, descriptorName, "input", "output"); + } } void DepthwiseConvolution2dQueueDescriptor::Validate(const WorkloadInfo& workloadInfo) const -- cgit v1.2.1