From 667d2eb8e6f816a5d84c9e9ef214db61e7847157 Mon Sep 17 00:00:00 2001 From: Wanming Lin Date: Fri, 12 Apr 2024 10:55:44 +0800 Subject: [PATCH] [WebNN EP] Support Gelu op (#20240) --- .../core/providers/webnn/builders/helper.h | 1 + .../builders/impl/activation_op_builder.cc | 21 +++++++++++++++++++ .../providers/webnn/builders/model_builder.cc | 2 ++ .../webnn/builders/op_builder_factory.cc | 1 + 4 files changed, 25 insertions(+) diff --git a/onnxruntime/core/providers/webnn/builders/helper.h b/onnxruntime/core/providers/webnn/builders/helper.h index d7892fe02c..d1d7804332 100644 --- a/onnxruntime/core/providers/webnn/builders/helper.h +++ b/onnxruntime/core/providers/webnn/builders/helper.h @@ -179,6 +179,7 @@ static const InlinedHashMap op_map = { {"Flatten", {"reshape", true}}, {"Floor", {"floor", true}}, {"Gather", {"gather", false}}, + {"Gelu", {"gelu", false}}, {"Gemm", {"gemm", true}}, {"GlobalAveragePool", {"averagePool2d", true}}, {"GlobalMaxPool", {"maxPool2d", true}}, diff --git a/onnxruntime/core/providers/webnn/builders/impl/activation_op_builder.cc b/onnxruntime/core/providers/webnn/builders/impl/activation_op_builder.cc index 78dd9d9fee..6dacd749b8 100644 --- a/onnxruntime/core/providers/webnn/builders/impl/activation_op_builder.cc +++ b/onnxruntime/core/providers/webnn/builders/impl/activation_op_builder.cc @@ -17,6 +17,10 @@ class ActivationOpBuilder : public BaseOpBuilder { private: Status AddToModelBuilderImpl(ModelBuilder& model_builder, const Node& node, const logging::Logger& logger) const override ORT_MUST_USE_RESULT; + + // Operator support related. + bool IsOpSupportedImpl(const InitializedTensorSet& initializers, const Node& node, + WebnnDeviceType /* device_type */, const logging::Logger& logger) const override; }; // Add operator related. @@ -37,6 +41,8 @@ Status ActivationOpBuilder::AddToModelBuilderImpl(ModelBuilder& model_builder, if (op_type == "Elu") { options.set("alpha", helper.Get("alpha", 1.0f)); output = model_builder.GetBuilder().call("elu", input, options); + } else if (op_type == "Gelu") { + output = model_builder.GetBuilder().call("gelu", input, options); } else if (op_type == "HardSigmoid") { options.set("alpha", helper.Get("alpha", 0.2f)); options.set("beta", helper.Get("beta", 0.5f)); @@ -66,6 +72,20 @@ Status ActivationOpBuilder::AddToModelBuilderImpl(ModelBuilder& model_builder, return Status::OK(); } +// Operator support related. +bool ActivationOpBuilder::IsOpSupportedImpl(const InitializedTensorSet& /* initializers */, + const Node& node, + WebnnDeviceType /* device_type */, + const logging::Logger& logger) const { + const auto& input_defs = node.InputDefs(); + + std::vector input_shape; + if (!GetShape(*input_defs[0], input_shape, logger)) + return false; + + return true; +} + void CreateActivationOpBuilder(const std::string& op_type, OpBuilderRegistrations& op_registrations) { if (op_registrations.op_builder_map.count(op_type) > 0) return; @@ -73,6 +93,7 @@ void CreateActivationOpBuilder(const std::string& op_type, OpBuilderRegistration static std::vector op_types = { "Elu", + "Gelu", "HardSigmoid", "HardSwish", "LeakyRelu", diff --git a/onnxruntime/core/providers/webnn/builders/model_builder.cc b/onnxruntime/core/providers/webnn/builders/model_builder.cc index 1bfc73ddf0..cb6669ecba 100644 --- a/onnxruntime/core/providers/webnn/builders/model_builder.cc +++ b/onnxruntime/core/providers/webnn/builders/model_builder.cc @@ -99,6 +99,8 @@ void ModelBuilder::PreprocessActivations() { emscripten::val options = emscripten::val::object(); options.set("alpha", helper.Get("alpha", 1.0f)); activation_nodes_.emplace(node->Index(), wnn_builder_.call("elu", options)); + } else if (op_type == "Gelu") { + activation_nodes_.emplace(node->Index(), wnn_builder_.call("gelu")); } else if (op_type == "HardSigmoid") { NodeAttrHelper helper(*node); emscripten::val options = emscripten::val::object(); diff --git a/onnxruntime/core/providers/webnn/builders/op_builder_factory.cc b/onnxruntime/core/providers/webnn/builders/op_builder_factory.cc index 46d20a94de..c39a5510cf 100644 --- a/onnxruntime/core/providers/webnn/builders/op_builder_factory.cc +++ b/onnxruntime/core/providers/webnn/builders/op_builder_factory.cc @@ -47,6 +47,7 @@ static OpBuilderRegistrations CreateOpBuilderRegistrations() { { // Activations CreateActivationOpBuilder("Elu", op_registrations); + CreateActivationOpBuilder("Gelu", op_registrations); CreateActivationOpBuilder("HardSigmoid", op_registrations); CreateActivationOpBuilder("HardSwish", op_registrations); CreateActivationOpBuilder("LeakyRelu", op_registrations);