diff options
author | Jim Flynn <jim.flynn@arm.com> | 2020-03-19 17:03:14 +0000 |
---|---|---|
committer | Jim Flynn <jim.flynn@arm.com> | 2020-03-19 17:03:14 +0000 |
commit | 0e2bab81442ee6cc2b94e4f7881ed0c5c6af65e7 (patch) | |
tree | b0af08b5a0b74149fca422151127ac6310385399 /src/armnnQuantizer | |
parent | 8c3259fa007d43fcc5ea56fe6928526dbe79f3c0 (diff) | |
download | armnn-0e2bab81442ee6cc2b94e4f7881ed0c5c6af65e7.tar.gz |
Creating gh-pages documentation for ArmNN
Signed-off-by: Jim Flynn <jim.flynn@arm.com>
Diffstat (limited to 'src/armnnQuantizer')
-rw-r--r-- | src/armnnQuantizer/ArmNNQuantizerMain.cpp | 89 | ||||
-rw-r--r-- | src/armnnQuantizer/CommandLineProcessor.cpp | 178 | ||||
-rw-r--r-- | src/armnnQuantizer/CommandLineProcessor.hpp | 52 | ||||
-rw-r--r-- | src/armnnQuantizer/QuantizationDataSet.cpp | 167 | ||||
-rw-r--r-- | src/armnnQuantizer/QuantizationDataSet.hpp | 55 | ||||
-rw-r--r-- | src/armnnQuantizer/QuantizationInput.cpp | 103 | ||||
-rw-r--r-- | src/armnnQuantizer/QuantizationInput.hpp | 54 | ||||
-rw-r--r-- | src/armnnQuantizer/README.md | 18 | ||||
-rw-r--r-- | src/armnnQuantizer/test/QuantizationDataSetTests.cpp | 144 |
9 files changed, 0 insertions, 860 deletions
diff --git a/src/armnnQuantizer/ArmNNQuantizerMain.cpp b/src/armnnQuantizer/ArmNNQuantizerMain.cpp deleted file mode 100644 index 30167e73f2..0000000000 --- a/src/armnnQuantizer/ArmNNQuantizerMain.cpp +++ /dev/null @@ -1,89 +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; - quantizerOptions.m_ActivationFormat = cmdline.GetQuantizationScheme() == "QSymm16" - ? armnn::DataType::QSymmS16 - : 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::InputLayerVisitor inputLayerVisitor; - network->Accept(inputLayerVisitor); - - 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 = inputLayerVisitor.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 d2163c0869..0000000000 --- a/src/armnnQuantizer/CommandLineProcessor.cpp +++ /dev/null @@ -1,178 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "CommandLineProcessor.hpp" - -#define BOOST_FILESYSTEM_NO_DEPRECATED - -#include <boost/program_options.hpp> -#include <boost/filesystem/operations.hpp> -#include <boost/filesystem/path.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 (!boost::filesystem::exists(dir)) - { - std::cerr << "Output directory [" << dir << "] does not exist" << std::endl; - return false; - } - - if (!boost::filesystem::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 (!boost::filesystem::exists(inputFileName)) - { - std::cerr << "Provided file [" << inputFileName << "] does not exist" << std::endl; - return false; - } - - if (boost::filesystem::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 = { - "QAsymm8", - "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[]) -{ - namespace po = boost::program_options; - - po::options_description desc("Options"); - try - { - desc.add_options() - ("help,h", "Display help messages") - ("infile,f", po::value<std::string>(&m_InputFileName)->required(), - "Input file containing float 32 ArmNN Input Graph") - ("scheme,s", po::value<std::string>(&m_QuantizationScheme)->default_value("QAsymm8"), - "Quantization scheme, \"QAsymm8\" or \"QSymm16\", default value QAsymm8") - ("csvfile,c", po::value<std::string>(&m_CsvFileName)->default_value(""), - "CSV file containing paths for RAW input tensors") - ("preserve-data-type,p", po::bool_switch(&m_PreserveDataType)->default_value(false), - "Preserve the input and output data types") - ("outdir,d", po::value<std::string>(&m_OutputDirectory)->required(), - "Directory that output file will be written to") - ("outfile,o", po::value<std::string>(&m_OutputFileName)->required(), "ArmNN output file name"); - } - catch (const std::exception& e) - { - std::cerr << "Fatal internal error: [" << e.what() << "]" << std::endl; - return false; - } - - po::variables_map vm; - - try - { - po::store(po::parse_command_line(argc, argv, desc), vm); - - if (vm.count("help") || argc <= 1) - { - std::cout << "Convert a Fp32 ArmNN model to a quantized ArmNN model." << std::endl; - std::cout << std::endl; - std::cout << desc << std::endl; - return false; - } - - po::notify(vm); - } - catch (const po::error& e) - { - std::cerr << e.what() << std::endl << std::endl; - std::cerr << desc << 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 - { - boost::filesystem::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 (boost::filesystem::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 9694342fe8..0000000000 --- a/src/armnnQuantizer/QuantizationDataSet.cpp +++ /dev/null @@ -1,167 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include "QuantizationDataSet.hpp" -#include "CsvReader.hpp" - -#define BOOST_FILESYSTEM_NO_DEPRECATED - -#include <boost/core/ignore_unused.hpp> -#include <boost/filesystem/operations.hpp> -#include <boost/filesystem/path.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() -{ -} - -void InputLayerVisitor::VisitInputLayer(const armnn::IConnectableLayer* layer, - armnn::LayerBindingId id, - const char* name) -{ - boost::ignore_unused(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<armnnUtils::CsvRow> csvRows, unsigned int rowIndex) -{ - unsigned int passId; - try - { - passId = static_cast<unsigned int>(std::stoi(csvRows[rowIndex].values[0])); - } - catch (const std::invalid_argument&) - { - throw armnn::ParseException("Pass ID [" + csvRows[rowIndex].values[0] + "]" + - " is not correct format on CSV row " + std::to_string(rowIndex)); - } - return passId; -} - -armnn::LayerBindingId GetBindingIdFromCsvRow(std::vector<armnnUtils::CsvRow> csvRows, unsigned int rowIndex) -{ - armnn::LayerBindingId bindingId; - try - { - bindingId = std::stoi(csvRows[rowIndex].values[1]); - } - catch (const std::invalid_argument&) - { - throw armnn::ParseException("Binding ID [" + csvRows[rowIndex].values[0] + "]" + - " is not correct format on CSV row " + std::to_string(rowIndex)); - } - return bindingId; -} - -std::string GetFileNameFromCsvRow(std::vector<armnnUtils::CsvRow> csvRows, unsigned int rowIndex) -{ - std::string fileName = csvRows[rowIndex].values[2]; - - if (!boost::filesystem::exists(fileName)) - { - throw armnn::ParseException("File [ " + fileName + "] provided on CSV row " + std::to_string(rowIndex) + - " does not exist."); - } - - if (fileName.empty()) - { - throw armnn::ParseException("Filename cannot be empty on CSV row " + std::to_string(rowIndex)); - } - return fileName; -} - - -void QuantizationDataSet::ParseCsvFile() -{ - std::map<unsigned int, QuantizationInput> passIdToQuantizationInput; - armnnUtils::CsvReader reader; - - if (m_CsvFilePath == "") - { - throw armnn::Exception("CSV file not specified."); - } - - // Parse CSV file and extract data - std::vector<armnnUtils::CsvRow> csvRows = reader.ParseFile(m_CsvFilePath); - if (csvRows.empty()) - { - throw armnn::Exception("CSV file [" + m_CsvFilePath + "] is empty."); - } - - for (unsigned int i = 0; i < csvRows.size(); ++i) - { - if (csvRows[i].values.size() != 3) - { - throw armnn::Exception("CSV file [" + m_CsvFilePath + "] does not have correct number of entries " + - "on line " + std::to_string(i) + ". Expected 3 entries " + - "but was " + std::to_string(csvRows[i].values.size())); - } - - unsigned int passId = GetPassIdFromCsvRow(csvRows, i); - armnn::LayerBindingId bindingId = GetBindingIdFromCsvRow(csvRows, i); - std::string rawFileName = GetFileNameFromCsvRow(csvRows, i); - - AddInputData(passId, bindingId, rawFileName, passIdToQuantizationInput); - } - - 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 3a97630ccf..0000000000 --- a/src/armnnQuantizer/QuantizationDataSet.hpp +++ /dev/null @@ -1,55 +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 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 73b65e74b4..0000000000 --- a/src/armnnQuantizer/README.md +++ /dev/null @@ -1,18 +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. - - -|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 2b46aae26e..0000000000 --- a/src/armnnQuantizer/test/QuantizationDataSetTests.cpp +++ /dev/null @@ -1,144 +0,0 @@ -// -// Copyright © 2017 Arm Ltd. All rights reserved. -// SPDX-License-Identifier: MIT -// - -#include <boost/test/unit_test.hpp> - -#include "../QuantizationDataSet.hpp" -#include <iostream> -#include <fstream> -#include <vector> -#include <map> - -#define BOOST_FILESYSTEM_NO_DEPRECATED - -#include <boost/filesystem/operations.hpp> -#include <boost/filesystem/fstream.hpp> -#include <boost/filesystem/path.hpp> -#include <boost/optional/optional.hpp> - - -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) - { - boost::filesystem::path fileDir = boost::filesystem::temp_directory_path(); - boost::filesystem::path p{fileDir / boost::filesystem::unique_path("%%%%-%%%%-%%%%.csv")}; - - boost::filesystem::path tensorInput1{fileDir / boost::filesystem::unique_path("input_0_0.raw")}; - boost::filesystem::path tensorInput2{fileDir / boost::filesystem::unique_path("input_1_0.raw")}; - boost::filesystem::path tensorInput3{fileDir / boost::filesystem::unique_path("input_2_0.raw")}; - - try - { - boost::filesystem::ofstream ofs{p}; - - boost::filesystem::ofstream ofs1{tensorInput1}; - boost::filesystem::ofstream ofs2{tensorInput2}; - boost::filesystem::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 - { - boost::filesystem::remove(*m_CsvFile); - } - catch (std::exception &e) - { - std::cerr << "Unable to delete file [" << *m_CsvFile << "] : " << e.what() << std::endl; - BOOST_TEST(false); - } - } - } - - boost::optional<boost::filesystem::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 |