mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-07-30 20:18:08 +00:00
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:
parent
81cd6eacd0
commit
a9a881cc98
20 changed files with 95 additions and 982 deletions
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
2
cmake/external/onnx
vendored
|
|
@ -1 +1 @@
|
|||
Subproject commit 595228d99e3977ac27cb79d5963adda262af99ad
|
||||
Subproject commit b8baa8446686496da4cc8fda09f2b6fe65c2a02c
|
||||
|
|
@ -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(
|
||||
|
||||
|
|
|
|||
|
|
@ -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) | |
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
onnx==1.16.1
|
||||
onnx==1.17.0
|
||||
transformers>=4.36.2
|
||||
onnxscript>=0.1.0.dev20240126
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -1,2 +1,2 @@
|
|||
onnx==1.16.1
|
||||
onnx==1.17.0
|
||||
pytest
|
||||
|
|
|
|||
|
|
@ -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"));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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": [
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue