From 0f1fc504b457a55d87b3b49ae987e10440ce8060 Mon Sep 17 00:00:00 2001 From: Mikhail Ryzhov Date: Thu, 19 Aug 2021 12:27:02 +0300 Subject: [PATCH] [GNA] Set input scale factors for imported model (#7139) --- .../samples/speech_sample/main.cpp | 31 +++++++------- .../src/gna_plugin/gna_plugin.cpp | 12 ++++++ .../src/gna_plugin/gna_plugin_config.cpp | 2 +- .../src/gna_plugin/gna_plugin_config.hpp | 2 + .../import_reshape_permute_conv.cpp | 41 +++++++++++++++---- .../import_export_base/import_export_base.hpp | 1 + .../import_export_base/import_export_base.cpp | 17 +++++++- .../src/base/layer_test_utils.cpp | 1 + 8 files changed, 79 insertions(+), 28 deletions(-) diff --git a/inference-engine/samples/speech_sample/main.cpp b/inference-engine/samples/speech_sample/main.cpp index f2366ae7ab9..d236fc84833 100644 --- a/inference-engine/samples/speech_sample/main.cpp +++ b/inference-engine/samples/speech_sample/main.cpp @@ -627,24 +627,21 @@ int main(int argc, char* argv[]) { if (FLAGS_q.compare("user") == 0) { if (!FLAGS_rg.empty()) { - slog::warn - << "Custom scale factor will be ignored - using scale factor from provided imported gna model: " - << FLAGS_rg << slog::endl; - } else { - auto scaleFactorInput = ParseScaleFactors(FLAGS_sf); - if (numInputFiles != scaleFactorInput.size()) { - std::string errMessage( - "Incorrect command line for multiple inputs: " + std::to_string(scaleFactorInput.size()) + - " scale factors provided for " + std::to_string(numInputFiles) + " input files."); - throw std::logic_error(errMessage); - } + slog::warn << "Custom scale factor will be used for imported gna model: " << FLAGS_rg << slog::endl; + } - for (size_t i = 0; i < scaleFactorInput.size(); ++i) { - slog::info << "For input " << i << " using scale factor of " << scaleFactorInput[i] << slog::endl; - std::string scaleFactorConfigKey = - GNA_CONFIG_KEY(SCALE_FACTOR) + std::string("_") + std::to_string(i); - gnaPluginConfig[scaleFactorConfigKey] = scaleFactorInput[i]; - } + auto scaleFactorInput = ParseScaleFactors(FLAGS_sf); + if (numInputFiles != scaleFactorInput.size()) { + std::string errMessage( + "Incorrect command line for multiple inputs: " + std::to_string(scaleFactorInput.size()) + + " scale factors provided for " + std::to_string(numInputFiles) + " input files."); + throw std::logic_error(errMessage); + } + + for (size_t i = 0; i < scaleFactorInput.size(); ++i) { + slog::info << "For input " << i << " using scale factor of " << scaleFactorInput[i] << slog::endl; + std::string scaleFactorConfigKey = GNA_CONFIG_KEY(SCALE_FACTOR) + std::string("_") + std::to_string(i); + gnaPluginConfig[scaleFactorConfigKey] = scaleFactorInput[i]; } } else { // "static" quantization with calculated scale factor diff --git a/inference-engine/src/gna_plugin/gna_plugin.cpp b/inference-engine/src/gna_plugin/gna_plugin.cpp index c4d5b311fd6..e51914c3cc6 100644 --- a/inference-engine/src/gna_plugin/gna_plugin.cpp +++ b/inference-engine/src/gna_plugin/gna_plugin.cpp @@ -1579,6 +1579,18 @@ InferenceEngine::IExecutableNetworkInternal::Ptr GNAPlugin::ImportNetwork(std::i transpose_inputs_info, transpose_outputs_info); + // If scale factors are defined in configuration we still need to use them instead of imported values, + // for example to change the scale factors for the old models. + if (!config.inputScaleFactors.empty()) { + IE_ASSERT(config.inputScaleFactors.size() == inputsDesc->inputScaleFactors.size()); + for (size_t i = 0; i < config.inputScaleFactors.size(); ++i) { + if (config.inputScaleFactors[i] != GNAPluginNS::kScaleFactorDefault) { + gnalog() << "[Import Network] Using input scale factor defined in configuration for input " << i << std::endl; + inputsDesc->inputScaleFactors[i] = config.inputScaleFactors[i]; + } + } + } + #if GNA_LIB_VER == 2 auto getOrientation = [](Gna2Operation & gnaOperation) { return gnaOperation.Type == Gna2OperationTypeConvolution ? diff --git a/inference-engine/src/gna_plugin/gna_plugin_config.cpp b/inference-engine/src/gna_plugin/gna_plugin_config.cpp index f5e28e10aed..64b374b49af 100644 --- a/inference-engine/src/gna_plugin/gna_plugin_config.cpp +++ b/inference-engine/src/gna_plugin/gna_plugin_config.cpp @@ -95,7 +95,7 @@ void Config::UpdateFromMap(const std::map& config) { } // missing scale factors are set to be 1.0f if (inputScaleFactors.size() <= input_index) { - inputScaleFactors.resize(input_index + 1, 1.f); + inputScaleFactors.resize(input_index + 1, GNAPluginNS::kScaleFactorDefault); } inputScaleFactors[input_index] = InferenceEngine::CNNLayer::ie_parse_float(value); } else if (key == GNA_CONFIG_KEY(FIRMWARE_MODEL_IMAGE)) { diff --git a/inference-engine/src/gna_plugin/gna_plugin_config.hpp b/inference-engine/src/gna_plugin/gna_plugin_config.hpp index 850c61c5a6e..309882dd126 100644 --- a/inference-engine/src/gna_plugin/gna_plugin_config.hpp +++ b/inference-engine/src/gna_plugin/gna_plugin_config.hpp @@ -18,6 +18,8 @@ namespace GNAPluginNS { +static const float kScaleFactorDefault = 1.f; + struct Config { Config() { AdjustKeyMapValues(); diff --git a/inference-engine/tests/functional/plugin/gna/shared_tests_instances/import_export_tests/import_reshape_permute_conv.cpp b/inference-engine/tests/functional/plugin/gna/shared_tests_instances/import_export_tests/import_reshape_permute_conv.cpp index 0d824402305..a17c52a97b5 100644 --- a/inference-engine/tests/functional/plugin/gna/shared_tests_instances/import_export_tests/import_reshape_permute_conv.cpp +++ b/inference-engine/tests/functional/plugin/gna/shared_tests_instances/import_export_tests/import_reshape_permute_conv.cpp @@ -11,7 +11,7 @@ using namespace LayerTestsDefinitions; namespace { -class ImportReshapePermuteConvGNA : public ImportReshapePermuteConv { +class ImportExportGNAModelUnchanged : public ImportReshapePermuteConv { private: void exportImportNetwork() override { { @@ -42,8 +42,14 @@ private: std::string fileName = "exported_model.blob"; }; -TEST_P(ImportReshapePermuteConvGNA, CompareWithRefImpl) { - Run(); +class ImportExportGNAModelChanged : public ImportExportGNAModelUnchanged {}; + +TEST_P(ImportExportGNAModelUnchanged, ReshapePermuteConv) { + TestRun(false); +}; + +TEST_P(ImportExportGNAModelChanged, ReshapePermuteConv) { + TestRun(true); }; const std::vector netPrecisions = { @@ -58,15 +64,25 @@ const std::vector> exportConfigs = { } }; -const std::vector> importConfigs = { +const std::vector> importConfigsChanged = { { {"GNA_DEVICE_MODE", "GNA_SW_EXACT"}, {"GNA_SCALE_FACTOR_0", "32767"} - }, + } +}; + +const std::vector> importConfigsUnchanged = { { {"GNA_DEVICE_MODE", "GNA_SW_EXACT"}, {"GNA_SCALE_FACTOR_0", "327.67"} }, + { + {"GNA_DEVICE_MODE", "GNA_SW_EXACT"}, + {"GNA_SCALE_FACTOR_0", "1"} + }, + { + {"GNA_DEVICE_MODE", "GNA_SW_EXACT"} + } }; const std::vector appHeaders = { @@ -74,13 +90,22 @@ const std::vector appHeaders = { "APPLICATION_HEADER" }; -INSTANTIATE_TEST_SUITE_P(smoke_ImportNetworkCase, ImportReshapePermuteConvGNA, +INSTANTIATE_TEST_CASE_P(smoke_ImportNetworkGNA, ImportExportGNAModelUnchanged, ::testing::Combine( ::testing::ValuesIn(netPrecisions), ::testing::Values(CommonTestUtils::DEVICE_GNA), ::testing::ValuesIn(exportConfigs), - ::testing::ValuesIn(importConfigs), + ::testing::ValuesIn(importConfigsUnchanged), ::testing::ValuesIn(appHeaders)), - ImportReshapePermuteConvGNA::getTestCaseName); + ImportExportGNAModelUnchanged::getTestCaseName); + +INSTANTIATE_TEST_CASE_P(smoke_ImportNetworkGNA, ImportExportGNAModelChanged, + ::testing::Combine( + ::testing::ValuesIn(netPrecisions), + ::testing::Values(CommonTestUtils::DEVICE_GNA), + ::testing::ValuesIn(exportConfigs), + ::testing::ValuesIn(importConfigsChanged), + ::testing::ValuesIn(appHeaders)), + ImportExportGNAModelChanged::getTestCaseName); } // namespace diff --git a/inference-engine/tests/functional/plugin/shared/include/base/import_export_base/import_export_base.hpp b/inference-engine/tests/functional/plugin/shared/include/base/import_export_base/import_export_base.hpp index d8f30c23f2d..da62acf4bb5 100644 --- a/inference-engine/tests/functional/plugin/shared/include/base/import_export_base/import_export_base.hpp +++ b/inference-engine/tests/functional/plugin/shared/include/base/import_export_base/import_export_base.hpp @@ -23,6 +23,7 @@ class ImportNetworkTestBase : public testing::WithParamInterface obj); void Run() override; + void TestRun(bool isModelChanged); protected: std::map exportConfiguration; diff --git a/inference-engine/tests/functional/plugin/shared/src/base/import_export_base/import_export_base.cpp b/inference-engine/tests/functional/plugin/shared/src/base/import_export_base/import_export_base.cpp index c30945dc914..c4a0f038dd1 100644 --- a/inference-engine/tests/functional/plugin/shared/src/base/import_export_base/import_export_base.cpp +++ b/inference-engine/tests/functional/plugin/shared/src/base/import_export_base/import_export_base.cpp @@ -42,14 +42,18 @@ void ImportNetworkTestBase::exportImportNetwork() { } void ImportNetworkTestBase::Run() { - SKIP_IF_CURRENT_TEST_IS_DISABLED() + TestRun(false); +} +void ImportNetworkTestBase::TestRun(bool isModelChanged) { + SKIP_IF_CURRENT_TEST_IS_DISABLED() + // load export configuration and save outputs configuration.insert(exportConfiguration.begin(), exportConfiguration.end()); LoadNetwork(); GenerateInputs(); Infer(); + auto actualOutputs = GetOutputs(); - const auto& actualOutputs = GetOutputs(); auto referenceOutputs = CalculateRefs(); Compare(referenceOutputs, actualOutputs); @@ -57,6 +61,14 @@ void ImportNetworkTestBase::Run() { configuration[configItem.first] = configItem.second; } + // for import with different scale factor need to use import configuration to get refference outputs. + if (isModelChanged) { + LoadNetwork(); + GenerateInputs(); + Infer(); + actualOutputs = GetOutputs(); + } + const auto compiledExecNetwork = executableNetwork; exportImportNetwork(); const auto importedExecNetwork = executableNetwork; @@ -75,6 +87,7 @@ void ImportNetworkTestBase::Run() { ASSERT_NO_THROW(compiledExecNetwork.GetOutputsInfo()[next_output.first]); } auto importedOutputs = GetOutputs(); + ASSERT_EQ(actualOutputs.size(), importedOutputs.size()); for (size_t i = 0; i < actualOutputs.size(); i++) { diff --git a/inference-engine/tests/functional/shared_test_classes/src/base/layer_test_utils.cpp b/inference-engine/tests/functional/shared_test_classes/src/base/layer_test_utils.cpp index 3c1639b978f..b9f679cb2a9 100644 --- a/inference-engine/tests/functional/shared_test_classes/src/base/layer_test_utils.cpp +++ b/inference-engine/tests/functional/shared_test_classes/src/base/layer_test_utils.cpp @@ -313,6 +313,7 @@ void LayerTestsCommon::LoadNetwork() { } void LayerTestsCommon::GenerateInputs() { + inputs.clear(); const auto& inputsInfo = executableNetwork.GetInputsInfo(); const auto& functionParams = function->get_parameters(); for (int i = 0; i < functionParams.size(); ++i) {