From 9073f7a5c3e7f5147682567f7217cd1a63c8fd2e Mon Sep 17 00:00:00 2001 From: Ye Wang <52801275+wangyems@users.noreply.github.com> Date: Tue, 2 Mar 2021 12:33:40 -0800 Subject: [PATCH] support opset13 in embednorm (#6866) --- .../core/optimizer/embed_layer_norm_fusion.cc | 16 +- .../test/optimizer/graph_transform_test.cc | 147 +++++++++++++----- ...ed_layer_norm_format3_no_cast_opset13.onnx | Bin 0 -> 2370 bytes .../embed_layer_norm_format3_opset13.onnx | Bin 0 -> 2415 bytes .../embed_layer_norm_format5_opset13.onnx | Bin 0 -> 1704 bytes .../embed_layer_norm_format6_opset13.onnx | Bin 0 -> 2637 bytes .../embed_layer_norm_format7_opset13.onnx | Bin 0 -> 1869 bytes .../embed_layer_norm_format8_opset13.onnx | Bin 0 -> 1879 bytes .../embed_layer_norm_format9_opset13.onnx | Bin 0 -> 2258 bytes .../embed_layer_norm_multiple_opset13.onnx | Bin 0 -> 4233 bytes 10 files changed, 117 insertions(+), 46 deletions(-) create mode 100644 onnxruntime/test/testdata/transform/fusion/embed_layer_norm_format3_no_cast_opset13.onnx create mode 100644 onnxruntime/test/testdata/transform/fusion/embed_layer_norm_format3_opset13.onnx create mode 100644 onnxruntime/test/testdata/transform/fusion/embed_layer_norm_format5_opset13.onnx create mode 100644 onnxruntime/test/testdata/transform/fusion/embed_layer_norm_format6_opset13.onnx create mode 100644 onnxruntime/test/testdata/transform/fusion/embed_layer_norm_format7_opset13.onnx create mode 100644 onnxruntime/test/testdata/transform/fusion/embed_layer_norm_format8_opset13.onnx create mode 100644 onnxruntime/test/testdata/transform/fusion/embed_layer_norm_format9_opset13.onnx create mode 100644 onnxruntime/test/testdata/transform/fusion/embed_layer_norm_multiple_opset13.onnx diff --git a/onnxruntime/core/optimizer/embed_layer_norm_fusion.cc b/onnxruntime/core/optimizer/embed_layer_norm_fusion.cc index eb1cd9e85c..904714c87b 100644 --- a/onnxruntime/core/optimizer/embed_layer_norm_fusion.cc +++ b/onnxruntime/core/optimizer/embed_layer_norm_fusion.cc @@ -112,10 +112,10 @@ static bool MatchInputToConcatSubgraph( const logging::Logger& logger, const NodeIndex expected_gather_node_1_index) { std::vector expand_parent_path1{ - {0, index, "Concat", {4, 11}, kOnnxDomain}, - {0, 0, "Unsqueeze", {1, 11}, kOnnxDomain}, - {0, 0, "Gather", {1, 11}, kOnnxDomain}, - {0, 0, "Shape", {1}, kOnnxDomain}, + {0, index, "Concat", {4, 11, 13}, kOnnxDomain}, + {0, 0, "Unsqueeze", {1, 11, 13}, kOnnxDomain}, + {0, 0, "Gather", {1, 11, 13}, kOnnxDomain}, + {0, 0, "Shape", {1, 13}, kOnnxDomain}, }; std::vector edges; @@ -145,9 +145,9 @@ static bool MatchInputToConcatSubgraph( } std::vector concat_parent_path{ - {0, 1, "Unsqueeze", {1, 11}, kOnnxDomain}, - {0, 0, "Gather", {1, 11}, kOnnxDomain}, - {0, 0, "Shape", {1}, kOnnxDomain}}; + {0, 1, "Unsqueeze", {1, 11, 13}, kOnnxDomain}, + {0, 0, "Gather", {1, 11, 13}, kOnnxDomain}, + {0, 0, "Shape", {1, 13}, kOnnxDomain}}; if (!graph_utils::FindPath(concat_node, true, concat_parent_path, edges, logger)) { DEBUG_LOG("Failed to find path 2 of position shape."); @@ -316,7 +316,7 @@ static bool MatchPositionEmbeddingSubgraphsFromGather( // Match Shape --> Expand path. std::vector pg_edges_2; - if (!graph_utils::FindPath(expand_node, true, {{0, 1, "Shape", {1}, kOnnxDomain}}, pg_edges_2, logger)) { + if (!graph_utils::FindPath(expand_node, true, {{0, 1, "Shape", {1, 13}, kOnnxDomain}}, pg_edges_2, logger)) { DEBUG_LOG("Failed to match Shape node. "); return false; } diff --git a/onnxruntime/test/optimizer/graph_transform_test.cc b/onnxruntime/test/optimizer/graph_transform_test.cc index 9a01db9ee4..18e58e7efa 100644 --- a/onnxruntime/test/optimizer/graph_transform_test.cc +++ b/onnxruntime/test/optimizer/graph_transform_test.cc @@ -2897,15 +2897,47 @@ TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat2) { ASSERT_TRUE(op_to_count["com.microsoft.EmbedLayerNormalization"] == 1); } -TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat3) { - auto model_uri = MODEL_FOLDER "fusion/embed_layer_norm_format3.onnx"; +static void EmbedLayerNormFusionFormat3(const std::basic_string& file_path, logging::Logger* logger) { std::shared_ptr p_model; - ASSERT_STATUS_OK(Model::Load(model_uri, p_model, nullptr, *logger_)); + ASSERT_TRUE(Model::Load(file_path, p_model, nullptr, *logger).IsOK()); Graph& graph = p_model->MainGraph(); onnxruntime::GraphTransformerManager graph_transformation_mgr{5}; graph_transformation_mgr.Register(onnxruntime::make_unique(), TransformerLevel::Level2); - auto ret = graph_transformation_mgr.ApplyTransformers(graph, TransformerLevel::Level2, *logger_); + auto ret = graph_transformation_mgr.ApplyTransformers(graph, TransformerLevel::Level2, *logger); + ASSERT_TRUE(ret.IsOK()); + + std::map op_to_count = CountOpsInGraph(graph); + EXPECT_EQ(op_to_count["Shape"], 0); + EXPECT_EQ(op_to_count["Expand"], 0); + EXPECT_EQ(op_to_count["Gather"], 0); + EXPECT_EQ(op_to_count["Unsqueeze"], 0); + EXPECT_EQ(op_to_count["LayerNormalization"], 0); + EXPECT_EQ(op_to_count["com.microsoft.SkipLayerNormalization"], 0); + EXPECT_EQ(op_to_count["ReduceSum"], 1); + EXPECT_EQ(op_to_count["MatMul"], 1); + EXPECT_EQ(op_to_count["Add"], 2); + EXPECT_EQ(op_to_count["Cast"], 3); + EXPECT_EQ(op_to_count["com.microsoft.Attention"], 1); + EXPECT_EQ(op_to_count["com.microsoft.EmbedLayerNormalization"], 1); +} + +TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat3) { + EmbedLayerNormFusionFormat3(MODEL_FOLDER "fusion/embed_layer_norm_format3.onnx", logger_.get()); +} + +TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat3_OpSet13) { + EmbedLayerNormFusionFormat3(MODEL_FOLDER "fusion/embed_layer_norm_format3_opset13.onnx", logger_.get()); +} + +static void EmbedLayerNormFusionFormat3NoCast(const std::basic_string& file_path, logging::Logger* logger) { + std::shared_ptr p_model; + ASSERT_TRUE(Model::Load(file_path, p_model, nullptr, *logger).IsOK()); + Graph& graph = p_model->MainGraph(); + + onnxruntime::GraphTransformerManager graph_transformation_mgr{5}; + graph_transformation_mgr.Register(onnxruntime::make_unique(), TransformerLevel::Level2); + auto ret = graph_transformation_mgr.ApplyTransformers(graph, TransformerLevel::Level2, *logger); ASSERT_TRUE(ret.IsOK()); std::map op_to_count = CountOpsInGraph(graph); @@ -2924,29 +2956,11 @@ TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat3) { } TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat3NoCast) { - auto model_uri = MODEL_FOLDER "fusion/embed_layer_norm_format3_no_cast.onnx"; - std::shared_ptr p_model; - ASSERT_STATUS_OK(Model::Load(model_uri, p_model, nullptr, *logger_)); - Graph& graph = p_model->MainGraph(); + EmbedLayerNormFusionFormat3NoCast(MODEL_FOLDER "fusion/embed_layer_norm_format3_no_cast.onnx", logger_.get()); +} - onnxruntime::GraphTransformerManager graph_transformation_mgr{5}; - graph_transformation_mgr.Register(onnxruntime::make_unique(), TransformerLevel::Level2); - auto ret = graph_transformation_mgr.ApplyTransformers(graph, TransformerLevel::Level2, *logger_); - ASSERT_TRUE(ret.IsOK()); - - std::map op_to_count = CountOpsInGraph(graph); - EXPECT_EQ(op_to_count["Shape"], 0); - EXPECT_EQ(op_to_count["Expand"], 0); - EXPECT_EQ(op_to_count["Gather"], 0); - EXPECT_EQ(op_to_count["Unsqueeze"], 0); - EXPECT_EQ(op_to_count["LayerNormalization"], 0); - EXPECT_EQ(op_to_count["com.microsoft.SkipLayerNormalization"], 0); - EXPECT_EQ(op_to_count["ReduceSum"], 1); - EXPECT_EQ(op_to_count["MatMul"], 1); - EXPECT_EQ(op_to_count["Add"], 2); - EXPECT_EQ(op_to_count["Cast"], 3); - EXPECT_EQ(op_to_count["com.microsoft.Attention"], 1); - EXPECT_EQ(op_to_count["com.microsoft.EmbedLayerNormalization"], 1); +TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat3NoCast_OpSet13) { + EmbedLayerNormFusionFormat3NoCast(MODEL_FOLDER "fusion/embed_layer_norm_format3_no_cast_opset13.onnx", logger_.get()); } TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat4) { @@ -2977,15 +2991,14 @@ TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat4) { ASSERT_TRUE(op_to_count["com.microsoft.EmbedLayerNormalization"] == 1); } -TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat5) { - auto model_uri = MODEL_FOLDER "fusion/embed_layer_norm_format5.onnx"; +static void EmbedLayerNormFusionFormat5(const std::basic_string& file_path, logging::Logger* logger) { std::shared_ptr p_model; - ASSERT_STATUS_OK(Model::Load(model_uri, p_model, nullptr, *logger_)); + ASSERT_TRUE(Model::Load(file_path, p_model, nullptr, *logger).IsOK()); Graph& graph = p_model->MainGraph(); onnxruntime::GraphTransformerManager graph_transformation_mgr{5}; graph_transformation_mgr.Register(onnxruntime::make_unique(), TransformerLevel::Level2); - auto ret = graph_transformation_mgr.ApplyTransformers(graph, TransformerLevel::Level2, *logger_); + auto ret = graph_transformation_mgr.ApplyTransformers(graph, TransformerLevel::Level2, *logger); ASSERT_TRUE(ret.IsOK()); std::map op_to_count = CountOpsInGraph(graph); @@ -3019,15 +3032,22 @@ TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat5) { } } -TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat6) { - auto model_uri = MODEL_FOLDER "fusion/embed_layer_norm_format6.onnx"; +TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat5) { + EmbedLayerNormFusionFormat5(MODEL_FOLDER "fusion/embed_layer_norm_format5.onnx", logger_.get()); +} + +TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat5_OpSet13) { + EmbedLayerNormFusionFormat5(MODEL_FOLDER "fusion/embed_layer_norm_format5_opset13.onnx", logger_.get()); +} + +static void EmbedLayerNormFusionFormat6(const std::basic_string& file_path, logging::Logger* logger) { std::shared_ptr p_model; - ASSERT_STATUS_OK(Model::Load(model_uri, p_model, nullptr, *logger_)); + ASSERT_TRUE(Model::Load(file_path, p_model, nullptr, *logger).IsOK()); Graph& graph = p_model->MainGraph(); onnxruntime::GraphTransformerManager graph_transformation_mgr{5}; graph_transformation_mgr.Register(onnxruntime::make_unique(), TransformerLevel::Level2); - auto ret = graph_transformation_mgr.ApplyTransformers(graph, TransformerLevel::Level2, *logger_); + auto ret = graph_transformation_mgr.ApplyTransformers(graph, TransformerLevel::Level2, *logger); ASSERT_TRUE(ret.IsOK()); std::map op_to_count = CountOpsInGraph(graph); @@ -3048,6 +3068,14 @@ TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat6) { EXPECT_EQ(op_to_count["com.microsoft.EmbedLayerNormalization"], 1); } +TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat6) { + EmbedLayerNormFusionFormat6(MODEL_FOLDER "fusion/embed_layer_norm_format6.onnx", logger_.get()); +} + +TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat6_OpSet13) { + EmbedLayerNormFusionFormat6(MODEL_FOLDER "fusion/embed_layer_norm_format6_opset13.onnx", logger_.get()); +} + static void TestEmbedLayerNormFusionDistilBert(const std::basic_string& model_uri, std::map& op_to_count, logging::Logger* logger) { @@ -3076,6 +3104,18 @@ TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat7) { EXPECT_EQ(op_to_count["ReduceSum"], 1); } +TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat7_OpSet13) { + std::map op_to_count; + TestEmbedLayerNormFusionDistilBert(MODEL_FOLDER "fusion/embed_layer_norm_format7_opset13.onnx", op_to_count, logger_.get()); + EXPECT_EQ(op_to_count["com.microsoft.EmbedLayerNormalization"], 1); + EXPECT_EQ(op_to_count["com.microsoft.Attention"], 1); + EXPECT_EQ(op_to_count["Cast"], 2); + EXPECT_EQ(op_to_count["Shape"], 0); + EXPECT_EQ(op_to_count["Gather"], 0); + EXPECT_EQ(op_to_count["Unsqueeze"], 0); + EXPECT_EQ(op_to_count["ReduceSum"], 1); +} + TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat8) { std::map op_to_count; TestEmbedLayerNormFusionDistilBert(MODEL_FOLDER "fusion/embed_layer_norm_format8.onnx", op_to_count, logger_.get()); @@ -3088,6 +3128,18 @@ TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat8) { EXPECT_EQ(op_to_count["ReduceSum"], 1); } +TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat8_OpSet13) { + std::map op_to_count; + TestEmbedLayerNormFusionDistilBert(MODEL_FOLDER "fusion/embed_layer_norm_format8_opset13.onnx", op_to_count, logger_.get()); + EXPECT_EQ(op_to_count["com.microsoft.EmbedLayerNormalization"], 1); + EXPECT_EQ(op_to_count["com.microsoft.Attention"], 1); + EXPECT_EQ(op_to_count["Cast"], 2); + EXPECT_EQ(op_to_count["Shape"], 0); + EXPECT_EQ(op_to_count["Gather"], 0); + EXPECT_EQ(op_to_count["Unsqueeze"], 0); + EXPECT_EQ(op_to_count["ReduceSum"], 1); +} + TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat9) { std::map op_to_count; TestEmbedLayerNormFusionDistilBert(MODEL_FOLDER "fusion/embed_layer_norm_format9.onnx", op_to_count, logger_.get()); @@ -3100,15 +3152,26 @@ TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat9) { EXPECT_EQ(op_to_count["ReduceSum"], 1); } -TEST_F(GraphTransformationTests, EmbedLayerNormFusionMultiple) { - auto model_uri = MODEL_FOLDER "fusion/embed_layer_norm_multiple.onnx"; +TEST_F(GraphTransformationTests, EmbedLayerNormFusionFormat9_OpSet13) { + std::map op_to_count; + TestEmbedLayerNormFusionDistilBert(MODEL_FOLDER "fusion/embed_layer_norm_format9_opset13.onnx", op_to_count, logger_.get()); + EXPECT_EQ(op_to_count["com.microsoft.EmbedLayerNormalization"], 1); + EXPECT_EQ(op_to_count["com.microsoft.Attention"], 1); + EXPECT_EQ(op_to_count["Cast"], 2); + EXPECT_EQ(op_to_count["Shape"], 1); + EXPECT_EQ(op_to_count["Gather"], 2); + EXPECT_EQ(op_to_count["Unsqueeze"], 2); + EXPECT_EQ(op_to_count["ReduceSum"], 1); +} + +static void EmbedLayerNormFusionFormatMultiple(const std::basic_string& file_path, logging::Logger* logger) { std::shared_ptr p_model; - ASSERT_STATUS_OK(Model::Load(model_uri, p_model, nullptr, *logger_)); + ASSERT_TRUE(Model::Load(file_path, p_model, nullptr, *logger).IsOK()); Graph& graph = p_model->MainGraph(); onnxruntime::GraphTransformerManager graph_transformation_mgr{5}; graph_transformation_mgr.Register(onnxruntime::make_unique(), TransformerLevel::Level2); - auto ret = graph_transformation_mgr.ApplyTransformers(graph, TransformerLevel::Level2, *logger_); + auto ret = graph_transformation_mgr.ApplyTransformers(graph, TransformerLevel::Level2, *logger); ASSERT_TRUE(ret.IsOK()); std::map op_to_count = CountOpsInGraph(graph); @@ -3126,6 +3189,14 @@ TEST_F(GraphTransformationTests, EmbedLayerNormFusionMultiple) { EXPECT_EQ(op_to_count["com.microsoft.EmbedLayerNormalization"], 2); } +TEST_F(GraphTransformationTests, EmbedLayerNormFusionMultiple) { + EmbedLayerNormFusionFormatMultiple(MODEL_FOLDER "fusion/embed_layer_norm_multiple.onnx", logger_.get()); +} + +TEST_F(GraphTransformationTests, EmbedLayerNormFusionMultiple_OpSet13) { + EmbedLayerNormFusionFormatMultiple(MODEL_FOLDER "fusion/embed_layer_norm_multiple_opset13.onnx", logger_.get()); +} + TEST_F(GraphTransformationTests, DynamicQuantizeMatMulTest) { auto model_uri = MODEL_FOLDER "fusion/dynamic_quantize_matmul.onnx"; std::shared_ptr p_model; diff --git a/onnxruntime/test/testdata/transform/fusion/embed_layer_norm_format3_no_cast_opset13.onnx b/onnxruntime/test/testdata/transform/fusion/embed_layer_norm_format3_no_cast_opset13.onnx new file mode 100644 index 0000000000000000000000000000000000000000..bb1528acd26e8ae1943a9c96f6c25832b3408d36 GIT binary patch literal 2370 zcmdT`&2G~`5RTI{u_w(>7YY@pVkD}r1ZrAPt3pfbsvsnOq*e%ti?xlH#%gSbcuh-B z9C!&h^#OPRZd|yvS6&D9$B8#?P&sfRildot=gWMvJF~J`S^I|IHdubxOPK3>F@m^5 zdbH(63A<5NwmrEgFt`ueqTqObo5t=UsvZ#5q5VZks-%uxej-tL2>Lpd$+0BWlQ4dl zPI4jUJcg9iCfadE#<|@#Y|jlAWl`3ifdgIC)dY_Q@l)EOBeSPa#d))BqC@> zVVf|eSlM=YTVl8hC35V?vxQTm2&+(u8R;{3aj;!VQN^QOM%)&%`XoG{@{cB^X;1D7 z1lAy18dHGUt*n40y?|9su-Z9IFamnqBcZ3nE88ybNDLl;)r(@62K&?lEfCcOta?Ba zA@hg3z7B8{^}Up>bzeim8oR0iL;7RL$3ZSDYDymQJXfR_%{-+e_QaOw@y@hjdXTE9 zaxg^N`Y>=Lc!;_h7U_sJ=UVpYBEsrf|eQK<@uhg)pUdf*ZEA#TY+7u?0=A!X$7z zlz8!Mk!xP7wWHu};J5ox9KB_54+dOO3k#BNnhrtg%KJ~*cKJDB&yy}JfVL{nQ0n43 zc%KQv1UJ+f-{A=qn5#{;gqlgw5=$~1UE2|JG(1fAtvFG(jGN8Mno)4FyH+7ahO}^9 z#SE?w?R4=FR2m`=y6wrDzr@yLPfoZdX yYEVIw`-HVSP&6mr*f4UDkBzxGa`TM~*}o;nTh1xE4l|~KrbqJdTqUR2to;VRQ5Ts2 literal 0 HcmV?d00001 diff --git a/onnxruntime/test/testdata/transform/fusion/embed_layer_norm_format3_opset13.onnx b/onnxruntime/test/testdata/transform/fusion/embed_layer_norm_format3_opset13.onnx new file mode 100644 index 0000000000000000000000000000000000000000..949fb8aeb284797b69305bd4507fb27ee6b12800 GIT binary patch literal 2415 zcmdT`&2G~`5RQ{HwkIS_m%oZrF%nf*0yS+>QGo(RfRHFiR0xTSwT-up)z}X48VV;4 zyab&306YX2Ztayv;5A@>9DCyil>--|*qWK0FZ0dLk7Ah{KM`C7JBWrU^8!CXko3ur zcD*=dml{fTX10Y5Zh&?uFn-XZiMNcJdxZ7rXjy{HOmP~Ir4??2ehv+CAVKXkO5UWD zexM2mh3?od$7j>Xt!U&{%H-r>L9RO{r!vaObx)F$=TpcjTtTj@lY0WCEHqsL5%l7y zN0?%)WT){!+He!<6sj&Hr~ZJyu?6*M+3Q zelj4p!`y(prz0Tl`bij_%(Cbs;C-YU#d85^f!|P$t8^uYy%U})0Sdj}0(?J#vL8i)Osbr_I zMc7t4fF;mQWep`S&V%=v0MxjkYJ80cP{vYjvL)0^ik4WB?&!ipF-LhZypex^sN=bo0yS&zoG{bjuTke;7Qy zGyGD%8Om7z{?EtNhXvo0SuK}u;56OMhYY{^XN8}fEWGfC;)q=+=LpYQhU(?)55?GE zxXRFdy`cZEISX@^iCSQynH|Dq5oCSrYEV&fJXC20R zxYqMNVHNt(Fm(5Lu)QOol~HX5UQ8QGp-g02=2*1ps`P%1&R#D#@I(;x+4WJ~ew{x$ z7LZv`;e#00Z+!bc+dkHHXal4z3B7oiHsr6{^+V$`6Z_~H0*~? z%A}69JJHj)GO_=Yoa{WXWtG)~Vg;^}o$(y8_gEQusxIkvvHO3Qo&4~ynLji~UUzC# zSc~XZwWI6K=+0QbmHlIALY-780fQJwrS&_IzoHAvw{tgG!Fltpnou=rl!8TcT0akr J-?C#^jo(!3;vfJ3 literal 0 HcmV?d00001 diff --git a/onnxruntime/test/testdata/transform/fusion/embed_layer_norm_format6_opset13.onnx b/onnxruntime/test/testdata/transform/fusion/embed_layer_norm_format6_opset13.onnx new file mode 100644 index 0000000000000000000000000000000000000000..3ec2cc47140f9bd189f327ea75f2ff0e77107dac GIT binary patch literal 2637 zcmdT`%Wm676cuHOk1I=-r%q#JQMfFSAOp0pl(cT0+D#a^MS-LRY!m^qA;#jwA}o@! zIBeXkvdB*)t9(E|B8znAZ1X$mJop&WD%t|wR1k&xI-E22&b=es+I_nL*TD(ndB*%O zND-t{GN&Uy$=Eeh$!_;Z*x*ahoB|Vs6Po(lsCPoxlrFX<$jTMh{6SjbThRSrl5+_f zWN~_yQTmK398|jN{8IRqksE8|#!Yh4S&U=-bh`(_3wuzx0G{&dQHiL%3OULl;Zk(Fk3=YZ4OYs?g8AD;aaI1T zfX*24N61-__=L)Bcctid4}}GGp>i!rx2kQG?y;Wk9WA|iolAlU==q$)fy%U!UGqTN z;0`$RB=u=@Oaq>uG7t@fSshpjgi0@u$R5v6vIugt)+%e#tf70Fp@e@A%{XYRiiQ$L zg1{Hci)^pz7I)=d5b!o~QhJiJ=y5Tkv1-|Yuxm7+(n}UQaA^@};E>H3+>*<8grt^z zVL)kz^%?n%F8nxIME+A6o=h36X{O_lq^K_qGDPgeDODFe5a^#cn9RawgoR0rH}W3% zP<#yD40s48ou}M?<@Y~s?7TJ%*a1*8DkAAA>Wg20LQ>UOPN}+```m~fXtQL~6n*tG z)PwUgH$npm;zNv{tI}7x>m1S`o6w^y!fRlkQaTU9C~wp`)OQHIv(sPmY@}cdMdSe* z??)D4itP#)T<0ERynZ4DLvZ3O@~4yp>1LaA-tAA4=!+CR__p1)J43_WYPFt!*J`!y@-Kg$ zi>Ic0T2ta9yCYGTqME3`)4gg=;9LKgO4XS7rsOefuH#+q9DGBCzPq^Cdw20*|JBQv z`&{1lnjMAT8+?1KJSlGs6)XV%&&Si71>cps+Wxnj@yaH{kN&g5*ER2YohFnYYD z|7-gQ)@=**!9v|*!X{H_+bfSQKs&nM9#nijuKheS+P%^0ax=_LoT0Yw(hR0Qwd!K8E2<2Gu@AkHs3l$*d z@?Nsb^D<-6<$2ZRIq4wbTzb-fVdTFc{n70WF%m}oboND4*)m?#i+ah_tl2{0^hKdi zSmR&5PQ{wg?aXAs3;!H7eht_(t1DW;9!-drLbNf`#&zYRMuXBcTMY&LNM6*uaKdx2k^FDTE}GN70r0XRcmMzZ literal 0 HcmV?d00001 diff --git a/onnxruntime/test/testdata/transform/fusion/embed_layer_norm_format8_opset13.onnx b/onnxruntime/test/testdata/transform/fusion/embed_layer_norm_format8_opset13.onnx new file mode 100644 index 0000000000000000000000000000000000000000..39d3b686f11bd21c70a6d46b8665a8d49c8b9cf5 GIT binary patch literal 1879 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 literal 0 HcmV?d00001