diff --git a/onnxruntime/core/codegen/mti/math/unary_ops.cc b/onnxruntime/core/codegen/mti/math/unary_ops.cc index a9b1807298..ae732ea33e 100644 --- a/onnxruntime/core/codegen/mti/math/unary_ops.cc +++ b/onnxruntime/core/codegen/mti/math/unary_ops.cc @@ -30,7 +30,7 @@ tvm::Tensor Ceil(const tvm::Tensor& X, const std::string& name) { return topi::ceil(X, name); } -tvm::Tensor Clip(const tvm::Tensor& X, float min_value, float max_value, const std::string& name) { +tvm::Tensor Clip(const tvm::Tensor& X, tvm::Expr min_value, tvm::Expr max_value, const std::string& name) { auto Y = tvm::compute( X->shape, [&](const tvm::Array& indices) { diff --git a/onnxruntime/core/codegen/mti/math/unary_ops.h b/onnxruntime/core/codegen/mti/math/unary_ops.h index ae1f17099f..aeb336262e 100644 --- a/onnxruntime/core/codegen/mti/math/unary_ops.h +++ b/onnxruntime/core/codegen/mti/math/unary_ops.h @@ -11,7 +11,7 @@ namespace tvm_codegen { tvm::Tensor Abs(const tvm::Tensor& X, const std::string& name = "abs"); tvm::Tensor Affine(const tvm::Tensor& X, float alpha, float beta, const std::string& name = "affine"); tvm::Tensor Ceil(const tvm::Tensor& X, const std::string& name = "ceil"); -tvm::Tensor Clip(const tvm::Tensor& X, float min_value, float max_value, const std::string& name = "clip"); +tvm::Tensor Clip(const tvm::Tensor& X, tvm::Expr min_value, tvm::Expr max_value, const std::string& name = "clip"); tvm::Tensor Elu(const tvm::Tensor& X, float alpha, const std::string& name = "elu"); tvm::Tensor Exp(const tvm::Tensor& X, const std::string& name = "exp"); tvm::Tensor Floor(const tvm::Tensor& X, const std::string& name = "floor"); diff --git a/onnxruntime/core/codegen/passes/op_ir_creator/math/clip.cc b/onnxruntime/core/codegen/passes/op_ir_creator/math/clip.cc index 88383624f8..1a905f6104 100644 --- a/onnxruntime/core/codegen/passes/op_ir_creator/math/clip.cc +++ b/onnxruntime/core/codegen/passes/op_ir_creator/math/clip.cc @@ -13,14 +13,31 @@ namespace tvm_codegen { Status GENERIC_OP_IR_CREATOR_CLASS(Clip)::Evaluate( const tvm::Array& inputs, const Node& node, - CodeGenContext&, + CodeGenContext& ctx_codegen, tvm::Array& outputs) { ProtoHelperNodeContext ctx(node); OpNodeProtoHelper info(&ctx); - float max_value, min_value; - ORT_RETURN_IF_ERROR(info.GetAttr("max", &max_value)); - ORT_RETURN_IF_ERROR(info.GetAttr("min", &min_value)); + int version = ctx_codegen.GetCodeGenHandle()->domain_version_lookup_func(node.Domain()); + tvm::Expr min_value, max_value; + if (version < 11) { + float max_v, min_v; + info.GetAttrOrDefault("min", &min_v, std::numeric_limits::lowest()); + info.GetAttrOrDefault("max", &max_v, std::numeric_limits::max()); + min_value = tvm::make_const(tvm::Float(32), min_v); + max_value = tvm::make_const(tvm::Float(32), max_v); + } else { + // for op_version >= 11, max and min are optional inputs + min_value = tvm::make_const(tvm::Float(32), std::numeric_limits::lowest()); + max_value = tvm::make_const(tvm::Float(32), std::numeric_limits::max()); + auto num_inputs = inputs.size(); + if (num_inputs >= 2) { + min_value = inputs[1](); + } + if (num_inputs == 3) { + max_value = inputs[2](); + } + } tvm::Tensor Y = Clip(inputs[0], min_value, max_value, node.Name() + "_Clip"); outputs.push_back(Y); diff --git a/onnxruntime/core/providers/nuphar/kernel.h b/onnxruntime/core/providers/nuphar/kernel.h index b6f6833e3a..53bc29eb32 100644 --- a/onnxruntime/core/providers/nuphar/kernel.h +++ b/onnxruntime/core/providers/nuphar/kernel.h @@ -83,7 +83,8 @@ class NupharKernelState { NUPHAR_OP(AveragePool, 10, DataTypeImpl::AllIEEEFloatTensorExceptHalfTypes()) \ NUPHAR_OP(AveragePool, 11, DataTypeImpl::AllIEEEFloatTensorExceptHalfTypes()) \ NUPHAR_OP(Ceil, 6, DataTypeImpl::AllIEEEFloatTensorTypes()) \ - NUPHAR_OP(Clip, 6, DataTypeImpl::AllIEEEFloatTensorTypes()) \ + NUPHAR_VERSIONED_OP(Clip, 6, 10, DataTypeImpl::AllIEEEFloatTensorTypes()) \ + NUPHAR_VERSIONED_OP(Clip, 11, 11, DataTypeImpl::AllIEEEFloatTensorTypes()) \ NUPHAR_VERSIONED_OP(Concat, 4, 10, DataTypeImpl::AllFixedSizeTensorTypes()) \ NUPHAR_OP(Concat, 11, DataTypeImpl::AllFixedSizeTensorTypes()) \ DISABLE_MACRO(NUPHAR_OP(Conv, 1, DataTypeImpl::AllIEEEFloatTensorExceptHalfTypes())) \ diff --git a/onnxruntime/core/providers/nuphar/partition/partitioner.cc b/onnxruntime/core/providers/nuphar/partition/partitioner.cc index 45ac6a39cc..462ceaa523 100644 --- a/onnxruntime/core/providers/nuphar/partition/partitioner.cc +++ b/onnxruntime/core/providers/nuphar/partition/partitioner.cc @@ -256,6 +256,7 @@ Status Partitioner::Evaluate(const onnxruntime::GraphViewer& graph, bool disting if (IsNodeSupported(*node)) { AcceptNode(graph, node_idx); } else { + LOGS_DEFAULT(INFO) << "unsupported node (" << node->Name() << ") in nuphar provider"; RejectNode(graph, node_idx); } }