mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-07-28 20:11:22 +00:00
Return right category of error. Use INVALID_ARGUMENT when the input is incorrect. (#1248)
* Return the right category of error. * Return right category of error
This commit is contained in:
parent
48df19f53d
commit
aae24f7f9e
1 changed files with 42 additions and 44 deletions
|
|
@ -55,10 +55,10 @@ static Status UnpackTensorWithRawData(const void* raw_data, size_t raw_data_leng
|
|||
{
|
||||
size_t expected_size_in_bytes;
|
||||
if (!onnxruntime::IAllocator::CalcMemSizeForArray(expected_size, sizeof(T), &expected_size_in_bytes)) {
|
||||
return Status(onnxruntime::common::ONNXRUNTIME, onnxruntime::common::FAIL, "size overflow");
|
||||
return Status(onnxruntime::common::ONNXRUNTIME, onnxruntime::common::INVALID_ARGUMENT, "size overflow");
|
||||
}
|
||||
if (raw_data_length != expected_size_in_bytes)
|
||||
return ORT_MAKE_STATUS(ONNXRUNTIME, FAIL,
|
||||
return ORT_MAKE_STATUS(ONNXRUNTIME, INVALID_ARGUMENT,
|
||||
"UnpackTensor: the pre-allocated size does not match the raw data size, expected ",
|
||||
expected_size_in_bytes, ", got ", raw_data_length);
|
||||
if (IsLittleEndianOrder()) {
|
||||
|
|
@ -80,33 +80,32 @@ static Status UnpackTensorWithRawData(const void* raw_data, size_t raw_data_leng
|
|||
}
|
||||
} // namespace
|
||||
|
||||
|
||||
namespace onnxruntime {
|
||||
namespace utils {
|
||||
|
||||
// This macro doesn't work for Float16/bool/string tensors
|
||||
#define DEFINE_UNPACK_TENSOR(T, Type, field_name, field_size) \
|
||||
template <> \
|
||||
Status UnpackTensor(const ONNX_NAMESPACE::TensorProto& tensor, const void* raw_data, size_t raw_data_len, \
|
||||
/*out*/ T* p_data, int64_t expected_size) { \
|
||||
if (nullptr == p_data) { \
|
||||
const size_t size = raw_data != nullptr ? raw_data_len : tensor.field_size(); \
|
||||
if (size == 0) return Status::OK(); \
|
||||
return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT); \
|
||||
} \
|
||||
if (nullptr == p_data || Type != tensor.data_type()) { \
|
||||
return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT); \
|
||||
} \
|
||||
if (raw_data != nullptr) { \
|
||||
return UnpackTensorWithRawData(raw_data, raw_data_len, expected_size, p_data); \
|
||||
} \
|
||||
if (tensor.field_size() != expected_size) \
|
||||
return ORT_MAKE_STATUS(ONNXRUNTIME, FAIL, "corrupted protobuf data: tensor shape size(", expected_size, \
|
||||
") does not match the data size(", tensor.field_size(), ") in proto"); \
|
||||
auto& data = tensor.field_name(); \
|
||||
for (auto data_iter = data.cbegin(); data_iter != data.cend(); ++data_iter) \
|
||||
*p_data++ = *reinterpret_cast<const T*>(data_iter); \
|
||||
return Status::OK(); \
|
||||
#define DEFINE_UNPACK_TENSOR(T, Type, field_name, field_size) \
|
||||
template <> \
|
||||
Status UnpackTensor(const ONNX_NAMESPACE::TensorProto& tensor, const void* raw_data, size_t raw_data_len, \
|
||||
/*out*/ T* p_data, int64_t expected_size) { \
|
||||
if (nullptr == p_data) { \
|
||||
const size_t size = raw_data != nullptr ? raw_data_len : tensor.field_size(); \
|
||||
if (size == 0) return Status::OK(); \
|
||||
return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT); \
|
||||
} \
|
||||
if (nullptr == p_data || Type != tensor.data_type()) { \
|
||||
return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT); \
|
||||
} \
|
||||
if (raw_data != nullptr) { \
|
||||
return UnpackTensorWithRawData(raw_data, raw_data_len, expected_size, p_data); \
|
||||
} \
|
||||
if (tensor.field_size() != expected_size) \
|
||||
return ORT_MAKE_STATUS(ONNXRUNTIME, INVALID_ARGUMENT, "corrupted protobuf data: tensor shape size(", expected_size, \
|
||||
") does not match the data size(", tensor.field_size(), ") in proto"); \
|
||||
auto& data = tensor.field_name(); \
|
||||
for (auto data_iter = data.cbegin(); data_iter != data.cend(); ++data_iter) \
|
||||
*p_data++ = *reinterpret_cast<const T*>(data_iter); \
|
||||
return Status::OK(); \
|
||||
}
|
||||
|
||||
// TODO: complex64 complex128
|
||||
|
|
@ -134,7 +133,7 @@ Status UnpackTensor(const ONNX_NAMESPACE::TensorProto& tensor, const void* /*raw
|
|||
}
|
||||
|
||||
if (tensor.string_data_size() != expected_size)
|
||||
return Status(common::ONNXRUNTIME, common::FAIL,
|
||||
return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT,
|
||||
"UnpackTensor: the pre-allocate size does not match the size in proto");
|
||||
|
||||
auto& string_data = tensor.string_data();
|
||||
|
|
@ -161,7 +160,7 @@ Status UnpackTensor(const ONNX_NAMESPACE::TensorProto& tensor, const void* raw_d
|
|||
}
|
||||
|
||||
if (tensor.int32_data_size() != expected_size)
|
||||
return Status(common::ONNXRUNTIME, common::FAIL,
|
||||
return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT,
|
||||
"UnpackTensor: the pre-allocate size does not match the size in proto");
|
||||
for (int iter : tensor.int32_data()) {
|
||||
*p_data++ = static_cast<bool>(iter);
|
||||
|
|
@ -186,14 +185,14 @@ Status UnpackTensor(const ONNX_NAMESPACE::TensorProto& tensor, const void* raw_d
|
|||
}
|
||||
|
||||
if (tensor.int32_data_size() != expected_size)
|
||||
return Status(common::ONNXRUNTIME, common::FAIL,
|
||||
return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT,
|
||||
"UnpackTensor: the pre-allocate size does not match the size in proto");
|
||||
|
||||
constexpr int max_value = std::numeric_limits<uint16_t>::max();
|
||||
for (int i = 0; i < static_cast<int>(expected_size); i++) {
|
||||
int v = tensor.int32_data()[i];
|
||||
if (v < 0 || v > max_value) {
|
||||
return Status(common::ONNXRUNTIME, common::FAIL, "data overflow");
|
||||
return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "data overflow");
|
||||
}
|
||||
p_data[i] = MLFloat16(static_cast<uint16_t>(v));
|
||||
}
|
||||
|
|
@ -220,14 +219,14 @@ Status UnpackTensor(const ONNX_NAMESPACE::TensorProto& tensor, const void* raw_d
|
|||
}
|
||||
|
||||
if (tensor.int32_data_size() != expected_size)
|
||||
return Status(common::ONNXRUNTIME, common::FAIL,
|
||||
return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT,
|
||||
"UnpackTensor: the pre-allocate size does not match the size in proto");
|
||||
|
||||
constexpr int max_value = std::numeric_limits<uint16_t>::max();
|
||||
for (int i = 0; i < static_cast<int>(expected_size); i++) {
|
||||
int v = tensor.int32_data()[i];
|
||||
if (v < 0 || v > max_value) {
|
||||
return Status(common::ONNXRUNTIME, common::FAIL, "data overflow");
|
||||
return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "data overflow");
|
||||
}
|
||||
p_data[i] = BFloat16(static_cast<uint16_t>(v));
|
||||
}
|
||||
|
|
@ -235,11 +234,11 @@ Status UnpackTensor(const ONNX_NAMESPACE::TensorProto& tensor, const void* raw_d
|
|||
return Status::OK();
|
||||
}
|
||||
|
||||
#define CASE_PROTO_TRACE(X, Y) \
|
||||
case ONNX_NAMESPACE::TensorProto_DataType::TensorProto_DataType_##X: \
|
||||
if (!IAllocator::CalcMemSizeForArrayWithAlignment<alignment>(size, sizeof(Y), out)) { \
|
||||
return common::Status(common::ONNXRUNTIME, common::FAIL, "Invalid TensorProto"); \
|
||||
} \
|
||||
#define CASE_PROTO_TRACE(X, Y) \
|
||||
case ONNX_NAMESPACE::TensorProto_DataType::TensorProto_DataType_##X: \
|
||||
if (!IAllocator::CalcMemSizeForArrayWithAlignment<alignment>(size, sizeof(Y), out)) { \
|
||||
return common::Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "Invalid TensorProto"); \
|
||||
} \
|
||||
break;
|
||||
|
||||
template <size_t alignment>
|
||||
|
|
@ -248,10 +247,10 @@ common::Status GetSizeInBytesFromTensorProto(const ONNX_NAMESPACE::TensorProto&
|
|||
size_t size = 1;
|
||||
for (google::protobuf::int64 dim : dims) {
|
||||
if (dim < 0 || static_cast<uint64_t>(dim) >= std::numeric_limits<size_t>::max()) {
|
||||
return common::Status(common::ONNXRUNTIME, common::FAIL, "Invalid TensorProto");
|
||||
return common::Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "Invalid TensorProto");
|
||||
}
|
||||
if (!IAllocator::CalcMemSizeForArray(size, static_cast<size_t>(dim), &size)) {
|
||||
return common::Status(common::ONNXRUNTIME, common::FAIL, "Invalid TensorProto");
|
||||
return common::Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "Invalid TensorProto");
|
||||
}
|
||||
}
|
||||
switch (tensor_proto.data_type()) {
|
||||
|
|
@ -285,7 +284,6 @@ std::vector<int64_t> GetTensorShapeFromTensorShapeProto(const ONNX_NAMESPACE::Te
|
|||
return tensor_shape_vec;
|
||||
}
|
||||
|
||||
|
||||
struct UnInitializeParam {
|
||||
void* preallocated;
|
||||
size_t preallocated_size;
|
||||
|
|
@ -377,7 +375,7 @@ Status TensorProtoToMLValue(const Env& env, const ORTCHAR_T* tensor_proto_path,
|
|||
{
|
||||
if (tensor_proto.data_location() == TensorProto_DataLocation_EXTERNAL) {
|
||||
if (ele_type == ONNX_TENSOR_ELEMENT_DATA_TYPE_STRING)
|
||||
return Status(common::ONNXRUNTIME, common::FAIL, "string tensor can not have raw data");
|
||||
return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "string tensor can not have raw data");
|
||||
|
||||
std::unique_ptr<ExternalDataInfo> external_data_info;
|
||||
ORT_RETURN_IF_ERROR(ExternalDataInfo::Create(tensor_proto.external_data(), external_data_info));
|
||||
|
|
@ -393,12 +391,12 @@ Status TensorProtoToMLValue(const Env& env, const ORTCHAR_T* tensor_proto_path,
|
|||
{
|
||||
void* file_data;
|
||||
ORT_RETURN_IF_ERROR(env.ReadFileAsString(full_path.c_str(), external_data_info->GetOffset(),
|
||||
file_data, raw_data_len, deleter_for_file_data.d));
|
||||
file_data, raw_data_len, deleter_for_file_data.d));
|
||||
raw_data = file_data;
|
||||
}
|
||||
} else if (tensor_proto.has_raw_data()) {
|
||||
if (ele_type == ONNX_TENSOR_ELEMENT_DATA_TYPE_STRING)
|
||||
return Status(common::ONNXRUNTIME, common::FAIL, "string tensor can not have raw data");
|
||||
return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "string tensor can not have raw data");
|
||||
raw_data = tensor_proto.raw_data().data();
|
||||
raw_data_len = tensor_proto.raw_data().size();
|
||||
}
|
||||
|
|
@ -411,7 +409,7 @@ Status TensorProtoToMLValue(const Env& env, const ORTCHAR_T* tensor_proto_path,
|
|||
int64_t tensor_size = 1;
|
||||
{
|
||||
for (auto i : tensor_proto.dims()) {
|
||||
if (i < 0) return Status(common::ONNXRUNTIME, common::FAIL, "tensor can't contain negative dims");
|
||||
if (i < 0) return Status(common::ONNXRUNTIME, common::INVALID_ARGUMENT, "tensor can't contain negative dims");
|
||||
tensor_size *= i;
|
||||
}
|
||||
}
|
||||
|
|
@ -426,7 +424,7 @@ Status TensorProtoToMLValue(const Env& env, const ORTCHAR_T* tensor_proto_path,
|
|||
}
|
||||
|
||||
if (preallocated && preallocated_size < size_to_allocate)
|
||||
return ORT_MAKE_STATUS(ONNXRUNTIME, FAIL,
|
||||
return ORT_MAKE_STATUS(ONNXRUNTIME, INVALID_ARGUMENT,
|
||||
"The buffer planner is not consistent with tensor buffer size, expected ",
|
||||
size_to_allocate, ", got ", preallocated_size);
|
||||
switch (tensor_proto.data_type()) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue