Integrate onnx 1.17.0 (#21897)

### Description
<!-- Describe your changes. -->
for ORT 1.21.0 release

Create following related issues to track skipped tests due to updated
ONNX operators in the ONNX 1.17.0 release:
https://github.com/microsoft/onnxruntime/issues/23162
https://github.com/microsoft/onnxruntime/issues/23164
https://github.com/microsoft/onnxruntime/issues/23163
https://github.com/microsoft/onnxruntime/issues/23161

### Motivation and Context
<!-- - Why is this change required? What problem does it solve?
- If it fixes an open issue, please link to the issue here. -->

---------

Signed-off-by: Liqun Fu <liqfu@microsoft.com>
Signed-off-by: Liqun Fu <liqun.fu@microsoft.com>
Co-authored-by: Guenther Schmuelling <guschmue@microsoft.com>
Co-authored-by: Yifan Li <109183385+yf711@users.noreply.github.com>
Co-authored-by: yf711 <yifanl@microsoft.com>
This commit is contained in:
liqun Fu 2024-12-24 09:02:02 -08:00 committed by GitHub
parent 81cd6eacd0
commit a9a881cc98
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
20 changed files with 95 additions and 982 deletions

View file

@ -26,7 +26,7 @@
"component": {
"type": "git",
"git": {
"commitHash": "595228d99e3977ac27cb79d5963adda262af99ad",
"commitHash": "b8baa8446686496da4cc8fda09f2b6fe65c2a02c",
"repositoryUrl": "https://github.com/onnx/onnx.git"
},
"comments": "git submodule at cmake/external/onnx"

View file

@ -35,7 +35,7 @@ microsoft_gsl;https://github.com/microsoft/GSL/archive/refs/tags/v4.0.0.zip;cf36
microsoft_wil;https://github.com/microsoft/wil/archive/refs/tags/v1.0.230629.1.zip;e4a542a323c070376f7c2d1973d0f7ddbc1d2fa5
mimalloc;https://github.com/microsoft/mimalloc/archive/refs/tags/v2.1.1.zip;d5ee7d34223d0567892db5179849939c8769dc41
mp11;https://github.com/boostorg/mp11/archive/refs/tags/boost-1.82.0.zip;9bc9e01dffb64d9e0773b2e44d2f22c51aace063
onnx;https://github.com/onnx/onnx/archive/refs/tags/v1.16.1.zip;2eb9198bb352757d5ff13977cbe0634898e0837c
onnx;https://github.com/onnx/onnx/archive/refs/tags/v1.17.0.zip;13a60ac5217c104139ce0fd024f48628e7bcf5bc
# Use the latest commit of 10.7-GA
onnx_tensorrt;https://github.com/onnx/onnx-tensorrt/archive/9c69a24bc2e20c8a511a4e6b06fd49639ec5300a.zip;ff1fe9af78eb129b4a4cdcb7450b7390b4436dd3
protobuf;https://github.com/protocolbuffers/protobuf/archive/refs/tags/v21.12.zip;7cf2733949036c7d52fda017badcab093fe73bfa

2
cmake/external/onnx vendored

@ -1 +1 @@
Subproject commit 595228d99e3977ac27cb79d5963adda262af99ad
Subproject commit b8baa8446686496da4cc8fda09f2b6fe65c2a02c

View file

@ -86,944 +86,3 @@ index 0aab3e26..398ac2d6 100644
+#endif
+
#endif // ! ONNX_ONNX_PB_H
diff --git a/onnx/defs/math/defs.cc b/onnx/defs/math/defs.cc
index c315a2a7..58963154 100644
--- a/onnx/defs/math/defs.cc
+++ b/onnx/defs/math/defs.cc
@@ -3472,6 +3472,9 @@ ONNX_OPERATOR_SET_SCHEMA(
}
auto& input_shape = getInputShape(ctx, 0);
+ if (input_shape.dim_size() < 2) {
+ fail_shape_inference("First input should have at least 2 dimensions in ", ctx.getDisplayName(), ".");
+ }
auto signal_dim = input_shape.dim(1);
if (!signal_dim.has_dim_value()) {
return;
diff --git a/onnx/defs/nn/defs.cc b/onnx/defs/nn/defs.cc
index be6a851d..fad595d0 100644
--- a/onnx/defs/nn/defs.cc
+++ b/onnx/defs/nn/defs.cc
@@ -126,6 +126,9 @@ void convPoolShapeInference(
residual -= stride;
}
}
+ if (i >= static_cast<int>(effective_kernel_shape.size())) {
+ fail_shape_inference("kernel shape should have ", input_dims_size, " values in ", ctx.getDisplayName(), ".");
+ }
int64_t total_pad = residual == 0 ? effective_kernel_shape[i] - stride : effective_kernel_shape[i] - residual;
if (total_pad < 0)
total_pad = 0;
@@ -959,19 +962,21 @@ ONNX_OPERATOR_SET_SCHEMA(
auto w_type = ctx.getInputType(3);
if (nullptr == x_type || nullptr == w_type || x_type->value_case() != TypeProto::kTensorType ||
w_type->value_case() != TypeProto::kTensorType) {
- fail_type_inference("inputs are expected to have tensor type.");
+ fail_type_inference("inputs are expected to have tensor type in ", ctx.getDisplayName(), ".");
}
auto x_zero_point_type = ctx.getInputType(2);
if (nullptr == x_zero_point_type ||
x_zero_point_type->tensor_type().elem_type() != x_type->tensor_type().elem_type()) {
- fail_type_inference("input and zero_point pair is expected to have be same type.");
+ fail_type_inference(
+ "input and zero_point pair is expected to have be same type in ", ctx.getDisplayName(), ".");
}
auto w_zero_point_type = ctx.getInputType(5);
if (nullptr == w_zero_point_type ||
w_zero_point_type->tensor_type().elem_type() != w_type->tensor_type().elem_type()) {
- fail_type_inference("weight and zero_point pair is expected to have same type.");
+ fail_type_inference(
+ "weight and zero_point pair is expected to have same type in ", ctx.getDisplayName(), ".");
}
propagateElemTypeFromInputToOutput(ctx, 7, 0);
@@ -2647,7 +2652,8 @@ ONNX_OPERATOR_SET_SCHEMA(
if (!hasNInputShapes(ctx, 1)) {
return;
}
- auto& input_shape = ctx.getInputType(0)->tensor_type().shape();
+
+ auto& input_shape = getInputShape(ctx, 0);
int64_t input_ndim = input_shape.dim_size();
int64_t axis = -1;
auto axis_proto = ctx.getAttribute("axis");
@@ -2659,7 +2665,16 @@ ONNX_OPERATOR_SET_SCHEMA(
// positive value.
axis += input_ndim;
}
-
+ if (axis < 0) {
+ fail_shape_inference(
+ "Unexpected axis value (",
+ axis,
+ ") rank of first input is ",
+ input_ndim,
+ " in ",
+ ctx.getDisplayName(),
+ ".");
+ }
if (ctx.getNumOutputs() > 1) {
auto mean_shape = ctx.getOutputType(1)->mutable_tensor_type()->mutable_shape();
mean_shape->CopyFrom(input_shape);
diff --git a/onnx/defs/nn/old.cc b/onnx/defs/nn/old.cc
index 57f8e2a4..8b2dc07f 100644
--- a/onnx/defs/nn/old.cc
+++ b/onnx/defs/nn/old.cc
@@ -201,6 +201,9 @@ void convPoolShapeInference_opset19(
residual -= stride;
}
}
+ if (i >= static_cast<int>(effective_kernel_shape.size())) {
+ fail_shape_inference("kernel shape should have ", input_dims_size, " values in ", ctx.getDisplayName(), ".");
+ }
int64_t total_pad = residual == 0 ? effective_kernel_shape[i] - stride : effective_kernel_shape[i] - residual;
if (total_pad < 0)
total_pad = 0;
diff --git a/onnx/defs/shape_inference.h b/onnx/defs/shape_inference.h
index a80473b3..d1bcd401 100644
--- a/onnx/defs/shape_inference.h
+++ b/onnx/defs/shape_inference.h
@@ -105,6 +105,10 @@ struct InferenceContext {
virtual const SparseTensorProto* getInputSparseData(size_t index) const = 0;
// Gets the shape inputs computed by partial data propagation.
virtual const TensorShapeProto* getSymbolicInput(size_t index) const = 0;
+ // To display a name the user can use to narrow its search.
+ virtual std::string getDisplayName() const {
+ return "";
+ }
};
// We use data propagation to perform partial evaluation of the model, to compute statically
@@ -263,7 +267,15 @@ inline void propagateElemTypeFromDtypeToOutput(
} else {
// This is not expected to happen
fail_type_inference(
- "Output ", outputIndex, " expected to have: ", expected_value_case, " or UNDEFINED. Got: ", output_value_case);
+ "Output ",
+ outputIndex,
+ " expected to have: ",
+ expected_value_case,
+ " or UNDEFINED. Got: ",
+ output_value_case,
+ " in ",
+ ctx.getDisplayName(),
+ ".");
}
}
@@ -277,18 +289,18 @@ inline void propagateElemTypeFromDtypeToOutput(InferenceContext& ctx, const Attr
const auto attr_type = attr->type();
if (attr_type == AttributeProto::TENSOR) {
if (attr->t().dims().size() != 1) {
- fail_type_inference("Attribute expected to have a one-dim tensor");
+ fail_type_inference("Attribute expected to have a one-dim tensor in ", ctx.getDisplayName(), ".");
}
data_type = attr->t().data_type();
expected_value_case = TypeProto::kTensorType;
} else if (attr_type == AttributeProto::SPARSE_TENSOR) {
if (attr->sparse_tensor().dims().size() != 1) {
- fail_type_inference("Attribute expected to have a one-dim sparse tensor");
+ fail_type_inference("Attribute expected to have a one-dim sparse tensor in ", ctx.getDisplayName(), ".");
}
data_type = attr->sparse_tensor().values().data_type();
expected_value_case = TypeProto::kSparseTensorType;
} else {
- fail_type_inference("Attribute expected to have tensor or sparse tensor type");
+ fail_type_inference("Attribute expected to have tensor or sparse tensor type in ", ctx.getDisplayName(), ".");
}
propagateElemTypeFromDtypeToOutput(ctx, data_type, outputIndex, expected_value_case);
@@ -326,7 +338,10 @@ inline const TensorShapeProto& getInputShape(const InferenceContext& ctx, size_t
const auto* input_type = ctx.getInputType(n);
const auto value_case = input_type->value_case();
if (value_case != TypeProto::kTensorType && value_case != TypeProto::kSparseTensorType) {
- fail_type_inference("Attribute expected to have tensor or sparse tensor type");
+ fail_type_inference("Input ", n, "expected to be a tensor or a sparse tensor type in ", ctx.getDisplayName(), ".");
+ }
+ if (!hasShape(*input_type)) {
+ fail_shape_inference("Input ", n, " must have a non null shape in ", ctx.getDisplayName(), ".");
}
if (value_case == TypeProto::kTensorType) {
return input_type->tensor_type().shape();
@@ -344,7 +359,7 @@ inline const TensorShapeProto* getOptionalInputShape(InferenceContext& ctx, size
const auto value_case = input_type->value_case();
if (value_case != TypeProto::kTensorType && value_case != TypeProto::kSparseTensorType) {
- fail_type_inference("Attribute expected to have tensor or sparse tensor type");
+ fail_type_inference("Input ", n, "expected to be a tensor or a sparse tensor type in ", ctx.getDisplayName(), ".");
}
if (value_case == TypeProto::kTensorType) {
return &input_type->tensor_type().shape();
@@ -372,7 +387,10 @@ inline void appendSingleDimCopiedFromInputTypeToOutputType(
" does not match type of output: ",
outputIndex,
"type: ",
- output_value_case);
+ output_value_case,
+ " in ",
+ ctx.getDisplayName(),
+ ".");
}
if (TypeProto::kTensorType == input_value_case) {
auto* dim = output_type->mutable_tensor_type()->mutable_shape()->add_dim();
@@ -382,7 +400,13 @@ inline void appendSingleDimCopiedFromInputTypeToOutputType(
*dim = input_type->sparse_tensor_type().shape().dim(static_cast<int>(fromDimIndex));
} else {
fail_type_inference(
- "Input ", inputIndex, " and Output ", outputIndex, " expected to have tensor or sparse tensor type");
+ "Input ",
+ inputIndex,
+ " and Output ",
+ outputIndex,
+ " expected to have tensor or sparse tensor type in ",
+ ctx.getDisplayName(),
+ ".");
}
}
@@ -440,7 +464,14 @@ updateOutputElemType(InferenceContext& ctx, size_t outputIndex, int32_t elemType
setTensorElementType(elemType, expected_type, *output_type);
} else {
// This is not expected to happen
- fail_type_inference("Output ", outputIndex, " expected to have tensor or sparse tensor type: ", expected_type);
+ fail_type_inference(
+ "Output ",
+ outputIndex,
+ " expected to have tensor or sparse tensor type: ",
+ expected_type,
+ " in ",
+ ctx.getDisplayName(),
+ ".");
}
}
@@ -462,16 +493,17 @@ inline void propagateElemTypeFromAttributeToOutput(
updateOutputElemType(ctx, outputIndex, default_value, expected_type);
return;
} else {
- fail_type_inference("Value of attribute ", attributeName, " not specified");
+ fail_type_inference("Value of attribute ", attributeName, " not specified in ", ctx.getDisplayName(), ".");
}
}
if (!attr_proto->has_i()) {
- fail_type_inference("Attribute ", attributeName, " should be of integer type and specify a type.");
+ fail_type_inference(
+ "Attribute ", attributeName, " should be of integer type and specify a type in ", ctx.getDisplayName(), ".");
}
auto attr_value = attr_proto->i();
auto elem_type = static_cast<TensorProto_DataType>(attr_value);
if (!TensorProto_DataType_IsValid(elem_type)) {
- fail_type_inference("Attribute ", attributeName, " does not specify a valid type.");
+ fail_type_inference("Attribute ", attributeName, " does not specify a valid type in ", ctx.getDisplayName(), ".");
}
updateOutputElemType(ctx, outputIndex, elem_type, expected_type);
}
@@ -497,7 +529,7 @@ inline TensorShapeProto*
getOutputShape(InferenceContext& ctx, size_t n, TypeProto::ValueCase default_type = TypeProto::kTensorType) {
auto output_type = ctx.getOutputType(n);
if (output_type == nullptr) {
- fail_type_inference("Output ", n, " expected to have tensor or sparse type");
+ fail_type_inference("Output ", n, " expected to have tensor or sparse type in ", ctx.getDisplayName(), ".");
}
const auto output_value_case = output_type->value_case();
if (output_value_case == TypeProto::kTensorType || output_value_case == TypeProto::kSparseTensorType) {
@@ -505,7 +537,7 @@ getOutputShape(InferenceContext& ctx, size_t n, TypeProto::ValueCase default_typ
} else if (output_value_case == TypeProto::VALUE_NOT_SET) {
return getTensorMutableShape(default_type, *output_type);
} else {
- fail_type_inference("Output ", n, " expected to have tensor type");
+ fail_type_inference("Output ", n, " expected to have tensor type in ", ctx.getDisplayName(), ".");
}
}
@@ -562,13 +594,13 @@ inline void propagateShapeFromAttributeToOutput(
auto attr_proto = ctx.getAttribute(attributeName);
if ((nullptr == attr_proto) || (!attr_proto->has_type()) ||
(attr_proto->type() != AttributeProto_AttributeType_INTS)) {
- fail_shape_inference("Attribute ", attributeName, " should specify a shape");
+ fail_shape_inference("Attribute ", attributeName, " should specify a shape in ", ctx.getDisplayName(), ".");
}
auto& int_list = attr_proto->ints();
TensorShapeProto shape;
for (auto dim_size : int_list) {
if (dim_size < 0) {
- fail_shape_inference("Negative values are not allowed in a shape specification");
+ fail_shape_inference("Negative values are not allowed in a shape specification in ", ctx.getDisplayName(), ".");
}
shape.add_dim()->set_dim_value(dim_size);
}
@@ -745,7 +777,16 @@ inline void checkInputRank(InferenceContext& ctx, size_t input_index, int expect
if (hasInputShape(ctx, input_index)) {
auto rank = getInputShape(ctx, input_index).dim_size();
if (rank != expected_rank) {
- fail_shape_inference("Input ", input_index, " expected to have rank ", expected_rank, " but has rank ", rank);
+ fail_shape_inference(
+ "Input ",
+ input_index,
+ " expected to have rank ",
+ expected_rank,
+ " but has rank ",
+ rank,
+ " in ",
+ ctx.getDisplayName(),
+ ".");
}
}
}
@@ -798,7 +839,15 @@ inline void unifyInputDim(InferenceContext& ctx, size_t input_index, int dim_ind
// This shape is expected to have rank > dim_index:
if (input_shape.dim_size() <= dim_index) {
fail_shape_inference(
- "Input ", input_index, " expected to have rank >", dim_index, " but has rank ", input_shape.dim_size());
+ "Input ",
+ input_index,
+ " expected to have rank >",
+ dim_index,
+ " but has rank ",
+ input_shape.dim_size(),
+ " in ",
+ ctx.getDisplayName(),
+ ".");
}
const Dim& input_dim = input_shape.dim(dim_index);
// Now, unify dim and input_dim:
diff --git a/onnx/shape_inference/implementation.cc b/onnx/shape_inference/implementation.cc
index 8723dcd4..8249fc59 100644
--- a/onnx/shape_inference/implementation.cc
+++ b/onnx/shape_inference/implementation.cc
@@ -906,7 +906,7 @@ struct FunctionInferenceContext : public InferenceContext {
const std::vector<TypeProto>& input_types,
const std::vector<AttributeProto>& attributes,
const ShapeInferenceOptions& options)
- : input_types_(input_types), options_(options) {
+ : input_types_(input_types), options_(options), func_proto_(&func_proto) {
for (const auto& attr : attributes) {
attributesByName_[attr.name()] = &attr;
}
@@ -971,11 +971,25 @@ struct FunctionInferenceContext : public InferenceContext {
return std::move(output_types_);
}
+ std::string getDisplayName() const override {
+ if (func_proto_ == nullptr)
+ return "";
+ if (func_proto_->domain().empty()) {
+ if (func_proto_->name().empty())
+ return "";
+ return MakeString("function ", func_proto_->name());
+ }
+ if (func_proto_->name().empty())
+ return MakeString("function [", func_proto_->domain(), "]");
+ return MakeString("function ", func_proto_->name(), "[", func_proto_->domain(), "]");
+ }
+
private:
const std::vector<TypeProto>& input_types_;
std::vector<TypeProto> output_types_;
std::unordered_map<std::string, const AttributeProto*> attributesByName_;
ShapeInferenceOptions options_;
+ const FunctionProto* func_proto_;
};
std::vector<TypeProto> InferFunctionOutputTypes(
diff --git a/onnx/shape_inference/implementation.h b/onnx/shape_inference/implementation.h
index 2c63c910..b0e4c32d 100644
--- a/onnx/shape_inference/implementation.h
+++ b/onnx/shape_inference/implementation.h
@@ -146,7 +146,7 @@ struct InferenceContextImpl : public InferenceContext {
const ShapeInferenceOptions& options,
DataValueMap* generatedShapeData = nullptr,
GraphInferenceContext* graphInferenceContext = nullptr)
- : graphInferenceContext_{graphInferenceContext}, options_(options) {
+ : graphInferenceContext_{graphInferenceContext}, options_(options), node_(&n) {
for (auto& attr : *n.mutable_attribute()) {
attributesByName_[attr.name()] = &attr;
if (attr.has_g()) {
@@ -277,6 +277,19 @@ struct InferenceContextImpl : public InferenceContext {
return inferencer;
}
+ std::string getDisplayName() const override {
+ if (node_ == nullptr)
+ return "";
+ if (node_->domain().empty()) {
+ if (node_->name().empty())
+ return MakeString("node ", node_->op_type());
+ return MakeString("node ", node_->op_type(), " (", node_->name(), ")");
+ }
+ if (node_->name().empty())
+ return MakeString("node ", node_->op_type(), "[", node_->domain(), "]");
+ return MakeString("node ", node_->op_type(), "[", node_->domain(), "]", " (", node_->name(), ")");
+ }
+
std::vector<const TensorProto*> allInputData_;
std::vector<const SparseTensorProto*> allInputSparseData_;
std::vector<const TensorShapeProto*> allShapeInputData_;
@@ -289,6 +302,7 @@ struct InferenceContextImpl : public InferenceContext {
// mutable as internal cache of GraphInferencer instances
mutable std::unordered_map<std::string, std::unique_ptr<GraphInferencer>> graphAttributeInferencers_;
ShapeInferenceOptions options_;
+ NodeProto* node_;
};
struct DataPropagationContextImpl : public DataPropagationContext {
diff --git a/onnx/defs/math/defs.cc b/onnx/defs/math/defs.cc
index ef379d8f..b7dfe3c8 100644
--- a/onnx/defs/math/defs.cc
+++ b/onnx/defs/math/defs.cc
@@ -2568,17 +2568,17 @@ ONNX_OPERATOR_SET_SCHEMA(
}
}));
-void einsumRankInference(ONNX_NAMESPACE::InferenceContext& ctx, std::string equation) {
- const size_t numInputs = ctx.getNumInputs();
- if (numInputs < 1 || !hasNInputShapes(ctx, static_cast<int>(numInputs))) {
+void einsumShapeInference(ONNX_NAMESPACE::InferenceContext& ctx, std::string const& equation) {
+ // Only accept letters for indices
+ auto is_letter = [](char c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); };
+
+ const size_t num_inputs = ctx.getNumInputs();
+ if (num_inputs < 1 || !hasNInputShapes(ctx, static_cast<int>(num_inputs))) {
return;
}
-
- auto* output_shape = getOutputShape(ctx, 0);
+ ONNX_NAMESPACE::TensorShapeProto output_shape;
std::string left_equation;
- equation.erase(std::remove(equation.begin(), equation.end(), ' '),
- equation.end()); // Remove space char
auto mid_index = equation.find("->");
if (mid_index != std::string::npos) {
// Separate right and left hand sides of the equation
@@ -2595,73 +2595,130 @@ void einsumRankInference(ONNX_NAMESPACE::InferenceContext& ctx, std::string equa
// Parse the left-hand side
std::stringstream str(left_equation);
+ std::map<char, size_t> label_maps;
+ std::set<char> repeated_labels;
+ ONNX_NAMESPACE::TensorShapeProto dims_value, ellipsis_dims_value;
+ size_t num_labels = 0;
+ bool ellipsis_flag = true;
+
while (!str.eof()) {
std::getline(str, term, ',');
auto ellipsis_index = term.find("...");
- if (numInputs <= num_operands) {
+ if (num_inputs <= num_operands) {
fail_shape_inference("Number of input tensors does not match the operands in the equation.");
}
- size_t rank = ctx.getInputType(num_operands)->tensor_type().shape().dim_size();
+ const auto& shape = ctx.getInputType(num_operands)->tensor_type().shape();
+ size_t rank = shape.dim_size();
+ size_t ellipsis_dims = 0;
+
+ size_t term_size = 0; // number of legal indices for the current term
+ size_t num_illegal_char = 0; // number of illegal char before the current 'index' in the current term
+
+ for (size_t index = 0; index < term.size(); ++index) {
+ if (is_letter(term[index])) {
+ term_size += 1;
+ }
+ }
+
+ for (size_t index = 0; index < term.size(); ++index) {
+ if (index == ellipsis_index) {
+ // find ellipsis and record the dims represented by ellipsis
+ ellipsis_dims = rank - term_size;
+ if (ellipsis_flag) {
+ ellipsis_flag = false;
+ for (size_t i = 0; i < ellipsis_dims; i++) {
+ *ellipsis_dims_value.add_dim() = shape.dim(index + i - num_illegal_char);
+ }
+ } else {
+ for (size_t i = 0; i < ellipsis_dims; i++) {
+ const auto shape_dim = shape.dim(index + i - num_illegal_char);
+ const auto current_dim = ellipsis_dims_value.mutable_dim(i);
+ if (shape_dim.has_dim_value() && current_dim->has_dim_value() &&
+ shape_dim.dim_value() > current_dim->dim_value() && current_dim->dim_value() == 1) {
+ current_dim->set_dim_value(shape_dim.dim_value());
+ }
+ }
+ }
+ index += 2; // skip the rest of dots
+ num_illegal_char += 3;
+ continue;
+
+ } else if (!is_letter(term[index])) {
+ num_illegal_char += 1;
+ continue;
+ }
+
+ const auto inserted = label_maps.insert({term[index], num_labels}).second;
+ if (inserted) {
+ *dims_value.add_dim() = shape.dim(index + ellipsis_dims - num_illegal_char);
+ ++num_labels;
+ } else {
+ repeated_labels.insert(term[index]);
+ }
+ }
+
if (ellipsis_index != std::string::npos) {
// If there is an ellipsis, the number of dimensions it represents
// must be total dim - letter dimensions
if (num_ellipsis == 0) {
- if (rank + 3 < term.size()) {
+ if (rank < term_size) {
fail_shape_inference("Ellipsis represents incompatible dimensions.");
}
- num_ellipsis_indices = rank - term.size() + 3;
+ num_ellipsis_indices = rank - term_size;
} else { // ellipsis has been seen before. Check that if dimensions
// are compatible
- if (num_ellipsis_indices != rank - term.size() + 3) {
+ if (num_ellipsis_indices != rank - term_size) {
fail_shape_inference("Ellipsis represents incompatible dimensions.");
}
}
num_ellipsis++;
} else {
- if (rank != term.size()) {
+ if (rank != term_size) {
fail_shape_inference("Rank of input ", num_operands, " does not match the equation indices.");
}
}
num_operands++;
}
- if (numInputs != num_operands) {
+ if (num_inputs != num_operands) {
fail_shape_inference("Number of input tensors does not match the operands in the equation.");
}
- const size_t number_of_letters = 26;
- size_t num_letter_occurrences[number_of_letters] = {0};
// Parse the provided right-hand side
if (mid_index != std::string::npos) {
std::string right_equation = equation.substr(mid_index + 2);
auto right_ellipsis_index = right_equation.find("...");
- if (right_ellipsis_index != std::string::npos) { // Right-hand side contains ellipsis
- for (size_t i = 0; i < num_ellipsis_indices; ++i) {
- output_shape->add_dim();
+
+ for (size_t index = 0; index < right_equation.size(); ++index) {
+ // If there's an ellipsis, add its corresponding dimensions
+ if (index == right_ellipsis_index) {
+ for (size_t i = 0; i < num_ellipsis_indices; i++) {
+ *output_shape.add_dim() = ellipsis_dims_value.dim(i);
+ }
+ index += 2; // skip the rest of dots
+ continue;
}
- }
- for (char c : right_equation) { // Add a dimension per each character
- // in right hand equation
- if (c != '.') {
- output_shape->add_dim();
+
+ if (is_letter(right_equation[index])) {
+ *output_shape.add_dim() = dims_value.dim(label_maps[right_equation[index]]);
}
}
} else { // Infer the dimension for right-hand side
- // If there's an ellipsis, add it's corresponding dimensions
+ // If there's an ellipsis, add its corresponding dimensions
for (size_t i = 0; i < num_ellipsis_indices; i++) {
- output_shape->add_dim();
+ *output_shape.add_dim() = ellipsis_dims_value.dim(i);
}
- for (size_t i = 0; i < left_equation.size(); i++) { // Count chars that appear exactly once on left hand side
- if ((left_equation.at(i) != ',') && (left_equation.at(i) != '.')) {
- num_letter_occurrences[left_equation.at(i) - 'a']++;
- }
- }
- for (size_t index = 0; index < number_of_letters; index++) {
- if (num_letter_occurrences[index] == 1) {
- output_shape->add_dim();
+ // If no explicit output was given, generate an implicit output by ordering all the
+ // labels in alphabetic order (by ASCII value consistent with numpy, so Z < a).
+ // Exclude any labels that occurred more than once, as these cancel out.
+ for (auto i : label_maps) {
+ if (repeated_labels.count(i.first) == 0) {
+ *output_shape.add_dim() = dims_value.dim(i.second);
}
}
}
+
+ updateOutputShape(ctx, 0, output_shape);
}
static const char* Einsum_ver12_doc = R"DOC(
@@ -2711,7 +2768,10 @@ ONNX_OPERATOR_SET_SCHEMA(
if (equation.compare("") == 0) {
return;
}
- einsumRankInference(ctx, equation);
+
+ equation.erase(std::remove(equation.begin(), equation.end(), ' '),
+ equation.end()); // Remove space char
+ einsumShapeInference(ctx, equation);
}));
const char* reduction_doc_sce =
diff --git a/onnx/test/shape_inference_test.py b/onnx/test/shape_inference_test.py
index 75280f6c..5543fda0 100644
--- a/onnx/test/shape_inference_test.py
+++ b/onnx/test/shape_inference_test.py
@@ -7026,7 +7026,7 @@ class TestShapeInference(TestShapeInferenceHelper):
[make_node("Einsum", ["x"], ["y"], equation="ij->ji")],
[],
)
- self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, (None, None))]) # type: ignore
+ self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, (4, 3))]) # type: ignore
def test_einsum_dot(self) -> None:
graph = self._make_graph(
@@ -7050,7 +7050,7 @@ class TestShapeInference(TestShapeInferenceHelper):
[make_node("Einsum", ["x", "y"], ["z"], equation="ij,ab->ijab")],
[],
)
- self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (None, None, None, None))]) # type: ignore
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (3, 5, 7, 9))]) # type: ignore
def test_einsum_sum_along_dim(self) -> None:
graph = self._make_graph(
@@ -7058,7 +7058,7 @@ class TestShapeInference(TestShapeInferenceHelper):
[make_node("Einsum", ["x"], ["y"], equation="i j->i ")],
[],
)
- self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, (None,))]) # type: ignore
+ self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, (3,))]) # type: ignore
def test_einsum_ellipsis(self) -> None:
graph = self._make_graph(
@@ -7066,26 +7066,36 @@ class TestShapeInference(TestShapeInferenceHelper):
[make_node("Einsum", ["x"], ["y"], equation="... ii ->... i")],
[],
)
- self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, (None, None))]) # type: ignore
+ self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, (3, 4))]) # type: ignore
def test_einsum_ellipsis_2(self) -> None:
graph = self._make_graph(
- [("x", TensorProto.FLOAT, (2, 2, 2)), ("y", TensorProto.FLOAT, (2, 2, 2))],
+ [("x", TensorProto.FLOAT, (2, 3, 4)), ("y", TensorProto.FLOAT, (2, 4, 5))],
[make_node("Einsum", ["x", "y"], ["z"], equation="...ij,...jk->...ik")],
[],
)
self._assert_inferred(
- graph, [make_tensor_value_info("z", TensorProto.FLOAT, (None, None, None))]
+ graph, [make_tensor_value_info("z", TensorProto.FLOAT, (2, 3, 5))]
) # type: ignore
def test_einsum_ellipsis_3(self) -> None:
graph = self._make_graph(
- [("x", TensorProto.FLOAT, (2, 2, 2)), ("y", TensorProto.FLOAT, (2, 2, 2))],
+ [("x", TensorProto.FLOAT, (2, 3, 4)), ("y", TensorProto.FLOAT, (2, 4, 5))],
[make_node("Einsum", ["x", "y"], ["z"], equation="...ij,...jk")],
[],
)
self._assert_inferred(
- graph, [make_tensor_value_info("z", TensorProto.FLOAT, (None, None, None))]
+ graph, [make_tensor_value_info("z", TensorProto.FLOAT, (2, 3, 5))]
+ ) # type: ignore
+
+ def test_einsum_ellipsis_broadcast(self) -> None:
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (1, 3, 4)), ("y", TensorProto.FLOAT, (32, 4, 5))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="...ij,...jk->...ik")],
+ [],
+ )
+ self._assert_inferred(
+ graph, [make_tensor_value_info("z", TensorProto.FLOAT, (32, 3, 5))]
) # type: ignore
def test_einsum_contraction(self) -> None:
@@ -7099,11 +7109,7 @@ class TestShapeInference(TestShapeInferenceHelper):
)
self._assert_inferred(
graph,
- [
- make_tensor_value_info(
- "z", TensorProto.FLOAT, (None, None, None, None, None)
- )
- ],
+ [make_tensor_value_info("z", TensorProto.FLOAT, (5, 6, 7, 9, 10))],
) # type: ignore
def test_einsum_contraction_2(self) -> None:
@@ -7113,7 +7119,7 @@ class TestShapeInference(TestShapeInferenceHelper):
[],
)
self._assert_inferred(
- graph, [make_tensor_value_info("z", TensorProto.FLOAT, (None, None))]
+ graph, [make_tensor_value_info("z", TensorProto.FLOAT, (4, 5))]
) # type: ignore
def test_einsum_batch_matmul(self) -> None:
@@ -7122,7 +7128,7 @@ class TestShapeInference(TestShapeInferenceHelper):
[make_node("Einsum", ["x", "y"], ["z"], equation="bij , b jk-> bik")],
[],
)
- self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (None, None, None))]) # type: ignore
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (5, 2, 4))]) # type: ignore
def test_einsum_left_hand_eqn(self) -> None:
graph = self._make_graph(
@@ -7130,7 +7136,7 @@ class TestShapeInference(TestShapeInferenceHelper):
[make_node("Einsum", ["x", "y"], ["z"], equation="ij,kl")],
[],
)
- self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (None, None, None, None))]) # type: ignore
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (2, 3, 3, 4))]) # type: ignore
def test_einsum_incorrect_num_inputs(self) -> None:
graph = self._make_graph(
@@ -7144,6 +7150,244 @@ class TestShapeInference(TestShapeInferenceHelper):
)
self.assertRaises(onnx.shape_inference.InferenceError, self._inferred, graph)
+ def test_einsum_view_A1(self) -> None: # returns a view of A1
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3,))],
+ [make_node("Einsum", ["x"], ["y"], equation="i")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, (3,))]) # type: ignore
+
+ def test_einsum_sum_A1(self) -> None: # sums the values of A1
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3,))],
+ [make_node("Einsum", ["x"], ["y"], equation="i->")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, ())]) # type: ignore
+
+ def test_einsum_element_wise_multiplication_A1_B1(
+ self,
+ ) -> None: # element-wise multiplication of A1 and B1
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3,)), ("y", TensorProto.FLOAT, (3,))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="i,i->i")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (3,))]) # type: ignore
+
+ def test_einsum_inner_product_A1_B1(self) -> None: # inner product of A1 and B1
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3,)), ("y", TensorProto.FLOAT, (3,))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="i,i->")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, ())]) # type: ignore
+
+ def test_einsum_outer_product_A1_B1(self) -> None: # outer product of A1 and B1
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3,)), ("y", TensorProto.FLOAT, (3,))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="i,j->ij")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (3, 3))]) # type: ignore
+
+ def test_einsum_view_A2(self) -> None: # returns a view of A2
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x"], ["y"], equation="ij->ij")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, (3, 3))]) # type: ignore
+
+ def test_einsum_view_A2_2(self) -> None: # returns a view of A2, another case
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x"], ["y"], equation="ij")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, (3, 3))]) # type: ignore
+
+ def test_einsum_transpose_A2(self) -> None: # view transpose of A2
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x"], ["y"], equation="ji")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, (3, 3))]) # type: ignore
+
+ def test_einsum_transpose_A2_to_ij(self) -> None: # view transpose of A2
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x"], ["y"], equation="ji->ij")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, (3, 3))]) # type: ignore
+
+ def test_einsum_diag_A2(self) -> None: # view main diagonal of A2
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x"], ["y"], equation="ii->i")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, (3,))]) # type: ignore
+
+ def test_einsum_trace_A2(self) -> None: # sums main diagonal of A2
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x"], ["y"], equation="ii->")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, ())]) # type: ignore
+
+ def test_einsum_sum_A2(self) -> None: # sums the values of A2
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x"], ["y"], equation="ij->")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, ())]) # type: ignore
+
+ def test_einsum_sum_columns_A2(
+ self,
+ ) -> None: # sum down the columns of A2 (across rows)
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x"], ["y"], equation="ij->j")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, (3,))]) # type: ignore
+
+ def test_einsum_sum_rows_A2(self) -> None: # sum horizontally along the rows of A2
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x"], ["y"], equation="ij->i")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("y", TensorProto.FLOAT, (3,))]) # type: ignore
+
+ def test_einsum_element_wise_multiplication_A2_B2(
+ self,
+ ) -> None: # element-wise multiplication of A2 and B2
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3)), ("y", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="ij,ij->ij")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (3, 3))]) # type: ignore
+
+ def test_einsum_element_wise_multiplication_A2_B2_transpose(
+ self,
+ ) -> None: # element-wise multiplication of A2 and B2.T
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3)), ("y", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="ij,ji->ij")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (3, 3))]) # type: ignore
+
+ def test_einsum_matrix_multiplication_A2_B2(
+ self,
+ ) -> None: # matrix multiplication of A2 and B2
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3)), ("y", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="ij,jk")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (3, 3))]) # type: ignore
+
+ def test_einsum_matrix_multiplication_A2_B2_to_ik(
+ self,
+ ) -> None: # matrix multiplication of A2 and B2
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3)), ("y", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="ij,jk->ik")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (3, 3))]) # type: ignore
+
+ def test_einsum_matrix_multiplication_A3_B3(
+ self,
+ ) -> None: # matrix multiplication of A3 and B3 (a stack of 2D matrices)
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (2, 3, 3)), ("y", TensorProto.FLOAT, (2, 3, 3))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="bij,bjk->bik")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (2, 3, 3))]) # type: ignore
+
+ def test_einsum_matrix_multiplication_A3_B3_transpose(
+ self,
+ ) -> None: # matrix multiplication of A3 and B3 (a stack of 2D matrices)
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (2, 3, 3)), ("y", TensorProto.FLOAT, (2, 3, 3))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="bij,bkj->bik")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (2, 3, 3))]) # type: ignore
+
+ def test_einsum_inner_product_A2_B2(self) -> None: # inner product of A2 and B2
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3)), ("y", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="ij,kj->ik")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (3, 3))]) # type: ignore
+
+ def test_einsum_row_multiplication_A2_B2(
+ self,
+ ) -> None: # each row of A2 multiplied by B2
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3)), ("y", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="ij,kj->ikj")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (3, 3, 3))]) # type: ignore
+
+ def test_einsum_value_multiplication_A2_B2(
+ self,
+ ) -> None: # each value of A2 multiplied by B2
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3)), ("y", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="ij,kl->ijkl")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (3, 3, 3, 3))]) # type: ignore
+
+ def test_einsum_scalar_times_array(self) -> None: # Scalar times array
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, ()), ("y", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation=",ij->ij")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (3, 3))]) # type: ignore
+
+ def test_einsum_matrix_vector_A2_B1(self) -> None: # Matrix and vector.
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3)), ("y", TensorProto.FLOAT, (3,))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="ij,j->i")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (3,))]) # type: ignore
+
+ def test_einsum_diag_multiplication_A2_B2(
+ self,
+ ) -> None: # diagonals multiplied by each other
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3)), ("y", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="ii,ii->i")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, (3,))]) # type: ignore
+
+ def test_einsum_diag_dot_product_A2_B2(self) -> None: # dot product of diagonals
+ graph = self._make_graph(
+ [("x", TensorProto.FLOAT, (3, 3)), ("y", TensorProto.FLOAT, (3, 3))],
+ [make_node("Einsum", ["x", "y"], ["z"], equation="ii,ii->")],
+ [],
+ )
+ self._assert_inferred(graph, [make_tensor_value_info("z", TensorProto.FLOAT, ())]) # type: ignore
+
def test_negative_log_likehood_shape_is_NCdd(self) -> None:
N, C = 3, 4
graph = self._make_graph(

View file

@ -9,18 +9,18 @@ See [Compatibility](../README.md#Compatibility) for a list of the supported plat
| Operator | WebGl Backend |
|:--------:|:-------------:|
| [Abs](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Abs) | [6-12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Abs-6), [13+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Abs-13) |
| [Acos](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Acos) | [7+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Acos-7) |
| [Acos](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Acos) | [7-21](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Acos-7), [22+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Acos-22) |
| [Acosh](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Acosh) | |
| [Add](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Add) | [7-12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Add-7), [13](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Add-13), [14+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Add-14) |
| [AffineGrid](https://github.com/onnx/onnx/blob/main/docs/Operators.md#AffineGrid) | |
| [And](https://github.com/onnx/onnx/blob/main/docs/Operators.md#And) | [7+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#And-7) |
| [ArgMax](https://github.com/onnx/onnx/blob/main/docs/Operators.md#ArgMax) | |
| [ArgMin](https://github.com/onnx/onnx/blob/main/docs/Operators.md#ArgMin) | |
| [Asin](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Asin) | [7+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Asin-7) |
| [Asin](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Asin) | [7-21](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Asin-7), [22+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Asin-22) |
| [Asinh](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Asinh) | |
| [Atan](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Atan) | [7+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Atan-7) |
| [Atan](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Atan) | [7-21](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Atan-7), [22+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Atan-22) |
| [Atanh](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Atanh) | |
| [AveragePool](https://github.com/onnx/onnx/blob/main/docs/Operators.md#AveragePool) | [7-9](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#AveragePool-7), [10](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#AveragePool-10), [11-18](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#AveragePool-11), [19+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#AveragePool-19) |
| [AveragePool](https://github.com/onnx/onnx/blob/main/docs/Operators.md#AveragePool) | [7-9](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#AveragePool-7), [10](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#AveragePool-10), [11-18](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#AveragePool-11), [19-21](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#AveragePool-19), [22+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#AveragePool-22) |
| [BatchNormalization](https://github.com/onnx/onnx/blob/main/docs/Operators.md#BatchNormalization) | [7-8](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#BatchNormalization-7), [9-13](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#BatchNormalization-9), [14](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#BatchNormalization-14), [15+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#BatchNormalization-15) |
| [Bernoulli](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Bernoulli) | |
| [BitShift](https://github.com/onnx/onnx/blob/main/docs/Operators.md#BitShift) | |
@ -41,10 +41,10 @@ See [Compatibility](../README.md#Compatibility) for a list of the supported plat
| [ConcatFromSequence](https://github.com/onnx/onnx/blob/main/docs/Operators.md#ConcatFromSequence) | |
| [Constant](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Constant) | |
| [ConstantOfShape](https://github.com/onnx/onnx/blob/main/docs/Operators.md#ConstantOfShape) | |
| [Conv](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Conv) | [1-10](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Conv-1), [11+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Conv-11) |
| [Conv](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Conv) | [1-10](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Conv-1), [11-21](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Conv-11), [22+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Conv-22) |
| [ConvInteger](https://github.com/onnx/onnx/blob/main/docs/Operators.md#ConvInteger) | |
| [ConvTranspose](https://github.com/onnx/onnx/blob/main/docs/Operators.md#ConvTranspose) | [1-10](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#ConvTranspose-1), [11+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#ConvTranspose-11) |
| [Cos](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Cos) | [7+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Cos-7) |
| [ConvTranspose](https://github.com/onnx/onnx/blob/main/docs/Operators.md#ConvTranspose) | [1-10](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#ConvTranspose-1), [11-21](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#ConvTranspose-11), [22+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#ConvTranspose-22) |
| [Cos](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Cos) | [7-21](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Cos-7), [22+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Cos-22) |
| [Cosh](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Cosh) | |
| [CumSum](https://github.com/onnx/onnx/blob/main/docs/Operators.md#CumSum) | |
| [DFT](https://github.com/onnx/onnx/blob/main/docs/Operators.md#DFT) | |
@ -53,10 +53,10 @@ See [Compatibility](../README.md#Compatibility) for a list of the supported plat
| [DequantizeLinear](https://github.com/onnx/onnx/blob/main/docs/Operators.md#DequantizeLinear) | |
| [Det](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Det) | |
| [Div](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Div) | [7-12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Div-7), [13](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Div-13), [14+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Div-14) |
| [Dropout](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Dropout) | [7-9](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Dropout-7), [10-11](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Dropout-10), [12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Dropout-12), [13+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Dropout-13) |
| [Dropout](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Dropout) | [7-9](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Dropout-7), [10-11](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Dropout-10), [12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Dropout-12), [13-21](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Dropout-13), [22+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Dropout-22) |
| [DynamicQuantizeLinear](https://github.com/onnx/onnx/blob/main/docs/Operators.md#DynamicQuantizeLinear) | |
| [Einsum](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Einsum) | |
| [Elu](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Elu) | [6+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Elu-6) |
| [Elu](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Elu) | [6-21](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Elu-6), [22+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Elu-22) |
| [Equal](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Equal) | [7-10](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Equal-7), [11-12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Equal-11), [13-18](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Equal-13), [19+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Equal-19) |
| [Erf](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Erf) | |
| [Exp](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Exp) | [6-12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Exp-6), [13+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Exp-13) |
@ -70,9 +70,9 @@ See [Compatibility](../README.md#Compatibility) for a list of the supported plat
| [GatherND](https://github.com/onnx/onnx/blob/main/docs/Operators.md#GatherND) | |
| [Gelu](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Gelu) | |
| [Gemm](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Gemm) | [7-8](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Gemm-7), [9-10](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Gemm-9), [11-12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Gemm-11), [13+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Gemm-13) |
| [GlobalAveragePool](https://github.com/onnx/onnx/blob/main/docs/Operators.md#GlobalAveragePool) | [1+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#GlobalAveragePool-1) |
| [GlobalAveragePool](https://github.com/onnx/onnx/blob/main/docs/Operators.md#GlobalAveragePool) | [1-21](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#GlobalAveragePool-1), [22+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#GlobalAveragePool-22) |
| [GlobalLpPool](https://github.com/onnx/onnx/blob/main/docs/Operators.md#GlobalLpPool) | |
| [GlobalMaxPool](https://github.com/onnx/onnx/blob/main/docs/Operators.md#GlobalMaxPool) | [1+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#GlobalMaxPool-1) |
| [GlobalMaxPool](https://github.com/onnx/onnx/blob/main/docs/Operators.md#GlobalMaxPool) | [1-21](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#GlobalMaxPool-1), [22+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#GlobalMaxPool-22) |
| [Greater](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Greater) | [7-8](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Greater-7), [9-12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Greater-9), [13+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Greater-13) |
| [GreaterOrEqual](https://github.com/onnx/onnx/blob/main/docs/Operators.md#GreaterOrEqual) | |
| [GridSample](https://github.com/onnx/onnx/blob/main/docs/Operators.md#GridSample) | |
@ -85,7 +85,7 @@ See [Compatibility](../README.md#Compatibility) for a list of the supported plat
| [Identity](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Identity) | [1-12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Identity-1), [13](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Identity-13), [14-15](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Identity-14), [16-18](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Identity-16), [19-20](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Identity-19), [21+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Identity-21) |
| [If](https://github.com/onnx/onnx/blob/main/docs/Operators.md#If) | |
| [ImageDecoder](https://github.com/onnx/onnx/blob/main/docs/Operators.md#ImageDecoder) | |
| [InstanceNormalization](https://github.com/onnx/onnx/blob/main/docs/Operators.md#InstanceNormalization) | [6+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#InstanceNormalization-6) |
| [InstanceNormalization](https://github.com/onnx/onnx/blob/main/docs/Operators.md#InstanceNormalization) | [6-21](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#InstanceNormalization-6), [22+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#InstanceNormalization-22) |
| [IsInf](https://github.com/onnx/onnx/blob/main/docs/Operators.md#IsInf) | |
| [IsNaN](https://github.com/onnx/onnx/blob/main/docs/Operators.md#IsNaN) | |
| [LRN](https://github.com/onnx/onnx/blob/main/docs/Operators.md#LRN) | [1-12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#LRN-1), [13+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#LRN-13) |
@ -102,7 +102,7 @@ See [Compatibility](../README.md#Compatibility) for a list of the supported plat
| [MatMul](https://github.com/onnx/onnx/blob/main/docs/Operators.md#MatMul) | [1-8](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#MatMul-1), [9-12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#MatMul-9), [13+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#MatMul-13) |
| [MatMulInteger](https://github.com/onnx/onnx/blob/main/docs/Operators.md#MatMulInteger) | |
| [Max](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Max) | |
| [MaxPool](https://github.com/onnx/onnx/blob/main/docs/Operators.md#MaxPool) | [1-7](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#MaxPool-1), [8-9](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#MaxPool-8), [10](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#MaxPool-10), [11](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#MaxPool-11), [12+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#MaxPool-12) |
| [MaxPool](https://github.com/onnx/onnx/blob/main/docs/Operators.md#MaxPool) | [1-7](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#MaxPool-1), [8-9](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#MaxPool-8), [10](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#MaxPool-10), [11](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#MaxPool-11), [12-21](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#MaxPool-12), [22+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#MaxPool-22) |
| [MaxRoiPool](https://github.com/onnx/onnx/blob/main/docs/Operators.md#MaxRoiPool) | |
| [MaxUnpool](https://github.com/onnx/onnx/blob/main/docs/Operators.md#MaxUnpool) | |
| [Mean](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Mean) | |
@ -170,7 +170,7 @@ See [Compatibility](../README.md#Compatibility) for a list of the supported plat
| [Shrink](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Shrink) | |
| [Sigmoid](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Sigmoid) | [6-12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Sigmoid-6), [13+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Sigmoid-13) |
| [Sign](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Sign) | |
| [Sin](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Sin) | [7+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Sin-7) |
| [Sin](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Sin) | [7-21](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Sin-7), [22+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Sin-22) |
| [Sinh](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Sinh) | |
| [Size](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Size) | |
| [Slice](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Slice) | [1-9](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Slice-1), [10](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Slice-10), [11-12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Slice-11), [13+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Slice-13) |
@ -188,7 +188,7 @@ See [Compatibility](../README.md#Compatibility) for a list of the supported plat
| [StringSplit](https://github.com/onnx/onnx/blob/main/docs/Operators.md#StringSplit) | |
| [Sub](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Sub) | [7-12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Sub-7), [13](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Sub-13), [14+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Sub-14) |
| [Sum](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Sum) | [6-7](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Sum-6), [8-12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Sum-8), [13+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Sum-13) |
| [Tan](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Tan) | [7+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Tan-7) |
| [Tan](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Tan) | [7-21](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Tan-7), [22+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Tan-22) |
| [Tanh](https://github.com/onnx/onnx/blob/main/docs/Operators.md#Tanh) | [6-12](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Tanh-6), [13+](https://github.com/onnx/onnx/blob/main/docs/Changelog.md#Tanh-13) |
| [TfIdfVectorizer](https://github.com/onnx/onnx/blob/main/docs/Operators.md#TfIdfVectorizer) | |
| [ThresholdedRelu](https://github.com/onnx/onnx/blob/main/docs/Operators.md#ThresholdedRelu) | |

View file

@ -465,7 +465,7 @@ class GraphRef {
} // namespace api
constexpr int64_t kMinSupportedOpset = 7;
constexpr int64_t kMaxSupportedOpset = 21;
constexpr int64_t kMaxSupportedOpset = 22;
// enum of results that a CostCheckFn can return.
enum class CostCheckResult {

View file

@ -384,6 +384,14 @@ class ReduceAggregatorMax : public ReduceAggregator<T> {
}
inline void update(const T& v) { this->accumulator_ = v > this->accumulator_ ? v : this->accumulator_; }
static void fill_for_empty_set(Tensor& output) {
if constexpr (std::is_same_v<bool, T>) { /* bool specific impl */
ORT_NOT_IMPLEMENTED();
} else {
EigenMap<T>(output).array() = -std::numeric_limits<T>::infinity();
}
}
// Fast reduction
static inline FastReduceKind WhichFastReduce() {
return FastReduceKind::kKR | FastReduceKind::kRK | FastReduceKind::kKRK | FastReduceKind::kRKR;

View file

@ -1,7 +1,7 @@
optimum>=1.14.1
transformers>=4.33.2,<= 4.38.0
torch>=2.2.0
onnx==1.16.1
onnx==1.17.0
datasets>=2.8.0
protobuf==3.20.2
psutil

View file

@ -1,3 +1,3 @@
onnx==1.16.1
onnx==1.17.0
transformers>=4.36.2
onnxscript>=0.1.0.dev20240126

View file

@ -222,10 +222,10 @@ TEST(FusedMatMulOpTest, FloatTypeNoTranspose) {
}
#if defined(USE_CUDA) || defined(USE_ROCM) // double support only implemented in CUDA/ROCM kernel
TEST(FusedMatMulOpTest, DoubleTypeNoTranspose) {
RunFusedMatMulTest<double>("FusedMatMul", 1);
}
// CUDAExecutionProvider cannot be used with this model due to its ONNX opset not being supported by the layout transformer.
// TEST(FusedMatMulOpTest, DoubleTypeNoTranspose) {
// RunFusedMatMulTest<double>("FusedMatMul", 1);
// }
#endif
TEST(FusedMatMulOpTest, FloatTypeTransposeA) {

View file

@ -1396,6 +1396,10 @@ std::unique_ptr<std::set<BrokenTest>> GetBrokenTests(const std::string& provider
broken_tests->insert({"resize_upsample_sizes_nearest", "result differs"});
broken_tests->insert({"resize_upsample_sizes_nearest_axes_2_3", "result differs"});
broken_tests->insert({"resize_upsample_sizes_nearest_axes_3_2", "result differs"});
broken_tests->insert({"convtranspose_group_2", "group attribute (new of opset(22)) not supported"});
broken_tests->insert({"convtranspose_group_2_image_3", "group attribute (new of opset(22)) not supported"});
broken_tests->insert({"resize_upsample_sizes_nearest_not_larger",
"output=Y:expected 1 (3f800000), got 4 (40800000), diff: 3, tol=0.002 idx=24. 13 of 49 differ. CPU test passed."});
}
#ifdef DISABLE_CONTRIB_OPS

View file

@ -295,7 +295,7 @@ TEST(XnnpackEP, DISABLED_TestQDQAveragePool) { // [ONNXRuntimeError] : 9 : NOT
});
}
TEST(XnnpackEP, TestMaxPool) {
TEST(XnnpackEP, DISABLED_TestMaxPool) { // NOT_IMPLEMENTED : Could not find an implementation for MaxPool(22) node with name 'node'
const std::vector<int64_t> input_shape = {1, 2, 13, 13};
auto modelBuilder = [&input_shape](ModelTestBuilder& builder) {
auto* input_arg = builder.MakeInput<float>(input_shape, -1.f, 1.f);
@ -360,7 +360,7 @@ TEST(XnnpackEP, TestQDQSoftMax_axisZero_v13) {
{ExpectedEPNodeAssignment::None});
}
TEST(XnnpackEP, TestSoftMax_axisLast) {
TEST(XnnpackEP, TestSoftMax_axisLast) { // error: Expected equality of these values
const std::vector<int64_t> input_shape = {1, 2, 3, 5};
int64_t axis = input_shape.size() - 1;
auto modelCreater = [input_shape, axis](ModelTestBuilder& builder) {
@ -379,7 +379,7 @@ TEST(XnnpackEP, TestSoftMax_axisLast) {
{ExpectedEPNodeAssignment::All});
}
TEST(XnnpackEP, TestQDQSoftMax_axisLast) {
TEST(XnnpackEP, TestQDQSoftMax_axisLast) { // error: Expected equality of these values
RunModelTest(BuildQDQSoftMaxTestCase<uint8_t, uint8_t>(
{1, 2, 3, 5} /* input_shape */,
static_cast<int64_t>(3) /* axis */,
@ -395,7 +395,7 @@ TEST(XnnpackEP, TestConvTranspose) {
RunModelTestWithPath(ort_model_path, "test_conv_follow_convtrans", nullptr);
}
TEST(XnnpackEP, TestConvTranspose_With_Outputpadding) {
TEST(XnnpackEP, DISABLED_TestConvTranspose_With_Outputpadding) { // NOT_IMPLEMENTED : Could not find an implementation for ConvTranspose(22) node with name 'node'
const std::vector<int64_t> input_shape = {1, 4, 15, 15};
auto modelBuilder = [&input_shape](ModelTestBuilder& builder) {
auto* input_arg = builder.MakeInput<float>(input_shape, -127.f, 127.f);
@ -415,7 +415,7 @@ TEST(XnnpackEP, TestConvTranspose_With_Outputpadding) {
});
}
TEST(XnnpackEP, TestConvTranspose_With_OutputShape) {
TEST(XnnpackEP, DISABLED_TestConvTranspose_With_OutputShape) { // NOT_IMPLEMENTED : Could not find an implementation for ConvTranspose(22) node with name 'node'
const std::vector<int64_t> input_shape = {1, 4, 15, 15};
auto modelBuilder = [&input_shape](ModelTestBuilder& builder) {
auto* input_arg = builder.MakeInput<float>(input_shape, -127.f, 127.f);

View file

@ -1,2 +1,2 @@
onnx==1.16.1
onnx==1.17.0
pytest

View file

@ -1222,7 +1222,7 @@ TEST(CApiTest, invalid_variadic_input_min_arity_custom_op) {
Ort::Session session(*ort_env, VARIADIC_INPUT_OUTPUT_CUSTOM_OP_MODEL_URI, session_options);
FAIL();
} catch (const Ort::Exception& excpt) {
ASSERT_THAT(excpt.what(), testing::HasSubstr("Error Node (VariadicNode0) has input size 3 not in range [min=4"));
ASSERT_THAT(excpt.what(), testing::HasSubstr("Error Node(VariadicNode0) with schema(test::VariadicNode:1) has input size 3 not in range [min=4,"));
}
}
@ -1252,7 +1252,7 @@ TEST(CApiTest, invalid_variadic_output_min_arity_custom_op) {
Ort::Session session(*ort_env, VARIADIC_INPUT_OUTPUT_CUSTOM_OP_MODEL_URI, session_options);
FAIL();
} catch (const Ort::Exception& excpt) {
ASSERT_THAT(excpt.what(), testing::HasSubstr("Error Node (VariadicNode0) has output size 3 not in range [min=4"));
ASSERT_THAT(excpt.what(), testing::HasSubstr("Error Node(VariadicNode0) with schema(test::VariadicNode:1) has output size 3 not in range [min=4"));
}
}

View file

@ -323,7 +323,46 @@
"^test_dequantizelinear_int4",
"^test_dequantizelinear_uint4",
"^test_quantizelinear_int4",
"^test_quantizelinear_uint4"
"^test_quantizelinear_uint4",
// onnx 1.17.0 op tests: skip until implemented in ORT
"^test_acos*", // Could not find an implementation for Acos(22)
"^test_acosh*", // Could not find an implementation for Acosh(22)
"^test_asin*", // Could not find an implementation for Asin(22)
"^test_asinh*", // Could not find an implementation for Asinh(22)
"^test_atan*", // Could not find an implementation for Atan(22)
"^test_atanh*", // Could not find an implementation for Atanh(22)
"^test_basic_conv_with_padding*", // Could not find an implementation for Conv(22)
"^test_basic_conv_without_padding*", // Could not find an implementation for Conv(22)
"^test_conv*", // Could not find an implementation for Conv(22)
"^test_convtranspose*", // Could not find an implementation for ConvTranspose(22)
"^test_cos*", // Could not find an implementation for Cos(22)
"^test_cosh*", // Could not find an implementation for Cosh(22)
"^test_det*", // Could not find an implementation for Det(22)
"^test_dropout*", // Could not find an implementation for Dropout(22)
"^test_elu*", // Could not find an implementation for Elu(22)
"^test_eyelike*", // Could not find an implementation for EyeLike(22)
"^test_globalaveragepool*", // Could not find an implementation for GlobalAveragePool(22)
"^test_globalmaxpool*", // Could not find an implementation for GlobalMaxPool(22)
"^test_gridsample*", // Could not find an implementation for GridSample(22)
"^test_gru*", // Could not find an implementation for GRU(22)
"^test_hardsigmoid*", // Could not find an implementation for HardSigmoid(22)
"^test_hardswish*", // Could not find an implementation for HardSigmoid(22)
"^test_instancenorm*", // Could not find an implementation for InstanceNormalization(22)
"^test_lppool*", // Could not find an implementation for LpPool(22)
"^test_lstm*", // Could not find an implementation for LSTM(22)
"^test_maxpool*", // Could not find an implementation for MaxPool(22)
"^test_maxunpool*", // Could not find an implementation for MaxUnpool(22)
"^test_mish*", // Could not find an implementation for Softplus(22)
"^test_rnn*", // Could not find an implementation for RNN(22)
"^test_round*", // Could not find an implementation for Round(22)
"^test_selu*", // Could not find an implementation for Selu(22)
"^test_simple_rnn*", // Could not find an implementation for RNN(22)
"^test_sin*", // Could not find an implementation for Sin(22)
"^test_sinh*", // Could not find an implementation for Sinh(22)
"^test_softplus*", // Could not find an implementation for Softplus(22)
"^test_softsign*", // Could not find an implementation for Softsign(22)
"^test_tan*", // Could not find an implementation for Tan(22)
"^test_thresholdedrelu*" // Could not find an implementation for ThresholdedRelu(22)
],
"current_failing_tests_x86": [
"^test_vgg19",
@ -426,6 +465,7 @@
"^test_gelu_tanh_2_expanded_cpu",
"^test_reduce_max_bool_inputs",
"^test_reduce_min_bool_inputs",
"^test_reduce_max_empty_set", // DNNL result in "(shapes (2, 1, 4), (1, 0, 1) mismatch)". this is the same for test_reduce_min_empty_set which is already in the list
"^test_reduce_min_empty_set",
"^test_reduce_l1_empty_set",
"^test_reduce_l1_empty_set_expanded",
@ -752,7 +792,9 @@
"^test_reduce_prod_empty_set_cpu",
//Bug: DML EP does not execute operators with an empty input tensor
//TODO: Resolve as a graph implementation that returns a constant inf tensor with appropriate strides
"^test_reduce_min_empty_set_cpu"
"^test_reduce_max_empty_set_cpu", // DNNL result in "(shapes (2, 1, 4), (1, 0, 1) mismatch)". this is the same for test_reduce_min_empty_set which is already in the list
"^test_reduce_min_empty_set_cpu",
"^test_resize_upsample_sizes_nearest_not_smaller_cpu"
],
// ORT first supported opset 7, so models with nodes that require versions prior to opset 7 are not supported
"tests_with_pre_opset7_dependencies": [

View file

@ -11,7 +11,7 @@ steps:
packageType: upack
feed: '/7424c8e4-5c62-490e-95c4-79446f31017c'
definition: '517c4f6f-5437-4392-a70d-4f15ec5be2f0'
version: 1.0.202
version: 1.0.203
downloadPath: $(Build.BinariesDirectory)/deps
# The private ADO project
@ -22,7 +22,7 @@ steps:
packageType: upack
feed: '/4c7631f5-24c0-4307-8822-1aa8f180c325'
definition: 'fd9dd5ad-b73e-4678-890e-edcf680dbc1a'
version: 1.0.202
version: 1.0.203
downloadPath: $(Build.BinariesDirectory)/deps
# You can add more ADO accounts at here.

View file

@ -3,7 +3,7 @@ beartype==0.15.0
flatbuffers
cerberus
h5py
onnx==1.16.1
onnx==1.17.0
# Python dependencies required for pytorch development
astunparse
expecttest!=0.2.0

View file

@ -4,7 +4,7 @@ mypy
pytest
setuptools>=68.2.2
wheel
onnx==1.16.1
onnx==1.17.0
protobuf==4.21.12
sympy==1.12 ; python_version < '3.9'
sympy==1.13 ; python_version >= '3.9'

View file

@ -5,7 +5,7 @@ mypy
pytest
setuptools==69.0.3
wheel==0.42.0
onnx==1.16.1
onnx==1.17.0
argparse
sympy==1.12
flatbuffers

View file

@ -3,7 +3,7 @@ mypy
pytest
setuptools>=68.2.2
wheel
onnx==1.16.1
onnx==1.17.0
protobuf==4.21.12
sympy==1.12
flatbuffers