diff options
author | Kevin May <kevin.may@arm.com> | 2021-04-22 16:51:18 +0100 |
---|---|---|
committer | Kevin May <kevin.may@arm.com> | 2021-04-27 15:02:45 +0000 |
commit | 4a621c43174b6bdd9dc0bff839b245bc2139d6a6 (patch) | |
tree | 88b2bbc803284e7c5051c8812a468e5f3c834b9c /src/armnnQuantizer | |
parent | 65542e4f250a66fd0aba0c1b509e11cb518ee2d5 (diff) | |
download | armnn-4a621c43174b6bdd9dc0bff839b245bc2139d6a6.tar.gz |
IVGCVSW-5719 Remove Quantizer
Signed-off-by: Kevin May <kevin.may@arm.com>
Change-Id: I8a29df03afdd6f1cc8413b219e179272cd2d51cf
Diffstat (limited to 'src/armnnQuantizer')
-rw-r--r-- | src/armnnQuantizer/ArmNNQuantizerMain.cpp | 99 | ||||
-rw-r--r-- | src/armnnQuantizer/CommandLineProcessor.cpp | 186 | ||||
-rw-r--r-- | src/armnnQuantizer/CommandLineProcessor.hpp | 52 | ||||
-rw-r--r-- | src/armnnQuantizer/QuantizationDataSet.cpp | 203 | ||||
-rw-r--r-- | src/armnnQuantizer/QuantizationDataSet.hpp | 71 | ||||
-rw-r--r-- | src/armnnQuantizer/QuantizationInput.cpp | 103 | ||||
-rw-r--r-- | src/armnnQuantizer/QuantizationInput.hpp | 54 | ||||
-rw-r--r-- | src/armnnQuantizer/README.md | 19 | ||||
-rw-r--r-- | src/armnnQuantizer/test/QuantizationDataSetTests.cpp | 140 |
9 files changed, 0 insertions, 927 deletions
diff --git a/src/armnnQuantizer/ArmNNQuantizerMain.cpp b/src/armnnQuantizer/ArmNNQuantizerMain.cpp deleted file mode 100644 index 49652efe25..0000000000 --- a/src/armnnQuantizer/ArmNNQuantizerMain.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "CommandLineProcessor.hpp" -#include <armnnDeserializer/IDeserializer.hpp> -#include <armnnQuantizer/INetworkQuantizer.hpp> -#include <armnnSerializer/ISerializer.hpp> -#include "QuantizationDataSet.hpp" -#include "QuantizationInput.hpp" - -#include <algorithm> -#include <fstream> -#include <iostream> - -int main(int argc, char* argv[]) -{ - armnnQuantizer::CommandLineProcessor cmdline; - if (!cmdline.ProcessCommandLine(argc, argv)) - { - return -1; - } - armnnDeserializer::IDeserializerPtr parser = armnnDeserializer::IDeserializer::Create(); - std::ifstream inputFileStream(cmdline.GetInputFileName(), std::ios::binary); - std::vector<std::uint8_t> binaryContent; - while (inputFileStream) - { - char c; - inputFileStream.get(c); - if (inputFileStream) - { - binaryContent.push_back(static_cast<std::uint8_t>(c)); - } - } - inputFileStream.close(); - - armnn::QuantizerOptions quantizerOptions; - - if (cmdline.GetQuantizationScheme() == "QAsymmS8") - { - quantizerOptions.m_ActivationFormat = armnn::DataType::QAsymmS8; - } - else if (cmdline.GetQuantizationScheme() == "QSymmS16") - { - quantizerOptions.m_ActivationFormat = armnn::DataType::QSymmS16; - } - else - { - quantizerOptions.m_ActivationFormat = armnn::DataType::QAsymmU8; - } - - quantizerOptions.m_PreserveType = cmdline.HasPreservedDataType(); - - armnn::INetworkPtr network = parser->CreateNetworkFromBinary(binaryContent); - armnn::INetworkQuantizerPtr quantizer = armnn::INetworkQuantizer::Create(network.get(), quantizerOptions); - - if (cmdline.HasQuantizationData()) - { - armnnQuantizer::QuantizationDataSet dataSet = cmdline.GetQuantizationDataSet(); - if (!dataSet.IsEmpty()) - { - // Get the Input Tensor Infos - armnnQuantizer::InputLayerStrategy inputLayerStrategy; - network->ExecuteStrategy(inputLayerStrategy); - - for (armnnQuantizer::QuantizationInput quantizationInput : dataSet) - { - armnn::InputTensors inputTensors; - std::vector<std::vector<float>> inputData(quantizationInput.GetNumberOfInputs()); - std::vector<armnn::LayerBindingId> layerBindingIds = quantizationInput.GetLayerBindingIds(); - unsigned int count = 0; - for (armnn::LayerBindingId layerBindingId : quantizationInput.GetLayerBindingIds()) - { - armnn::TensorInfo tensorInfo = inputLayerStrategy.GetTensorInfo(layerBindingId); - inputData[count] = quantizationInput.GetDataForEntry(layerBindingId); - armnn::ConstTensor inputTensor(tensorInfo, inputData[count].data()); - inputTensors.push_back(std::make_pair(layerBindingId, inputTensor)); - count++; - } - quantizer->Refine(inputTensors); - } - } - } - - armnn::INetworkPtr quantizedNetwork = quantizer->ExportNetwork(); - armnnSerializer::ISerializerPtr serializer = armnnSerializer::ISerializer::Create(); - serializer->Serialize(*quantizedNetwork); - - std::string output(cmdline.GetOutputDirectoryName()); - output.append(cmdline.GetOutputFileName()); - std::ofstream outputFileStream; - outputFileStream.open(output); - serializer->SaveSerializedToStream(outputFileStream); - outputFileStream.flush(); - outputFileStream.close(); - - return 0; -}
\ No newline at end of file diff --git a/src/armnnQuantizer/CommandLineProcessor.cpp b/src/armnnQuantizer/CommandLineProcessor.cpp deleted file mode 100644 index 74ad5e7dbc..0000000000 --- a/src/armnnQuantizer/CommandLineProcessor.cpp +++ /dev/null @@ -1,186 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "CommandLineProcessor.hpp" -#include <Filesystem.hpp> - -#include <cxxopts/cxxopts.hpp> - -namespace armnnQuantizer -{ - -bool ValidateOutputDirectory(std::string& dir) -{ - if (dir.empty()) - { - std::cerr << "No output directory specified" << std::endl; - return false; - } - - if (dir[dir.length() - 1] != '/') - { - dir += "/"; - } - - if (!fs::exists(dir)) - { - std::cerr << "Output directory [" << dir << "] does not exist" << std::endl; - return false; - } - - if (!fs::is_directory(dir)) - { - std::cerr << "Given output directory [" << dir << "] is not a directory" << std::endl; - return false; - } - - return true; -} - -bool ValidateProvidedFile(const std::string& inputFileName) -{ - if (!fs::exists(inputFileName)) - { - std::cerr << "Provided file [" << inputFileName << "] does not exist" << std::endl; - return false; - } - - if (fs::is_directory(inputFileName)) - { - std::cerr << "Given file [" << inputFileName << "] is a directory" << std::endl; - return false; - } - - return true; -} - -bool ValidateQuantizationScheme(const std::string& scheme) -{ - if (scheme.empty()) - { - std::cerr << "No Quantization Scheme specified" << std::endl; - return false; - } - - std::vector<std::string> supportedSchemes = - { - "QAsymmS8", - "QAsymmU8", - "QSymm16" - }; - - auto iterator = std::find(supportedSchemes.begin(), supportedSchemes.end(), scheme); - if (iterator == supportedSchemes.end()) - { - std::cerr << "Quantization Scheme [" << scheme << "] is not supported" << std::endl; - return false; - } - - return true; -} - -bool CommandLineProcessor::ProcessCommandLine(int argc, char* argv[]) -{ - try - { - cxxopts::Options options("ArmnnQuantizer","Convert a Fp32 ArmNN model to a quantized ArmNN model."); - - options.add_options() - ("h,help", "Display help messages") - ("f,infile", - "Input file containing float 32 ArmNN Input Graph", - cxxopts::value<std::string>(m_InputFileName)) - ("s,scheme", - "Quantization scheme," - " \"QAsymmU8\" or \"QAsymmS8\" or \"QSymm16\"," - " default value QAsymmU8", - cxxopts::value<std::string>(m_QuantizationScheme)->default_value("QAsymmU8")) - ("c,csvfile", - "CSV file containing paths for RAW input tensors", - cxxopts::value<std::string>(m_CsvFileName)->default_value("")) - ("p,preserve-data-type", - "Preserve the input and output data types", - cxxopts::value<bool>(m_PreserveDataType)->default_value("false")) - ("d,outdir", - "Directory that output file will be written to", - cxxopts::value<std::string>(m_OutputDirectory)) - ("o,outfile", - "ArmNN output file name", - cxxopts::value<std::string>(m_OutputFileName)); - - auto result = options.parse(argc, argv); - - if (result.count("help") > 0 || argc <= 1) - { - std::cout << options.help() << std::endl; - return false; - } - - // Check for mandatory single options. - std::string mandatorySingleParameters[] = { "infile", "outdir", "outfile" }; - for (auto param : mandatorySingleParameters) - { - if (result.count(param) != 1) - { - std::cerr << "Parameter \'--" << param << "\' is required but missing." << std::endl; - return false; - } - } - } - catch (const cxxopts::OptionException& e) - { - std::cerr << e.what() << std::endl << std::endl; - return false; - } - catch (const std::exception& e) - { - std::cerr << "Fatal internal error: [" << e.what() << "]" << std::endl; - return false; - } - - if (!armnnQuantizer::ValidateProvidedFile(m_InputFileName)) - { - return false; - } - - if (!ValidateQuantizationScheme(m_QuantizationScheme)) - { - return false; - } - - if (m_CsvFileName != "") - { - if (!armnnQuantizer::ValidateProvidedFile(m_CsvFileName)) - { - return false; - } - else - { - fs::path csvFilePath(m_CsvFileName); - m_CsvFileDirectory = csvFilePath.parent_path().c_str(); - } - - // If CSV file is defined, create a QuantizationDataSet for specified CSV file. - m_QuantizationDataSet = QuantizationDataSet(m_CsvFileName); - } - - if (!armnnQuantizer::ValidateOutputDirectory(m_OutputDirectory)) - { - return false; - } - - std::string output(m_OutputDirectory); - output.append(m_OutputFileName); - - if (fs::exists(output)) - { - std::cerr << "Output file [" << output << "] already exists" << std::endl; - return false; - } - - return true; -} - -} // namespace armnnQuantizer
\ No newline at end of file diff --git a/src/armnnQuantizer/CommandLineProcessor.hpp b/src/armnnQuantizer/CommandLineProcessor.hpp deleted file mode 100644 index 9de03fb327..0000000000 --- a/src/armnnQuantizer/CommandLineProcessor.hpp +++ /dev/null @@ -1,52 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// -#pragma once - -#include <string> -#include <iostream> -#include <vector> -#include "QuantizationDataSet.hpp" - -namespace armnnQuantizer -{ - -// parses the command line to extract -// * the input file -f containing the serialized fp32 ArmNN input graph (must exist...and be a input graph file) -// * the csv file -c <optional> detailing the paths for RAW input tensors to use for refinement -// * the directory -d to place the output file into (must already exist and be writable) -// * the name of the file -o the quantized ArmNN input graph will be written to (must not already exist) -// * LATER: the min and max overrides to be applied to the inputs -// specified as -i <int> (input id) -n <float> (minimum) -x <float> (maximum) -// multiple sets of -i, -n, -x can appear on the command line but they must match -// in number i.e. a -n and -x for each -i and the id of the input must correspond -// to an input layer in the fp32 graph when it is loaded. -class CommandLineProcessor -{ -public: - bool ProcessCommandLine(int argc, char* argv[]); - - std::string GetInputFileName() {return m_InputFileName;} - std::string GetCsvFileName() {return m_CsvFileName;} - std::string GetCsvFileDirectory() {return m_CsvFileDirectory;} - std::string GetOutputDirectoryName() {return m_OutputDirectory;} - std::string GetOutputFileName() {return m_OutputFileName;} - std::string GetQuantizationScheme() {return m_QuantizationScheme;} - QuantizationDataSet GetQuantizationDataSet() {return m_QuantizationDataSet;} - bool HasPreservedDataType() {return m_PreserveDataType;} - bool HasQuantizationData() {return !m_QuantizationDataSet.IsEmpty();} - -protected: - std::string m_InputFileName; - std::string m_CsvFileName; - std::string m_CsvFileDirectory; - std::string m_OutputDirectory; - std::string m_OutputFileName; - std::string m_QuantizationScheme; - QuantizationDataSet m_QuantizationDataSet; - bool m_PreserveDataType; -}; - -} // namespace armnnQuantizer - diff --git a/src/armnnQuantizer/QuantizationDataSet.cpp b/src/armnnQuantizer/QuantizationDataSet.cpp deleted file mode 100644 index 99fc021a51..0000000000 --- a/src/armnnQuantizer/QuantizationDataSet.cpp +++ /dev/null @@ -1,203 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "QuantizationDataSet.hpp" - -#include <fmt/format.h> - -#include <armnn/utility/StringUtils.hpp> -#include <armnn/utility/IgnoreUnused.hpp> -#include <Filesystem.hpp> - -namespace armnnQuantizer -{ - -QuantizationDataSet::QuantizationDataSet() -{ -} - -QuantizationDataSet::QuantizationDataSet(const std::string csvFilePath): - m_QuantizationInputs(), - m_CsvFilePath(csvFilePath) -{ - ParseCsvFile(); -} - -void AddInputData(unsigned int passId, - armnn::LayerBindingId bindingId, - const std::string& inputFilePath, - std::map<unsigned int, QuantizationInput>& passIdToQuantizationInput) -{ - auto iterator = passIdToQuantizationInput.find(passId); - if (iterator == passIdToQuantizationInput.end()) - { - QuantizationInput input(passId, bindingId, inputFilePath); - passIdToQuantizationInput.emplace(passId, input); - } - else - { - auto existingQuantizationInput = iterator->second; - existingQuantizationInput.AddEntry(bindingId, inputFilePath); - } -} - -QuantizationDataSet::~QuantizationDataSet() -{ -} - - -/// Visitor class implementation to gather the TensorInfo for LayerBindingID for creation of ConstTensor for Refine. - -void InputLayerStrategy::ExecuteStrategy(const armnn::IConnectableLayer* layer, - const armnn::BaseDescriptor& descriptor, - const std::vector<armnn::ConstTensor>& constants, - const char* name, - const armnn::LayerBindingId id) -{ - armnn::IgnoreUnused(name, descriptor, constants); - - m_TensorInfos.emplace(id, layer->GetOutputSlot(0).GetTensorInfo()); -} - - - - -armnn::TensorInfo InputLayerStrategy::GetTensorInfo(armnn::LayerBindingId layerBindingId) -{ - auto iterator = m_TensorInfos.find(layerBindingId); - if (iterator != m_TensorInfos.end()) - { - return m_TensorInfos.at(layerBindingId); - } - else - { - throw armnn::Exception("Could not retrieve tensor info for binding ID " + std::to_string(layerBindingId)); - } -} - -void InputLayerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer, - armnn::LayerBindingId id, - const char* name) -{ - armnn::IgnoreUnused(name); - m_TensorInfos.emplace(id, layer->GetOutputSlot(0).GetTensorInfo()); -} - -armnn::TensorInfo InputLayerVisitor::GetTensorInfo(armnn::LayerBindingId layerBindingId) -{ - auto iterator = m_TensorInfos.find(layerBindingId); - if (iterator != m_TensorInfos.end()) - { - return m_TensorInfos.at(layerBindingId); - } - else - { - throw armnn::Exception("Could not retrieve tensor info for binding ID " + std::to_string(layerBindingId)); - } -} - - -unsigned int GetPassIdFromCsvRow(std::vector<std::string> tokens, unsigned int lineIndex) -{ - unsigned int passId; - try - { - passId = static_cast<unsigned int>(std::stoi(tokens[0])); - } - catch (const std::invalid_argument&) - { - throw armnn::ParseException(fmt::format("Pass ID [{}] is not correct format on CSV row {}", - tokens[0], lineIndex)); - } - return passId; -} - -armnn::LayerBindingId GetBindingIdFromCsvRow(std::vector<std::string> tokens, unsigned int lineIndex) -{ - armnn::LayerBindingId bindingId; - try - { - bindingId = std::stoi(tokens[1]); - } - catch (const std::invalid_argument&) - { - throw armnn::ParseException(fmt::format("Binding ID [{}] is not correct format on CSV row {}", - tokens[1], lineIndex)); - } - return bindingId; -} - -std::string GetFileNameFromCsvRow(std::vector<std::string> tokens, unsigned int lineIndex) -{ - std::string fileName = armnn::stringUtils::StringTrim(tokens[2]); - - if (!fs::exists(fileName)) - { - throw armnn::ParseException(fmt::format("File [{}] provided on CSV row {} does not exist.", - fileName, lineIndex)); - } - - if (fileName.empty()) - { - throw armnn::ParseException(fmt::format("Filename cannot be empty on CSV row {} ", lineIndex)); - } - return fileName; -} - - -void QuantizationDataSet::ParseCsvFile() -{ - std::map<unsigned int, QuantizationInput> passIdToQuantizationInput; - - if (m_CsvFilePath == "") - { - throw armnn::Exception("CSV file not specified."); - } - - std::ifstream inf (m_CsvFilePath.c_str()); - std::string line; - std::vector<std::string> tokens; - unsigned int lineIndex = 0; - - if (!inf) - { - throw armnn::Exception(fmt::format("CSV file {} not found.", m_CsvFilePath)); - } - - while (getline(inf, line)) - { - tokens = armnn::stringUtils::StringTokenizer(line, ","); - - if (tokens.size() != 3) - { - throw armnn::Exception(fmt::format("CSV file [{}] does not have correct number of entries" \ - "on line {}. Expected 3 entries but was {}.", - m_CsvFilePath, lineIndex, tokens.size())); - - } - - unsigned int passId = GetPassIdFromCsvRow(tokens, lineIndex); - armnn::LayerBindingId bindingId = GetBindingIdFromCsvRow(tokens, lineIndex); - std::string rawFileName = GetFileNameFromCsvRow(tokens, lineIndex); - - AddInputData(passId, bindingId, rawFileName, passIdToQuantizationInput); - - ++lineIndex; - } - - if (passIdToQuantizationInput.empty()) - { - throw armnn::Exception("Could not parse CSV file."); - } - - // Once all entries in CSV file are parsed successfully and QuantizationInput map is populated, populate - // QuantizationInputs iterator for easier access and clear the map - for (auto itr = passIdToQuantizationInput.begin(); itr != passIdToQuantizationInput.end(); ++itr) - { - m_QuantizationInputs.emplace_back(itr->second); - } -} - -} diff --git a/src/armnnQuantizer/QuantizationDataSet.hpp b/src/armnnQuantizer/QuantizationDataSet.hpp deleted file mode 100644 index 47b893a7f7..0000000000 --- a/src/armnnQuantizer/QuantizationDataSet.hpp +++ /dev/null @@ -1,71 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include <map> -#include "QuantizationInput.hpp" -#include "armnn/LayerVisitorBase.hpp" -#include "armnn/Tensor.hpp" - -namespace armnnQuantizer -{ - -/// QuantizationDataSet is a structure which is created after parsing a quantization CSV file. -/// It contains records of filenames which contain refinement data per pass ID for binding ID. -class QuantizationDataSet -{ - using QuantizationInputs = std::vector<armnnQuantizer::QuantizationInput>; -public: - - using iterator = QuantizationInputs::iterator; - using const_iterator = QuantizationInputs::const_iterator; - - QuantizationDataSet(); - QuantizationDataSet(std::string csvFilePath); - ~QuantizationDataSet(); - bool IsEmpty() const {return m_QuantizationInputs.empty();} - - iterator begin() { return m_QuantizationInputs.begin(); } - iterator end() { return m_QuantizationInputs.end(); } - const_iterator begin() const { return m_QuantizationInputs.begin(); } - const_iterator end() const { return m_QuantizationInputs.end(); } - const_iterator cbegin() const { return m_QuantizationInputs.cbegin(); } - const_iterator cend() const { return m_QuantizationInputs.cend(); } - -private: - void ParseCsvFile(); - - QuantizationInputs m_QuantizationInputs; - std::string m_CsvFilePath; -}; - -/// Visitor class implementation to gather the TensorInfo for LayerBindingID for creation of ConstTensor for Refine. -class InputLayerStrategy : public armnn::IStrategy -{ -public: - virtual void ExecuteStrategy(const armnn::IConnectableLayer* layer, - const armnn::BaseDescriptor& descriptor, - const std::vector<armnn::ConstTensor>& constants, - const char* name, - const armnn::LayerBindingId id = 0) override; - - armnn::TensorInfo GetTensorInfo(armnn::LayerBindingId); -private: - std::map<armnn::LayerBindingId, armnn::TensorInfo> m_TensorInfos; -}; - - -/// Visitor class implementation to gather the TensorInfo for LayerBindingID for creation of ConstTensor for Refine. -class InputLayerVisitor : public armnn::LayerVisitorBase<armnn::VisitorNoThrowPolicy> -{ -public: - void VisitInputLayer(const armnn::IConnectableLayer *layer, armnn::LayerBindingId id, const char* name); - armnn::TensorInfo GetTensorInfo(armnn::LayerBindingId); -private: - std::map<armnn::LayerBindingId, armnn::TensorInfo> m_TensorInfos; -}; - -} // namespace armnnQuantizer
\ No newline at end of file diff --git a/src/armnnQuantizer/QuantizationInput.cpp b/src/armnnQuantizer/QuantizationInput.cpp deleted file mode 100644 index bb7aff1c2c..0000000000 --- a/src/armnnQuantizer/QuantizationInput.cpp +++ /dev/null @@ -1,103 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "QuantizationInput.hpp" - -#include <iostream> -#include <fstream> -#include <cstring> -#include "armnn/Exceptions.hpp" - -namespace armnnQuantizer -{ - -QuantizationInput::QuantizationInput(const unsigned int passId, - const armnn::LayerBindingId bindingId, - const std::string fileName): - m_PassId(passId) -{ - m_LayerBindingIdToFileName.emplace(bindingId, fileName); -} - -QuantizationInput::QuantizationInput(const QuantizationInput& other) -{ - m_PassId = other.GetPassId(); - m_LayerBindingIdToFileName.clear(); - for (armnn::LayerBindingId bindingId : other.GetLayerBindingIds()) - { - std::string filename = other.GetFileName(bindingId); - AddEntry(bindingId, filename); - } -} - -void QuantizationInput::AddEntry(const armnn::LayerBindingId bindingId, const std::string fileName) -{ - m_LayerBindingIdToFileName.emplace(bindingId, fileName); -} - -std::vector<float> QuantizationInput::GetDataForEntry(const armnn::LayerBindingId bindingId) const -{ - if (m_LayerBindingIdToFileName.at(bindingId).empty()) - { - throw armnn::Exception("Layer binding ID not found"); - } - - std::string fileName = m_LayerBindingIdToFileName.at(bindingId); - std::ifstream in(fileName.c_str(), std::ifstream::binary); - if (!in.is_open()) - { - throw armnn::Exception("Failed to open input tensor file " + fileName); - } - - std::string line; - std::vector<float> values; - char* pEnd; - - while (std::getline(in, line, ' ')) - { - values.emplace_back(std::strtof(line.c_str(), &pEnd)); - } - return values; -} - -std::vector<armnn::LayerBindingId> QuantizationInput::GetLayerBindingIds() const -{ - std::vector<armnn::LayerBindingId> layerBindingIDs; - - for (auto iterator = m_LayerBindingIdToFileName.begin(); iterator != m_LayerBindingIdToFileName.end(); ++iterator) - { - layerBindingIDs.emplace_back(iterator->first); - } - return layerBindingIDs; -} - -unsigned long QuantizationInput::GetNumberOfInputs() const -{ - return m_LayerBindingIdToFileName.size(); -} - -unsigned int QuantizationInput::GetPassId() const -{ - return m_PassId; -} - -std::string QuantizationInput::GetFileName(const armnn::LayerBindingId bindingId) const -{ - auto iterator = m_LayerBindingIdToFileName.find(bindingId); - if (iterator != m_LayerBindingIdToFileName.end()) - { - return m_LayerBindingIdToFileName.at(bindingId); - } - else - { - throw armnn::Exception("Could not retrieve filename for binding ID " + std::to_string(bindingId)); - } -} - -QuantizationInput::~QuantizationInput() noexcept -{ -} - -}
\ No newline at end of file diff --git a/src/armnnQuantizer/QuantizationInput.hpp b/src/armnnQuantizer/QuantizationInput.hpp deleted file mode 100644 index 1bfe84bc19..0000000000 --- a/src/armnnQuantizer/QuantizationInput.hpp +++ /dev/null @@ -1,54 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#pragma once - -#include <map> -#include <armnn/Types.hpp> -#include <armnnQuantizer/INetworkQuantizer.hpp> - -namespace armnnQuantizer -{ - -/// QuantizationInput for specific pass ID, can list a corresponding raw data file for each LayerBindingId. -class QuantizationInput -{ -public: - - /// Constructor for QuantizationInput - QuantizationInput(const unsigned int passId, - const armnn::LayerBindingId bindingId, - const std::string fileName); - - QuantizationInput(const QuantizationInput& other); - - // Add binding ID to image tensor filepath entry - void AddEntry(const armnn::LayerBindingId bindingId, const std::string fileName); - - // Retrieve tensor data for entry with provided binding ID - std::vector<float> GetDataForEntry(const armnn::LayerBindingId bindingId) const; - - /// Retrieve Layer Binding IDs for this QuantizationInput. - std::vector<armnn::LayerBindingId> GetLayerBindingIds() const; - - /// Get number of inputs for this QuantizationInput. - unsigned long GetNumberOfInputs() const; - - /// Retrieve Pass ID for this QuantizationInput. - unsigned int GetPassId() const; - - /// Retrieve filename path for specified Layer Binding ID. - std::string GetFileName(const armnn::LayerBindingId bindingId) const; - - /// Destructor - ~QuantizationInput() noexcept; - -private: - unsigned int m_PassId; - std::map<armnn::LayerBindingId, std::string> m_LayerBindingIdToFileName; - -}; - -}
\ No newline at end of file diff --git a/src/armnnQuantizer/README.md b/src/armnnQuantizer/README.md deleted file mode 100644 index 6100372818..0000000000 --- a/src/armnnQuantizer/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# The ArmnnQuantizer - -The `ArmnnQuantizer` is a program for loading a 32-bit float network into ArmNN and converting it into a quantized asymmetric 8-bit or quantized symmetric 16-bit network. -It supports static quantization by default, dynamic quantization is enabled if CSV file of raw input tensors is provided. Run the program with no arguments to see command-line help. - -**NOTE**: The ArmnnQuantizer is deprecated in Arm NN 21.02 and will be removed in 21.05. - -|Cmd:||| -| ---|---|---| -| -h | --help | Display help messages | -| -f | --infile | Input file containing float 32 ArmNN Input Graph | -| -s | --scheme | Quantization scheme, "QAsymm8" or "QSymm16". Default value: QAsymm8 | -| -c | --csvfile | CSV file containing paths for raw input tensors for dynamic quantization. If unset, static quantization is used | -| -p | --preserve-data-type | Preserve the input and output data types. If unset, input and output data types are not preserved | -| -d | --outdir | Directory that output file will be written to | -| -o | --outfile | ArmNN output file name | - -Example usage: <br> -<code>./ArmnnQuantizer -f /path/to/armnn/input/graph/ -s "QSymm16" -c /path/to/csv/file -p 1 -d /path/to/output -o outputFileName</code> diff --git a/src/armnnQuantizer/test/QuantizationDataSetTests.cpp b/src/armnnQuantizer/test/QuantizationDataSetTests.cpp deleted file mode 100644 index 9e71f68e53..0000000000 --- a/src/armnnQuantizer/test/QuantizationDataSetTests.cpp +++ /dev/null @@ -1,140 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include <boost/test/unit_test.hpp> - -#include "../QuantizationDataSet.hpp" - -#include <armnn/Optional.hpp> -#include <Filesystem.hpp> -#include <iostream> -#include <fstream> -#include <vector> -#include <map> - - -using namespace armnnQuantizer; - -struct CsvTestHelper { - - CsvTestHelper() - { - BOOST_TEST_MESSAGE("setup fixture"); - } - - ~CsvTestHelper() - { - BOOST_TEST_MESSAGE("teardown fixture"); - TearDown(); - } - - std::string CreateTempCsvFile(std::map<int, std::vector<float>> csvData) - { - fs::path fileDir = fs::temp_directory_path(); - fs::path p = armnnUtils::Filesystem::NamedTempFile("Armnn-QuantizationCreateTempCsvFileTest-TempFile.csv"); - - fs::path tensorInput1{fileDir / "input_0_0.raw"}; - fs::path tensorInput2{fileDir / "input_1_0.raw"}; - fs::path tensorInput3{fileDir / "input_2_0.raw"}; - - try - { - std::ofstream ofs{p}; - - std::ofstream ofs1{tensorInput1}; - std::ofstream ofs2{tensorInput2}; - std::ofstream ofs3{tensorInput3}; - - - for(auto entry : csvData.at(0)) - { - ofs1 << entry << " "; - } - for(auto entry : csvData.at(1)) - { - ofs2 << entry << " "; - } - for(auto entry : csvData.at(2)) - { - ofs3 << entry << " "; - } - - ofs << "0, 0, " << tensorInput1.c_str() << std::endl; - ofs << "2, 0, " << tensorInput3.c_str() << std::endl; - ofs << "1, 0, " << tensorInput2.c_str() << std::endl; - - ofs.close(); - ofs1.close(); - ofs2.close(); - ofs3.close(); - } - catch (std::exception &e) - { - std::cerr << "Unable to write to file at location [" << p.c_str() << "] : " << e.what() << std::endl; - BOOST_TEST(false); - } - - m_CsvFile = p; - return p.string(); - } - - void TearDown() - { - RemoveCsvFile(); - } - - void RemoveCsvFile() - { - if (m_CsvFile) - { - try - { - fs::remove(m_CsvFile.value()); - } - catch (std::exception &e) - { - std::cerr << "Unable to delete file [" << m_CsvFile.value() << "] : " << e.what() << std::endl; - BOOST_TEST(false); - } - } - } - - armnn::Optional<fs::path> m_CsvFile; -}; - - -BOOST_AUTO_TEST_SUITE(QuantizationDataSetTests) - -BOOST_FIXTURE_TEST_CASE(CheckDataSet, CsvTestHelper) -{ - - std::map<int, std::vector<float>> csvData; - csvData.insert(std::pair<int, std::vector<float>>(0, { 0.111111f, 0.222222f, 0.333333f })); - csvData.insert(std::pair<int, std::vector<float>>(1, { 0.444444f, 0.555555f, 0.666666f })); - csvData.insert(std::pair<int, std::vector<float>>(2, { 0.777777f, 0.888888f, 0.999999f })); - - std::string myCsvFile = CsvTestHelper::CreateTempCsvFile(csvData); - QuantizationDataSet dataSet(myCsvFile); - BOOST_TEST(!dataSet.IsEmpty()); - - int csvRow = 0; - for(armnnQuantizer::QuantizationInput input : dataSet) - { - BOOST_TEST(input.GetPassId() == csvRow); - - BOOST_TEST(input.GetLayerBindingIds().size() == 1); - BOOST_TEST(input.GetLayerBindingIds()[0] == 0); - BOOST_TEST(input.GetDataForEntry(0).size() == 3); - - // Check that QuantizationInput data for binding ID 0 corresponds to float values - // used for populating the CSV file using by QuantizationDataSet - BOOST_TEST(input.GetDataForEntry(0).at(0) == csvData.at(csvRow).at(0)); - BOOST_TEST(input.GetDataForEntry(0).at(1) == csvData.at(csvRow).at(1)); - BOOST_TEST(input.GetDataForEntry(0).at(2) == csvData.at(csvRow).at(2)); - ++csvRow; - } -} - -BOOST_AUTO_TEST_SUITE_END();
\ No newline at end of file |