Files
openvino/inference-engine/tests_deprecated/unit/engines/vpu/merge_parallel_fc.cpp
T
Ilya LavrenovandMichael Nosov fa2f9c5201 Migrated to official GoogleTest repo (#6286)
* Move gtest to <root>/wqthirdparty

* Fixed inference engine tests

* Fixed unit-tests

* Fixed GPU

* Fixed clDNN_unit_tests compilation

* Reverted ngraph changes

* Fixed VPU tests

* Fixed deprecated tests compilation

* Removed OpenVINO clone

* Added public submodule

* Removed

* Fixed Windows

* More updates for INSTANTIATE_TEST_SUITE_P

* Use release-1.10.0

* Removed ngraph copy of gtest

* Revert "Removed ngraph copy of gtest"

This reverts commit ec9fe08d79.

* Fixes for TYPED_TEST_CASE

* Fixed GNA tests

* Updated submodule

* Updaed index

* TMP disabled tests

* Revert changes and fix compilation errors

* Fixed caching tests

* Revert back

* Revert back all

Co-authored-by: Michael Nosov <mikhail.nosov@intel.com>
2021-06-22 17:39:39 +03:00

361 lines
12 KiB
C++

// Copyright (C) 2018-2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#include "graph_transformer_tests.hpp"
#include <vpu/stages/stub_stage.hpp>
#include <vpu/model/data_contents/ie_blob_content.hpp>
#include <initializer_list>
using namespace vpu;
namespace {
using Dimensions = std::vector<std::size_t>;
struct FCDescriptor {
Dimensions weights;
Dimensions biases;
Dimensions scales;
Dimensions output;
FCDescriptor(Dimensions new_weights, Dimensions new_biases, Dimensions new_scales, Dimensions new_output)
: weights(std::move(new_weights))
, biases(std::move(new_biases))
, scales(std::move(new_scales))
, output(std::move(new_output)) {}
};
class VPU_MergeParallelFCTestBase : public GraphTransformerTest, public testing::WithParamInterface<std::tuple<Dimensions, std::vector<FCDescriptor>>> {
public:
void SetUp() override {
GraphTransformerTest::SetUp();
InitCompileEnv();
InitPipeline();
}
void CreateModelWithParallelFC(const Dimensions& inputDimensions, const std::vector<FCDescriptor>& descriptors) {
model = CreateModel();
const auto input = model->addInputData("Input", CreateDescriptor(inputDimensions));
model->attrs().set<int>("numInputs", 1);
for (std::size_t i = 0; i < descriptors.size(); ++i) {
const auto& fcDims = descriptors[i];
const auto& weights = model->addConstData("Weights#" + std::to_string(i), DataDesc{fcDims.weights});
const auto& biases = fcDims.biases.empty() ? model->addFakeData() : model->addConstData("Biases#" + std::to_string(i), DataDesc{fcDims.biases});
const auto& scales = fcDims.scales.empty() ? model->addFakeData() : model->addConstData("Scales#" + std::to_string(i), DataDesc{fcDims.scales});
const auto& output = model->addNewData("Output#" + std::to_string(i), CreateDescriptor(fcDims.output));
model->addNewStage<StubStage>(
"FC#" + std::to_string(i),
StageType::StubFullyConnected,
nullptr,
{input, weights, biases, scales},
{output});
stageBuilder->addReLUStage(
model,
"ReLU#" + std::to_string(i),
nullptr,
0.0f,
output,
model->addOutputData("NetworkOutput#" + std::to_string(i), CreateDescriptor(fcDims.output)));
}
}
void Compile() {
pipeline.run(model);
}
protected:
static DataDesc CreateReferenceOutputDescriptor(const std::vector<FCDescriptor>& descriptors) {
std::vector<DataDesc> outputDescriptors;
std::transform(descriptors.begin(), descriptors.end(), std::back_inserter(outputDescriptors),
[](const FCDescriptor& fcDescriptor) { return CreateDescriptor(fcDescriptor.output); });
return mergeDescriptors(outputDescriptors);
}
static DataDesc CreateReferenceScalesDescriptor(const std::vector<FCDescriptor>& descriptors) {
if (descriptors.front().scales.size() == 0) {
return DataDesc{{1}};
}
std::vector<DataDesc> scalesDescriptors;
std::transform(descriptors.begin(), descriptors.end(), std::back_inserter(scalesDescriptors),
[](const FCDescriptor& fcDescriptor) { return CreateDescriptor(fcDescriptor.scales); });
return mergeDescriptors(scalesDescriptors);
}
static DataDesc CreateReferenceBiasesDescriptor(const std::vector<FCDescriptor>& descriptors) {
if (descriptors.front().biases.size() == 0) {
return DataDesc{{1}};
}
std::vector<DataDesc> biasesDescriptors;
std::transform(descriptors.begin(), descriptors.end(), std::back_inserter(biasesDescriptors),
[](const FCDescriptor& fcDescriptor) { return CreateDescriptor(fcDescriptor.biases); });
return mergeDescriptors(biasesDescriptors);
}
static DataDesc CreateReferenceWeightsDescriptor(const std::vector<FCDescriptor>& descriptors) {
std::vector<DataDesc> weightsDescriptors;
std::transform(descriptors.begin(), descriptors.end(), std::back_inserter(weightsDescriptors),
[](const FCDescriptor& fcDescriptor) { return CreateDescriptor(fcDescriptor.weights); });
return mergeDescriptors(weightsDescriptors);
}
static DataDesc mergeDescriptors(const std::vector<DataDesc>& descriptors) {
auto merged = descriptors.front();
merged.setDim(Dim::C, std::accumulate(descriptors.begin(), descriptors.end(), 0,
[](int reduction, const DataDesc& descriptor) { return reduction + descriptor.dim(Dim::C); }));
return merged;
}
static DataDesc CreateDescriptor(const Dimensions& dimensions) {
return DataDesc{dimensions};
}
void InitPipeline() {
pipeline = PassSet();
pipeline.addPass(passManager->dumpModel("before-merge-parallel-fc"));
pipeline.addPass(passManager->initialCheck());
pipeline.addPass(passManager->mergeParallelFC());
pipeline.addPass(passManager->dumpModel("after-merge-parallel-fc"));
}
PassSet pipeline;
Model model;
};
class VPU_MergeParallelFCTest : public VPU_MergeParallelFCTestBase {
public:
void AssertMergedCorrectly(const Dimensions& inputDimensions, const std::vector<FCDescriptor>& descriptors) const {
if (descriptors.empty()) {
return;
}
const auto& stages = model->getStages() | asVector();
ASSERT_EQ(stages.size(), 2 + descriptors.size());
const auto& fc = stages.front();
const auto& split = stages[1];
ASSERT_EQ(fc->type(), StageType::StubFullyConnected);
ASSERT_EQ(split->type(), StageType::Split);
ASSERT_TRUE(fc->numInputs() >= 2 && fc->numInputs() <= 4);
ASSERT_EQ(fc->input(0)->desc(), CreateDescriptor(inputDimensions));
ASSERT_EQ(fc->input(1)->desc(), CreateReferenceWeightsDescriptor(descriptors));
ASSERT_EQ(fc->input(2)->desc(), CreateReferenceBiasesDescriptor(descriptors));
ASSERT_EQ(fc->input(3)->desc(), CreateReferenceScalesDescriptor(descriptors));
ASSERT_TRUE(fc->numOutputs() == 1);
ASSERT_EQ(fc->output(0)->desc(), CreateReferenceOutputDescriptor(descriptors));
ASSERT_EQ(split->numInputs(), 1);
ASSERT_EQ(split->input(0)->desc(), fc->output(0)->desc());
ASSERT_EQ(split->numOutputs(), descriptors.size());
for (std::size_t i = 0; i < split->numOutputs(); ++i) {
ASSERT_EQ(split->output(i)->desc(), CreateDescriptor(descriptors[i].output));
}
for (std::size_t i = 2; i < stages.size(); ++i) {
const auto& relu = stages[i];
ASSERT_EQ(relu->type(), StageType::Relu);
ASSERT_EQ(relu->numInputs(), 1);
ASSERT_EQ(relu->numOutputs(), 1);
ASSERT_EQ(split->output(i - 2)->desc(), relu->input(0)->desc());
ASSERT_EQ(CreateDescriptor(descriptors[i - 2].output), relu->output(0)->desc());
}
}
};
class VPU_NoMergeParallelFCTest : public VPU_MergeParallelFCTestBase {
public:
void AssertNotMergedCorrectly(const Dimensions& inputDimensions, const std::vector<FCDescriptor>& descriptors) {
if (descriptors.empty()) {
return;
}
const auto& stages = model->getStages() | asVector();
ASSERT_EQ(stages.size(), 2 * descriptors.size());
for (std::size_t i = 0; i < descriptors.size(); ++i) {
ASSERT_EQ(stages[2 * i + 0]->type(), StageType::StubFullyConnected);
ASSERT_EQ(stages[2 * i + 1]->type(), StageType::Relu);
}
}
};
const std::initializer_list<Dimensions> inputDimensions = {
{13, 21}
};
const std::initializer_list<std::vector<FCDescriptor>> FCDescriptorsMerge = {
{
FCDescriptor({7, 21}, {}, {}, {13, 7}),
FCDescriptor({5, 21}, {}, {}, {13, 5}),
},
{
FCDescriptor({7, 21}, {}, {21}, {13, 7}),
FCDescriptor({5, 21}, {}, {21}, {13, 5}),
},
{
FCDescriptor({7, 21}, {21}, {}, {13, 7}),
FCDescriptor({5, 21}, {21}, {}, {13, 5}),
},
{
FCDescriptor({7, 21}, {21}, {21}, {13, 7}),
FCDescriptor({5, 21}, {21}, {21}, {13, 5}),
},
{
FCDescriptor({7, 21}, {}, {}, {13, 7}),
FCDescriptor({5, 21}, {}, {}, {13, 5}),
FCDescriptor({11, 21}, {}, {}, {13, 11}),
},
{
FCDescriptor({7, 21}, {}, {21}, {13, 7}),
FCDescriptor({5, 21}, {}, {21}, {13, 5}),
FCDescriptor({11, 21}, {}, {21}, {13, 11}),
},
{
FCDescriptor({7, 21}, {21}, {}, {13, 7}),
FCDescriptor({5, 21}, {21}, {}, {13, 5}),
FCDescriptor({11, 21}, {21}, {}, {13, 11}),
},
{
FCDescriptor({7, 21}, {21}, {21}, {13, 7}),
FCDescriptor({5, 21}, {21}, {21}, {13, 5}),
FCDescriptor({11, 21}, {21}, {21}, {13, 11}),
}
};
const std::initializer_list<std::vector<FCDescriptor>> FCDescriptorsNoMerge {
{
FCDescriptor({7, 21}, {}, {}, {13, 7}),
},
{
FCDescriptor({7, 21}, {}, {21}, {13, 7}),
},
{
FCDescriptor({7, 21}, {21}, {}, {13, 7}),
},
{
FCDescriptor({7, 21}, {21}, {21}, {13, 7}),
},
{
FCDescriptor({7, 21}, {}, {}, {13, 7}),
FCDescriptor({7, 21}, {}, {21}, {13, 7}),
},
{
FCDescriptor({7, 21}, {}, {}, {13, 7}),
FCDescriptor({7, 21}, {21}, {}, {13, 7}),
},
{
FCDescriptor({7, 21}, {}, {}, {13, 7}),
FCDescriptor({7, 21}, {21}, {21}, {13, 7}),
},
{
FCDescriptor({7, 21}, {}, {21}, {13, 7}),
FCDescriptor({7, 21}, {21}, {}, {13, 7}),
},
{
FCDescriptor({7, 21}, {}, {21}, {13, 7}),
FCDescriptor({7, 21}, {21}, {21}, {13, 7}),
},
{
FCDescriptor({7, 21}, {21}, {}, {13, 7}),
FCDescriptor({7, 21}, {}, {21}, {13, 7}),
},
{
FCDescriptor({7, 21}, {21}, {}, {13, 7}),
FCDescriptor({7, 21}, {21}, {21}, {13, 7}),
},
{
FCDescriptor({7, 21}, {}, {}, {13, 7}),
FCDescriptor({7, 21}, {}, {21}, {13, 7}),
FCDescriptor({7, 21}, {}, {21}, {13, 7}),
},
{
FCDescriptor({7, 21}, {}, {}, {13, 7}),
FCDescriptor({7, 21}, {21}, {}, {13, 7}),
FCDescriptor({7, 21}, {21}, {}, {13, 7}),
},
{
FCDescriptor({7, 21}, {}, {}, {13, 7}),
FCDescriptor({7, 21}, {21}, {21}, {13, 7}),
FCDescriptor({7, 21}, {21}, {21}, {13, 7}),
},
{
FCDescriptor({7, 21}, {}, {21}, {13, 7}),
FCDescriptor({7, 21}, {21}, {}, {13, 7}),
FCDescriptor({7, 21}, {21}, {}, {13, 7}),
},
{
FCDescriptor({7, 21}, {}, {21}, {13, 7}),
FCDescriptor({7, 21}, {21}, {21}, {13, 7}),
FCDescriptor({7, 21}, {21}, {21}, {13, 7}),
},
{
FCDescriptor({7, 21}, {21}, {}, {13, 7}),
FCDescriptor({7, 21}, {}, {21}, {13, 7}),
FCDescriptor({7, 21}, {}, {21}, {13, 7}),
},
{
FCDescriptor({7, 21}, {21}, {}, {13, 7}),
FCDescriptor({7, 21}, {21}, {21}, {13, 7}),
FCDescriptor({7, 21}, {21}, {21}, {13, 7}),
},
};
TEST_P(VPU_MergeParallelFCTest, MergeParallelFCMergeCases) {
const auto& testParams = GetParam();
const auto& testInputDimensions = std::get<0>(testParams);
const auto& testFCDescriptors = std::get<1>(testParams);
CreateModelWithParallelFC(testInputDimensions, testFCDescriptors);
ASSERT_NO_THROW(Compile());
AssertMergedCorrectly(testInputDimensions, testFCDescriptors);
}
TEST_P(VPU_NoMergeParallelFCTest, NoMergeParallelFCMergeCases) {
const auto& testParams = GetParam();
const auto& testInputDimensions = std::get<0>(testParams);
const auto& testFCDescriptors = std::get<1>(testParams);
CreateModelWithParallelFC(testInputDimensions, testFCDescriptors);
ASSERT_NO_THROW(Compile());
AssertNotMergedCorrectly(testInputDimensions, testFCDescriptors);
}
INSTANTIATE_TEST_SUITE_P(MergeParallelFCTest, VPU_MergeParallelFCTest, testing::Combine(
testing::ValuesIn(inputDimensions),
testing::ValuesIn(FCDescriptorsMerge)
));
INSTANTIATE_TEST_SUITE_P(NoMergeParallelFCTest, VPU_NoMergeParallelFCTest, testing::Combine(
testing::ValuesIn(inputDimensions),
testing::ValuesIn(FCDescriptorsNoMerge)
));
}