* Added support for Gelu-6 to the MO * Adding Gelu-6 to ngraph and python API + some tests * Fixed typo in the Gelu approximation mode * Fixed Gelu-6 reference implementation for Tanh mode * Added transformation to downgrade v6::Gelu to v2::Gelu * Added specification for the Gelu-6 * Code style fixes * The Gelu-6 operation specification update * Fixed compilation issue in reference implementation for Gelu * Fix compilation issues for some OSs * Code style fix * One more cpplint issue fix * Fixed Gelu6 reference implementation compilation on Windows. * Code style fix * Fixed various ngraph unit tests * Code style check * Reverted Gelu-2 to be fused op * Fixed Gelu6 downgrade transformation * Added unit test for Gelu6Downgrade transformation * Update copyright year * Updated copyright year * Replaced tab characters with 4 spaces in IR reader tests * Code style fixes * Added default value for GeluApproximation mode for Gelu-6 op * Fixed code style for Gelu-6 * Changed order of parameters for the Gelu evaluate to potentially avoid backward compatibility issues with ARM plugin * Fixed code style * Introduced opset7. Moved Gelu6 to opset7 * Fixed non-updated transformation * Fixed opset version in ngraph Python API for Gelu operation * Fixed typo in the opset number in the documentation * Reverted some changes related to Gelu6 * Updated MO to produce Gelu7 * Updated unit tests for Gelu * Updated Gelu7 specification * Changed gelu reference implementation. Added opset7 to Python packages * Updated Python API tests for Gelu operation * Code style fix * Marked get_approximation_mode function as const * Added missing "const" qualifier * Fixed code style issues in tests * Added extractor for MxNet operation Gelu * Spelling issues fix * Updated MxNet supported symbols * Added NGRAPH_OP_SCOPE for Gelu7 validate_and_infer_types * Fixed a typo in the comment
309 lines
9.5 KiB
C++
309 lines
9.5 KiB
C++
// Copyright (C) 2018-2021 Intel Corporation
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
#include <string>
|
|
#include "ngraph_reader_tests.hpp"
|
|
#include "common_test_utils/xml_net_builder/ir_net.hpp"
|
|
|
|
TEST_F(NGraphReaderTests, ReadGeluNetwork) {
|
|
CommonTestUtils::IRBuilder_v10 ir_builder_v10("Network");
|
|
|
|
auto input_layer = ir_builder_v10
|
|
.AddLayer("in1", "Parameter", {{"shape", "1,128"},
|
|
{"element_type", "f32"}}).AddOutPort(Precision::ePrecision::FP32, {1, 128})
|
|
.getLayer();
|
|
|
|
auto gelu_layer = ir_builder_v10
|
|
.AddLayer("activation", "Gelu", {}, "opset2")
|
|
.AddInPort(Precision::ePrecision::FP32, {1, 128})
|
|
.AddOutPort(Precision::ePrecision::FP32, {1, 128})
|
|
.getLayer();
|
|
|
|
auto result_layer = ir_builder_v10
|
|
.AddLayer("output", "Result")
|
|
.AddInPort(Precision::ePrecision::FP32, {1, 128})
|
|
.getLayer();
|
|
|
|
input_layer.out(0).connect(gelu_layer.in(0));
|
|
gelu_layer.out(0).connect(result_layer.in(0));
|
|
|
|
// f(x) = 0.5 * x * (1.0 + erf( x / sqrt(2.0) )
|
|
std::string model_v7 = R"V0G0N(
|
|
<?xml version="1.0"?>
|
|
<net name="Network" version="6" batch="1">
|
|
<layers>
|
|
<layer name="in1" type="Input" precision="FP32" id="0">
|
|
<output>
|
|
<port id="0" precision="FP32">
|
|
<dim>1</dim>
|
|
<dim>128</dim>
|
|
</port>
|
|
</output>
|
|
</layer>
|
|
<layer name="Multiply_304" type="Power" precision="FP32" id="1">
|
|
<data power="1" scale="0.5" shift="0" />
|
|
<input>
|
|
<port id="0">
|
|
<dim>1</dim>
|
|
<dim>128</dim>
|
|
</port>
|
|
</input>
|
|
<output>
|
|
<port id="1" precision="FP32">
|
|
<dim>1</dim>
|
|
<dim>128</dim>
|
|
</port>
|
|
</output>
|
|
</layer>
|
|
<layer name="Divide_307" type="Power" precision="FP32" id="2">
|
|
<data power="1" scale="0.707107" shift="0" />
|
|
<input>
|
|
<port id="0">
|
|
<dim>1</dim>
|
|
<dim>128</dim>
|
|
</port>
|
|
</input>
|
|
<output>
|
|
<port id="1" precision="FP32">
|
|
<dim>1</dim>
|
|
<dim>128</dim>
|
|
</port>
|
|
</output>
|
|
</layer>
|
|
<layer name="Erf_308" type="Erf" precision="FP32" id="3">
|
|
<input>
|
|
<port id="0">
|
|
<dim>1</dim>
|
|
<dim>128</dim>
|
|
</port>
|
|
</input>
|
|
<output>
|
|
<port id="1" precision="FP32">
|
|
<dim>1</dim>
|
|
<dim>128</dim>
|
|
</port>
|
|
</output>
|
|
</layer>
|
|
<layer name="Add_310" type="Power" precision="FP32" id="4">
|
|
<data power="1" scale="1" shift="1" />
|
|
<input>
|
|
<port id="0">
|
|
<dim>1</dim>
|
|
<dim>128</dim>
|
|
</port>
|
|
</input>
|
|
<output>
|
|
<port id="1" precision="FP32">
|
|
<dim>1</dim>
|
|
<dim>128</dim>
|
|
</port>
|
|
</output>
|
|
</layer>
|
|
<layer name="activation" type="Eltwise" precision="FP32" id="5">
|
|
<data operation="prod" />
|
|
<input>
|
|
<port id="0">
|
|
<dim>1</dim>
|
|
<dim>128</dim>
|
|
</port>
|
|
<port id="1">
|
|
<dim>1</dim>
|
|
<dim>128</dim>
|
|
</port>
|
|
</input>
|
|
<output>
|
|
<port id="2" precision="FP32">
|
|
<dim>1</dim>
|
|
<dim>128</dim>
|
|
</port>
|
|
</output>
|
|
</layer>
|
|
</layers>
|
|
<edges>
|
|
<edge from-layer="0" from-port="0" to-layer="2" to-port="0" />
|
|
<edge from-layer="0" from-port="0" to-layer="1" to-port="0" />
|
|
<edge from-layer="1" from-port="1" to-layer="5" to-port="0" />
|
|
<edge from-layer="2" from-port="1" to-layer="3" to-port="0" />
|
|
<edge from-layer="3" from-port="1" to-layer="4" to-port="0" />
|
|
<edge from-layer="4" from-port="1" to-layer="5" to-port="1" />
|
|
</edges>
|
|
<statistics />
|
|
</net>
|
|
)V0G0N";
|
|
|
|
std::string model_v10 = ir_builder_v10.serialize();
|
|
|
|
compareIRs(model_v10, model_v7, 0);
|
|
}
|
|
|
|
|
|
TEST_F(NGraphReaderTests, ReadGelu6TanhNetwork) {
|
|
std::string model = R"V0G0N(
|
|
<net name="saved_model" version="10">
|
|
<layers>
|
|
<layer id="0" name="input_a" type="Parameter" version="opset1">
|
|
<data shape="1,3,4" element_type="f32"/>
|
|
<output>
|
|
<port id="0" precision="FP32">
|
|
<dim>1</dim>
|
|
<dim>3</dim>
|
|
<dim>4</dim>
|
|
</port>
|
|
</output>
|
|
</layer>
|
|
<layer id="1" name="gelu" type="Gelu" version="opset7">
|
|
<data approximation_mode="tanh"/>
|
|
<input>
|
|
<port id="0">
|
|
<dim>1</dim>
|
|
<dim>3</dim>
|
|
<dim>4</dim>
|
|
</port>
|
|
</input>
|
|
<output>
|
|
<port id="1" precision="FP32">
|
|
<dim>1</dim>
|
|
<dim>3</dim>
|
|
<dim>4</dim>
|
|
</port>
|
|
</output>
|
|
</layer>
|
|
<layer id="2" name="gelu/sink_port_0" type="Result" version="opset1">
|
|
<input>
|
|
<port id="0">
|
|
<dim>1</dim>
|
|
<dim>3</dim>
|
|
<dim>4</dim>
|
|
</port>
|
|
</input>
|
|
</layer>
|
|
</layers>
|
|
<edges>
|
|
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
|
|
<edge from-layer="1" from-port="1" to-layer="2" to-port="0"/>
|
|
</edges>
|
|
</net>
|
|
)V0G0N";
|
|
std::string modelV7 = R"V0G0N(
|
|
<net name="saved_model" version="7">
|
|
<layers>
|
|
<layer id="0" name="input_a" type="Input" version="opset1">
|
|
<output>
|
|
<port id="0" precision="FP32">
|
|
<dim>1</dim>
|
|
<dim>3</dim>
|
|
<dim>4</dim>
|
|
</port>
|
|
</output>
|
|
</layer>
|
|
<layer id="1" name="gelu" type="Gelu" version="opset7">
|
|
<data approximation_mode="tanh"/>
|
|
<input>
|
|
<port id="0">
|
|
<dim>1</dim>
|
|
<dim>3</dim>
|
|
<dim>4</dim>
|
|
</port>
|
|
</input>
|
|
<output>
|
|
<port id="1" precision="FP32">
|
|
<dim>1</dim>
|
|
<dim>3</dim>
|
|
<dim>4</dim>
|
|
</port>
|
|
</output>
|
|
</layer>
|
|
</layers>
|
|
<edges>
|
|
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
|
|
</edges>
|
|
</net>
|
|
)V0G0N";
|
|
compareIRs(model, modelV7);
|
|
}
|
|
|
|
TEST_F(NGraphReaderTests, ReadGelu6ErfNetwork) {
|
|
std::string model = R"V0G0N(
|
|
<net name="saved_model" version="10">
|
|
<layers>
|
|
<layer id="0" name="input_a" type="Parameter" version="opset1">
|
|
<data shape="1,3,4" element_type="f32"/>
|
|
<output>
|
|
<port id="0" precision="FP32">
|
|
<dim>1</dim>
|
|
<dim>3</dim>
|
|
<dim>4</dim>
|
|
</port>
|
|
</output>
|
|
</layer>
|
|
<layer id="1" name="gelu" type="Gelu" version="opset7">
|
|
<data approximation_mode="erf"/>
|
|
<input>
|
|
<port id="0">
|
|
<dim>1</dim>
|
|
<dim>3</dim>
|
|
<dim>4</dim>
|
|
</port>
|
|
</input>
|
|
<output>
|
|
<port id="1" precision="FP32">
|
|
<dim>1</dim>
|
|
<dim>3</dim>
|
|
<dim>4</dim>
|
|
</port>
|
|
</output>
|
|
</layer>
|
|
<layer id="2" name="gelu/sink_port_0" type="Result" version="opset1">
|
|
<input>
|
|
<port id="0">
|
|
<dim>1</dim>
|
|
<dim>3</dim>
|
|
<dim>4</dim>
|
|
</port>
|
|
</input>
|
|
</layer>
|
|
</layers>
|
|
<edges>
|
|
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
|
|
<edge from-layer="1" from-port="1" to-layer="2" to-port="0"/>
|
|
</edges>
|
|
</net>
|
|
)V0G0N";
|
|
std::string modelV7 = R"V0G0N(
|
|
<net name="saved_model" version="7">
|
|
<layers>
|
|
<layer id="0" name="input_a" type="Input" version="opset1">
|
|
<output>
|
|
<port id="0" precision="FP32">
|
|
<dim>1</dim>
|
|
<dim>3</dim>
|
|
<dim>4</dim>
|
|
</port>
|
|
</output>
|
|
</layer>
|
|
<layer id="1" name="gelu" type="Gelu" version="opset7">
|
|
<data approximation_mode="erf"/>
|
|
<input>
|
|
<port id="0">
|
|
<dim>1</dim>
|
|
<dim>3</dim>
|
|
<dim>4</dim>
|
|
</port>
|
|
</input>
|
|
<output>
|
|
<port id="1" precision="FP32">
|
|
<dim>1</dim>
|
|
<dim>3</dim>
|
|
<dim>4</dim>
|
|
</port>
|
|
</output>
|
|
</layer>
|
|
</layers>
|
|
<edges>
|
|
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
|
|
</edges>
|
|
</net>
|
|
)V0G0N";
|
|
compareIRs(model, modelV7);
|
|
} |