Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions onnxruntime/core/providers/coreml/builders/impl/base_op_builder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -56,20 +56,27 @@ bool BaseOpBuilder::IsOpSupported(const Node& node, const OpBuilderInputParams&
}

if (!HasSupportedOpSet(node, logger)) {
LOGS(logger, VERBOSE) << "Operator [" << node.OpType() << "] does not support this opset";
return false;
}

if (!HasSupportedInputs(node, input_params, logger)) {
LOGS(logger, VERBOSE) << "Operator [" << node.OpType() << "] has unsupported inputs";
return false;
}

// We do not support external initializers for now
const auto& initializers = input_params.graph_viewer.GetAllInitializedTensors();
if (HasExternalInitializer(initializers, node, logger)) {
LOGS(logger, VERBOSE) << "Operator [" << node.OpType() << "] has external initializers";
return false;
}

return IsOpSupportedImpl(node, input_params, logger);
if (!IsOpSupportedImpl(node, input_params, logger)) {
LOGS(logger, VERBOSE) << "Operator [" << node.OpType() << "] is not supported by the impl";
return false;
}
return true;
}

bool BaseOpBuilder::HasSupportedInputs(const Node& node, const OpBuilderInputParams& input_params,
Expand Down Expand Up @@ -107,8 +114,8 @@ bool BaseOpBuilder::IsInputDtypeSupport(const Node& node, size_t idx,
}

// only MLProgram support FP16
if (input_type == ONNX_NAMESPACE::TensorProto_DataType_FLOAT16) {
return input_params.create_mlprogram;
if (input_params.create_mlprogram && input_type == ONNX_NAMESPACE::TensorProto_DataType_FLOAT16) {
return true;
}

LOGS(logger, VERBOSE) << "[" << node.OpType() << "] Input type: [" << input_type << "] is not currently supported";
Expand Down
30 changes: 15 additions & 15 deletions onnxruntime/core/providers/coreml/builders/impl/clip_op_builder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -98,26 +98,24 @@ Status ClipOpBuilder::AddToModelBuilderImpl(ModelBuilder& model_builder,
const bool min_max_attribs = node.SinceVersion() < 11;
std::string_view min_name;
if (input_dtype == ONNX_NAMESPACE::TensorProto_DataType_FLOAT) {
min_name = min_max_attribs ? model_builder.AddScalarConstant(clip_op.type(), "min", min)
: node.InputDefs()[1]->Name();
min_name = (min_max_attribs || !has_min) ? model_builder.AddScalarConstant(clip_op.type(), "min", min)
: node.InputDefs()[1]->Name();
} else {
min_name = min_max_attribs ? model_builder.AddScalarConstant(clip_op.type(), "min", MLFloat16(min))
: node.InputDefs()[1]->Name();
min_name = (min_max_attribs || !has_min) ? model_builder.AddScalarConstant(clip_op.type(), "min", MLFloat16(min))
: node.InputDefs()[1]->Name();
}

AddOperationInput(clip_op, "alpha", min_name);

if (has_max) {
std::string_view max_name;
if (input_dtype == ONNX_NAMESPACE::TensorProto_DataType_FLOAT) {
max_name = min_max_attribs ? model_builder.AddScalarConstant(clip_op.type(), "max", max)
: node.InputDefs()[2]->Name();
} else {
max_name = min_max_attribs ? model_builder.AddScalarConstant(clip_op.type(), "max", MLFloat16(max))
: node.InputDefs()[2]->Name();
}
AddOperationInput(clip_op, "beta", max_name);
std::string_view max_name;
if (input_dtype == ONNX_NAMESPACE::TensorProto_DataType_FLOAT) {
max_name = (min_max_attribs || !has_max) ? model_builder.AddScalarConstant(clip_op.type(), "max", max)
: node.InputDefs()[2]->Name();
} else {
max_name = (min_max_attribs || !has_max) ? model_builder.AddScalarConstant(clip_op.type(), "max", MLFloat16(max))
: node.InputDefs()[2]->Name();
}
AddOperationInput(clip_op, "beta", max_name);
}
}

Expand Down Expand Up @@ -200,7 +198,9 @@ Status ClipOpBuilder::AddToModelBuilderImpl(ModelBuilder& model_builder,
bool ClipOpBuilder::IsOpSupportedImpl(const Node& node, const OpBuilderInputParams& input_params,
const logging::Logger& logger) const {
float min, max;
return GetClipMinMax(input_params.graph_viewer, node, min, max, logger);
bool ret = GetClipMinMax(input_params.graph_viewer, node, min, max, logger);
// what does it mean if min == max?
return ret && (min != max);
}

void CreateClipOpBuilder(const std::string& op_type, OpBuilderRegistrations& op_registrations) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
#include "core/providers/coreml/builders/op_builder_factory.h"
#include "core/providers/shared/utils/utils.h"

#ifdef __APPLE__
#include <TargetConditionals.h>
#endif

namespace onnxruntime {
namespace coreml {

Expand Down Expand Up @@ -128,6 +132,17 @@ bool ReductionOpBuilder::IsOpSupportedImpl(const Node& node, const OpBuilderInpu
(node.OpType() == "ReduceMax" || node.OpType() == "ReduceMin" || node.OpType() == "ReduceProd")) {
return false;
}

#if defined(TARGET_OS_IOS) && defined(TARGET_CPU_X86_64)
// to pass https://dev.azure.com/onnxruntime/onnxruntime/_build/results?buildId=1563483&view=logs&j=f7cc61a9-cc70-56e7-b06c-4668ca17e426
// ReductionOpTest.ReduceSum_half_bert
int32_t input_type;
GetType(*input_defs[0], input_type, logger);
if (node.OpType() == "ReduceSum" && input_type == ONNX_NAMESPACE::TensorProto_DataType_FLOAT16) {
return false;
}
#endif

NodeAttrHelper helper(node);

// noop_with_empty_axes defaults to false and is only available in newer opsets where 'axes' is an optional input
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ Status SplitOpBuilder::AddToModelBuilderImpl(ModelBuilder& model_builder,
auto calculate_remainder_and_chunk_size = [&](int32_t num_outputs) {
// note: checked in IsOpSupportedImpl that ensures the dim value at splitting axis exists
auto split_dim_size = data_shape[HandleNegativeAxis(axis, data_shape.size())];
uint64_t chunk_size = (split_dim_size + num_outputs - 1) / num_outputs;
uint64_t remainder = split_dim_size % chunk_size;
int64_t chunk_size = (split_dim_size + num_outputs - 1) / num_outputs;
int64_t remainder = split_dim_size % chunk_size;
return std::make_tuple(remainder, chunk_size);
};

Expand Down Expand Up @@ -106,20 +106,20 @@ Status SplitOpBuilder::AddToModelBuilderImpl(ModelBuilder& model_builder,
// if "split" is explicitly provided as an input
// const auto& split_tensor = *model_builder.GetInitializerTensors().at(input_defs[1]->Name());
Initializer unpacked_tensor(*model_builder.GetConstantInitializer(input_defs[1]->Name()));
auto split_span = unpacked_tensor.DataAsSpan<uint64_t>();
auto split_span = unpacked_tensor.DataAsSpan<int64_t>();
for (const auto& split_size : split_span) {
coreml_splitnd->add_splitsizes(split_size);
}
} else if (node.SinceVersion() < 18) {
uint64_t num_outputs = narrow<uint64_t>(node.OutputDefs().size());
int64_t num_outputs = narrow<int64_t>(node.OutputDefs().size());
coreml_splitnd->set_numsplits(num_outputs);
} else {
// note: for opset 18+ 'num_outputs' is a required attribute
uint64_t num_outputs = narrow<uint64_t>(helper.GetInt64("num_outputs").value());
int64_t num_outputs = narrow<int64_t>(helper.GetInt64("num_outputs").value());
auto [remainder, chunk_size] = calculate_remainder_and_chunk_size(static_cast<int32_t>(num_outputs));
if (remainder) {
// uneven
auto split_sizes = InlinedVector<uint64_t>(num_outputs, chunk_size);
auto split_sizes = InlinedVector<int64_t>(num_outputs, chunk_size);
split_sizes.back() = remainder;
for (size_t i = 0; i < split_sizes.size(); i++) {
coreml_splitnd->add_splitsizes(split_sizes[i]);
Expand Down Expand Up @@ -162,7 +162,7 @@ bool SplitOpBuilder::IsOpSupportedImpl(const Node& node, const OpBuilderInputPar
}

const auto split_shape = *input_defs[1]->Shape();
if (split_shape.dim_size() < 2) {
if (split_shape.dim(0).dim_value() < 2) {
LOGS(logger, VERBOSE) << "CoreML Split must produce at least 2 outputs.";
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2438,13 +2438,9 @@ void test_half_reduce_sum(
}

TEST(ReductionOpTest, ReduceSum_half_bert) {
std::cout << "111111111111111111111111111111\n";
test_half_reduce_sum(6 * 128, 128);
std::cout << "2222222222222222222222222222\n";
test_half_reduce_sum(8 * 128, 128);
std::cout << "3333333333333333333333333333333333\n";
test_half_reduce_sum(6 * 384, 128);
std::cout << "444444444444444444444444444444\n";
test_half_reduce_sum(8 * 384, 128);
}

Expand Down