Removing unnecessary order checking in Loop/TI operations (#4531)

* deleting a check of order of the input/output descs in ti/loop operations

* added ngraph_reader unit test

* unrolling for Loop operation, fix LowLatency transformation for Loop

* Revert "unrolling for Loop operation, fix LowLatency transformation for Loop"

This reverts commit 7188921ad7.
This commit is contained in:
Ivan Tikhonov 2021-03-02 18:10:41 +03:00 committed by GitHub
parent 9f5fad16e7
commit d4c5cb2375
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 204 additions and 12 deletions

View File

@ -381,3 +381,207 @@ TEST_F(NGraphReaderTests, ReadLoopNetwork_2) {
weights->buffer().as<float*>()[1] = 0;
EXPECT_NO_THROW(reader.ReadNetwork(model, weights));
}
TEST_F(NGraphReaderTests, ReadLoopNetwork_ExternalPort1IsNotConnected) {
std::string model = R"V0G0N(
<?xml version="1.0" ?>
<net name="loop_2d_add" version="10">
<layers>
<layer id="0" name="trip_count/Output_0/Data__const" type="Parameter" version="opset1">
<data element_type="i64" offset="0" shape="1" size="8"/>
<output>
<port id="1" precision="I64">
<dim>1</dim>
</port>
</output>
</layer>
<layer id="1" name="a_final5/execution_cond/Output_0/Data__const" type="Parameter" version="opset1">
<data element_type="boolean" offset="8" shape="" size="1"/>
<output>
<port id="1" precision="BOOL"/>
</output>
</layer>
<layer id="2" name="a_init" type="Parameter" version="opset1">
<data element_type="f32" shape="1,2"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>2</dim>
</port>
</output>
</layer>
<layer id="3" name="a_final5" type="Loop" version="opset5">
<input>
<port id="0">
<dim>1</dim>
</port>
<port id="1"/>
<port id="2">
<dim>1</dim>
<dim>2</dim>
</port>
</input>
<output>
<port id="3" precision="FP32">
<dim>1</dim>
<dim>2</dim>
</port>
<port id="4" precision="FP32">
<dim>3</dim>
<dim>1</dim>
<dim>2</dim>
</port>
</output>
<port_map>
<input external_port_id="0" internal_layer_id="0"/>
<input external_port_id="2" internal_layer_id="2"/>
<output external_port_id="-1" internal_layer_id="1" purpose="execution_condition"/>
<output external_port_id="3" internal_layer_id="5"/>
<output axis="0" external_port_id="4" internal_layer_id="8"/>
</port_map>
<back_edges>
<edge from-layer="1" from-port="0" to-layer="0" to-port="0"/>
<edge from-layer="5" from-port="0" to-layer="2" to-port="0"/>
</back_edges>
<body>
<layers>
<layer id="0" name="cond_in" type="Parameter" version="opset1">
<data element_type="boolean" shape=""/>
<output>
<port id="0" precision="BOOL"/>
</output>
</layer>
<layer id="1" name="cond_identity/sink_port_0" type="Result" version="opset1">
<input>
<port id="0"/>
</input>
</layer>
<layer id="2" name="a_in" type="Parameter" version="opset1">
<data element_type="f32" shape="1,2"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>2</dim>
</port>
</output>
</layer>
<layer id="3" name="b/Output_0/Data__const" type="Const" version="opset1">
<data element_type="f32" offset="0" shape="1,2" size="8"/>
<output>
<port id="1" precision="FP32">
<dim>1</dim>
<dim>2</dim>
</port>
</output>
</layer>
<layer id="4" name="loop_body_add" type="Add" version="opset1">
<input>
<port id="0">
<dim>1</dim>
<dim>2</dim>
</port>
<port id="1">
<dim>1</dim>
<dim>2</dim>
</port>
</input>
<output>
<port id="2" precision="FP32">
<dim>1</dim>
<dim>2</dim>
</port>
</output>
</layer>
<layer id="5" name="loop_body_add/sink_port_0" type="Result" version="opset1">
<input>
<port id="0">
<dim>1</dim>
<dim>2</dim>
</port>
</input>
</layer>
<layer id="6" name="11_input_port_1/value/Output_0/Data__const" type="Const" version="opset1">
<data element_type="i64" offset="0" shape="1" size="8"/>
<output>
<port id="1" precision="I64">
<dim>1</dim>
</port>
</output>
</layer>
<layer id="7" name="11" type="Unsqueeze" version="opset1">
<input>
<port id="0">
<dim>1</dim>
<dim>2</dim>
</port>
<port id="1">
<dim>1</dim>
</port>
</input>
<output>
<port id="2" precision="FP32">
<dim>3</dim>
<dim>1</dim>
<dim>2</dim>
</port>
</output>
</layer>
<layer id="8" name="output_accumulator/sink_port_0" type="Result" version="opset1">
<input>
<port id="0">
<dim>3</dim>
<dim>1</dim>
<dim>2</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
<edge from-layer="2" from-port="0" to-layer="4" to-port="0"/>
<edge from-layer="3" from-port="1" to-layer="4" to-port="1"/>
<edge from-layer="4" from-port="2" to-layer="5" to-port="0"/>
<edge from-layer="4" from-port="2" to-layer="7" to-port="0"/>
<edge from-layer="6" from-port="1" to-layer="7" to-port="1"/>
<edge from-layer="7" from-port="2" to-layer="8" to-port="0"/>
</edges>
</body>
</layer>
<layer id="6" name="a_final/sink_port_0" type="Result" version="opset1">
<input>
<port id="0">
<dim>1</dim>
<dim>2</dim>
</port>
</input>
</layer>
<layer id="9" name="a_values/sink_port_0" type="Result" version="opset1">
<input>
<port id="0">
<dim>3</dim>
<dim>1</dim>
<dim>2</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="1" to-layer="3" to-port="0"/>
<edge from-layer="1" from-port="1" to-layer="3" to-port="1"/>
<edge from-layer="2" from-port="0" to-layer="3" to-port="2"/>
<edge from-layer="3" from-port="3" to-layer="6" to-port="0"/>
<edge from-layer="3" from-port="4" to-layer="9" to-port="0"/>
</edges>
</net>
)V0G0N";
Core reader;
Blob::Ptr weights;
weights = make_shared_blob<uint8_t>(TensorDesc(Precision::U8, {8}, Layout::C));
weights->allocate();
weights->buffer().as<float*>()[0] = 0;
weights->buffer().as<float*>()[1] = 0;
EXPECT_NO_THROW(reader.ReadNetwork(model, weights));
}

