26 #include <mapbox/variant.hpp> 34 using TContainer = mapbox::util::variant<std::vector<float>, std::vector<int>, std::vector<unsigned char>>;
48 delete PolymorphicDowncast<NetworkQuantizer*>(quantizer);
53 const Graph& graph = m_InputNetwork->pNetworkImpl->GetGraph();
58 VisitLayers(inputLayers, overrideInputRangeVisitor);
71 m_Ranges.SetDynamicMode(
true);
89 std::vector<BackendId> backends = {
"CpuRef"};
92 m_Runtime->GetDeviceSpec(),
95 m_Runtime->LoadNetwork(m_NetworkId, std::move(optimizedNet));
104 if (m_RefineCount == 0)
106 m_Ranges.ResetMinMax(guid, slotIndex, minMax.first, minMax.second);
112 m_Ranges.RefineMin(guid, slotIndex, minMax.first);
113 m_Ranges.RefineMax(guid, slotIndex, minMax.second);
117 m_Runtime->RegisterDebugCallback(m_NetworkId, rangeTrackerCallback);
121 std::vector<armnn::BindingPointInfo> outputBindings;
122 auto outputLayers = m_DynamicQuantizationStrategy.value().GetOutputLayers();
123 std::vector<TContainer> outputVectors;
124 for (
auto outputLayerBindingId : outputLayers)
126 auto outputTensorInfo = m_Runtime->GetOutputTensorInfo(m_NetworkId, outputLayerBindingId);
127 outputBindings.push_back(std::make_pair(outputLayerBindingId, outputTensorInfo));
128 outputVectors.push_back(std::vector<float>(outputTensorInfo.GetNumElements(), 0));
130 OutputTensors outputTensors = armnnUtils::MakeOutputTensors<TContainer>(outputBindings, outputVectors);
133 m_Runtime->EnqueueWorkload(m_NetworkId, inputTensors, outputTensors);
146 m_Ranges.SetDynamicMode(
false);
153 m_DynamicQuantizationStrategy.value().VisitNonCalibratedLayers();
155 m_Runtime.reset(
nullptr);
161 std::unique_ptr<IQuantizationScheme> quantizationScheme;
162 switch (m_Options.m_ActivationFormat)
165 quantizationScheme = std::make_unique<QAsymmU8QuantizationScheme>();
168 quantizationScheme = std::make_unique<QAsymmS8QuantizationScheme>();
171 quantizationScheme = std::make_unique<QSymmS8QuantizationScheme>();
174 quantizationScheme = std::make_unique<QSymm16QuantizationScheme>();
180 QuantizerStrategy quantizerVisitor(m_Ranges, quantizationScheme.get(), m_Options.m_PreserveType);
186 return quantizerVisitor.RetrieveFinalNetwork();
static IRuntimePtr Create(const CreationOptions &options)
std::unique_ptr< class INetworkQuantizer, void(*)(INetworkQuantizer *quantizer)> INetworkQuantizerPtr
Main network class which provides the interface for building up a neural network. ...
std::vector< std::pair< LayerBindingId, class ConstTensor > > InputTensors
Copyright (c) 2021 ARM Limited and Contributors.
void VisitLayers(const LayerContainer &layerContainer, ILayerVisitor &visitor)
std::pair< float, float > MinMaxRange
int LayerBindingId
Type of identifiers for bindable layers (inputs, outputs).
mapbox::util::variant< std::vector< float >, std::vector< int >, std::vector< unsigned char > > TContainer
static void Destroy(INetworkQuantizer *quantizer)
Destroy Quantizer object.
void Refine(const InputTensors &inputTensors) override
Refine input network with a set of refinement data for specified LayerBindingId.
void OverrideInputRange(LayerBindingId layerId, float min, float max) override
Overrides the default quantization values for the input layer with the given id.
IOptimizedNetworkPtr Optimize(const INetwork &network, const std::vector< BackendId > &backendPreferences, const IDeviceSpec &deviceSpec, const OptimizerOptions &options=OptimizerOptions(), Optional< std::vector< std::string > &> messages=EmptyOptional())
Create an optimized version of the network.
void ApplyStrategyToLayers(const LayerContainer &layerContainer, IStrategy &strategy)
static INetworkQuantizer * CreateRaw(INetwork *inputNetwork, const QuantizerOptions &options=QuantizerOptions())
Create Quantizer object and return raw pointer.
std::vector< std::pair< LayerBindingId, class Tensor > > OutputTensors
std::unique_ptr< IOptimizedNetwork, void(*)(IOptimizedNetwork *network)> IOptimizedNetworkPtr
std::pair< float, float > FindMinMax(armnn::ITensorHandle *tensorHandle)
EmptyOptional is used to initialize the Optional class in case we want to have default value for an O...
Visitor class implementation to gather the TensorInfo for LayerBindingID for creation of ConstTensor ...
Graph & TopologicalSort()
Sorts layers in topological order and return this.
InputLayersAccessor GetInputLayers() const
Returns a wrapper object with begin(), end() methods to iterate over the input layers in a range-base...
std::unique_ptr< INetwork, void(*)(INetwork *network)> INetworkPtr
Quantizer class Quantizes a float32 InputNetwork.
INetworkPtr ExportNetwork() override
Extract final quantized network.
static INetworkQuantizerPtr Create(INetwork *inputNetwork, const QuantizerOptions &options=QuantizerOptions())
Create Quantizer object wrapped in unique_ptr.