21 void UpdateOutputSlotToFp32(OutputSlot& outputSlot)
23 const TensorInfo& origTensorInfo = outputSlot.GetTensorInfo();
24 TensorInfo newTensorInfo(origTensorInfo);
26 outputSlot.SetTensorInfo(newTensorInfo);
29 void ChangeOutputBf16ToFp32(Layer& layer)
31 for (
auto&& outputSlot = layer.BeginOutputSlots(); outputSlot != layer.EndOutputSlots(); ++outputSlot)
35 UpdateOutputSlotToFp32(*outputSlot);
40 void ChangeOutputFp16ToFp32(Layer& layer)
42 for (
auto&& outputSlot = layer.BeginOutputSlots(); outputSlot != layer.EndOutputSlots(); ++outputSlot)
46 UpdateOutputSlotToFp32(*outputSlot);
55 bool expectCorrectInputType)
57 std::vector<ConvertBf16ToFp32Layer*> convertLayers;
63 bool allowInsert =
true;
64 if (expectCorrectInputType)
67 OutputSlot* connectedOutputSlot = inputSlot->GetConnectedOutputSlot();
74 const std::string name =
75 std::string(
"convert_bf16_to_fp32-" + std::to_string(inputSlot->GetSlotIndex()) +
"-") +
85 convertLayers.emplace_back(convertLayer);
94 bool expectCorrectInputType)
96 std::vector<ConvertFp32ToBf16Layer*> convertLayers;
102 bool allowInsert =
true;
107 && inputSlot->GetSlotIndex() == 2)
112 if (expectCorrectInputType)
115 OutputSlot* connectedOutputSlot = inputSlot->GetConnectedOutputSlot();
122 const std::string name =
123 std::string(
"convert_fp32_to_bf16-" + std::to_string(inputSlot->GetSlotIndex()) +
"-") +
133 convertLayers.emplace_back(convertLayer);
137 return convertLayers;
142 bool expectCorrectInputType)
144 std::vector<ConvertFp16ToFp32Layer*> convertLayers;
150 bool allowInsert =
true;
151 if (expectCorrectInputType)
154 OutputSlot* connectedOutputSlot = inputSlot->GetConnectedOutputSlot();
161 const std::string name =
162 std::string(
"convert_fp16_to_fp32-" + std::to_string(inputSlot->GetSlotIndex()) +
"-") +
172 convertLayers.emplace_back(convertLayer);
176 return convertLayers;
183 std::vector<ConvertFp32ToBf16Layer*> convertLayers;
184 convertLayers.reserve(numOutputSlots);
187 ChangeOutputBf16ToFp32(layer);
190 for (
unsigned int slotIndex = 0u; slotIndex < numOutputSlots; ++slotIndex)
195 const std::string name =
196 std::string(
"convert_fp32_to_bf16-" + std::to_string(slotIndex) +
"-") + layer.
GetName();
205 convertLayers.emplace_back(convertLayer);
209 return convertLayers;
216 std::vector<ConvertFp32ToFp16Layer*> convertLayers;
217 convertLayers.reserve(numOutputSlots);
220 ChangeOutputFp16ToFp32(layer);
223 for (
unsigned int slotIndex = 0u; slotIndex < numOutputSlots; ++slotIndex)
228 const std::string name =
229 std::string(
"convert_fp32_to_fp16-" + std::to_string(slotIndex) +
"-") + layer.
GetName();
238 convertLayers.emplace_back(convertLayer);
242 return convertLayers;
247 std::vector<DebugLayer*> debugLayers;
251 uint32_t outputSlotIdx = 0;
254 const std::string debugName = std::string(
"DebugLayerAfter") + layer.
GetNameStr() +
"_" +
255 std::to_string(outputSlotIdx);
269 debugLayers.emplace_back(debugLayer);
286 if (constantLayerInfo.IsConstant() && constantLayerInfo.GetDataType() ==
DataType::BFloat16)
288 std::vector<float> newValues(constantLayerInfo.GetNumElements());
290 auto weightLayer = PolymorphicDowncast<ConstantLayer*>(
293 weightLayer->m_LayerOutput->GetConstTensor<
BFloat16>(),
294 constantLayerInfo.GetNumElements(),
301 weightLayer->GetOutputSlot(0).SetTensorInfo(newInfo);
308 auto& conversionLayerOutputSlot =
310 auto& conversionLayerInputSlot =
312 actualInputOutputSlot->Disconnect(conversionLayerInputSlot);
313 conversionLayerOutputSlot.Disconnect(layer->
GetInputSlot(0));
std::vector< InputSlot >::iterator EndInputSlots()
std::vector< ConvertFp32ToFp16Layer * > InsertConvertFp32ToFp16LayersAfter(Graph &graph, Layer &layer)
std::vector< ConvertFp16ToFp32Layer * > InsertConvertFp16ToFp32LayersBefore(Graph &graph, Layer &layer, bool expectCorrectInputType)
unsigned int GetNumInputSlots() const override
Returns the number of connectable input slots.
CPU Execution: Reference C++ kernels.
static void ConvertBFloat16ToFloat32(const void *srcBFloat16Buffer, size_t numElements, float *dstFloat32Buffer)
This layer converts data type Float 16 to Float 32.
This layer converts data type BFloat16 to Float32.
Copyright (c) 2021 ARM Limited and Contributors.
void SetBackendId(const BackendId &id)
unsigned int GetNumOutputSlots() const override
Returns the number of connectable output slots.
std::vector< InputSlot >::iterator BeginInputSlots()
const InputSlot & GetInputSlot(unsigned int index) const override
Get a const input slot handle by slot index.
std::vector< DebugLayer * > InsertDebugLayerAfter(Graph &graph, Layer &layer, bool toFile)
DataType GetDataType() const
A tensor defined by a TensorInfo (shape and data type) and an immutable backing store.
bool RevertConstantWeightsToFP32(Layer *layer)
const std::string & GetNameStr() const
LayerType GetType() const override
Returns the armnn::LayerType of this layer.
std::vector< ConvertBf16ToFp32Layer * > InsertConvertBf16ToFp32LayersBefore(Graph &graph, Layer &layer, bool expectCorrectInputType)
virtual const IConnectableLayer & GetOwningIConnectableLayer() const =0
This layer visualizes the data flowing through the network.
#define ARMNN_ASSERT(COND)
void SetDataType(DataType type)
std::vector< ConvertFp32ToBf16Layer * > InsertConvertFp32ToBf16LayersAfter(Graph &graph, Layer &layer)
This layer converts data type Float 32 to Float 16.
std::vector< OutputSlot >::iterator BeginOutputSlots()
std::vector< ConvertFp32ToBf16Layer * > InsertConvertFp32ToBf16LayersBefore(Graph &graph, Layer &layer, bool expectCorrectInputType)
void SetTensorInfo(const TensorInfo &tensorInfo) override
virtual const IInputSlot & GetInputSlot(unsigned int index) const =0
Get a const input slot handle by slot index.
void SetConstant(const bool IsConstant=true)
Marks the data corresponding to this tensor info as constant.
std::vector< OutputSlot >::iterator EndOutputSlots()
const OutputSlot & GetOutputSlot(unsigned int index=0) const override
Get the const output slot handle by slot index.
virtual const TensorInfo & GetTensorInfo() const =0
virtual const IOutputSlot & GetOutputSlot(unsigned int index) const =0
Get the const output slot handle by slot index.
const char * GetName() const override
Returns the name of the layer.
This layer converts data type Float32 to BFloat16.
LayerT * InsertNewLayer(InputSlot &insertBefore, Args &&... args)
Inserts a new layer between the output slot currently connected to insertBefore and insertBefore itse...
const TensorInfo & GetTensorInfo() const override