View File

@ -185,12 +185,9 @@ void op::v5::Loop::validate_and_infer_types()
"Number of inputs must be the same as number of input descriptions");
// Input
uint64_t index_it = input_offset;
for (const auto& input_description : m_input_descriptions)
{
auto index = input_description->m_input_index;
NODE_VALIDATION_CHECK(this, index == index_it, "Input_index not in order");
index_it++;
if (auto slice_input_description = as_type_ptr<SliceInputDescription>(input_description))
{
@ -242,12 +239,9 @@ void op::v5::Loop::validate_and_infer_types()
m_body->validate_nodes_and_infer_types();
// Output
index_it = 0;
for (const auto& output_description : m_output_descriptions)
{
auto index = output_description->m_output_index;
NODE_VALIDATION_CHECK(this, index == index_it, "Output_index not in order");
index_it++;
auto body_value =
m_body->get_results().at(output_description->m_body_value_index)->input_value(0);

View File

@ -102,12 +102,9 @@ void op::v0::TensorIterator::validate_and_infer_types()
};
// Input
uint64_t index_it = 0;
for (const auto& input_description : m_input_descriptions)
{
auto index = input_description->m_input_index;
NODE_VALIDATION_CHECK(this, index == index_it, "Input_index not in order");
index_it++;
if (auto slice_input_description = as_type_ptr<SliceInputDescription>(input_description))
{
@ -170,12 +167,9 @@ void op::v0::TensorIterator::validate_and_infer_types()
// Output
try_to_set_num_iterations_if_no_slice_inputs();
index_it = 0;
for (const auto& output_description : m_output_descriptions)
{
auto index = output_description->m_output_index;
NODE_VALIDATION_CHECK(this, index == index_it, "Output_index not in order");
index_it++;
auto body_value =
m_body->get_results().at(output_description->m_body_value_index)->input_value(0);