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:
parent
9f5fad16e7
commit
d4c5cb2375
@ -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));
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user