mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-07-22 19:23:30 +00:00
### Description Merge main to WindowsAI ### 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: Nash <george.nash@intel.com> Signed-off-by: Yiming Hu <yiming.hu@amd.com> Signed-off-by: Liqun Fu <liqfu@microsoft.com> Co-authored-by: Kaz Nishimura <kazssym@linuxfront.com> Co-authored-by: Tianlei Wu <tlwu@microsoft.com> Co-authored-by: Nat Kershaw (MSFT) <nakersha@microsoft.com> Co-authored-by: Yulong Wang <7679871+fs-eire@users.noreply.github.com> Co-authored-by: Changming Sun <chasun@microsoft.com> Co-authored-by: zesongw <zesong.wang@intel.com> Co-authored-by: Yi Zhang <zhanyi@microsoft.com> Co-authored-by: Dmitri Smirnov <yuslepukhin@users.noreply.github.com> Co-authored-by: Yifan Li <109183385+yf711@users.noreply.github.com> Co-authored-by: simonjub <78098752+simonjub@users.noreply.github.com> Co-authored-by: PeixuanZuo <94887879+PeixuanZuo@users.noreply.github.com> Co-authored-by: Adrian Lizarraga <adlizarraga@microsoft.com> Co-authored-by: Edward Chen <18449977+edgchen1@users.noreply.github.com> Co-authored-by: Arthur Islamov <arthur@islamov.ai> Co-authored-by: Jambay Kinley <jambaykinley@microsoft.com> Co-authored-by: Justin Chu <justinchuby@users.noreply.github.com> Co-authored-by: Wei-Sheng Chin <wschin@outlook.com> Co-authored-by: Bowen Bao <bowbao@microsoft.com> Co-authored-by: Hariharan Seshadri <shariharan91@gmail.com> Co-authored-by: Numfor Tiapo <numsmt2@gmail.com> Co-authored-by: Vincent Wang <wangwchpku@outlook.com> Co-authored-by: Pranav Sharma <prs@microsoft.com> Co-authored-by: George Nash <george.nash@intel.com> Co-authored-by: Abhishek Jindal <abjindal@microsoft.com> Co-authored-by: pengwa <pengwa@microsoft.com> Co-authored-by: Yiming Hu <woinck@users.noreply.github.com> Co-authored-by: Jiajia Qin <jiajia.qin@intel.com> Co-authored-by: Lukas Berbuer <36054362+lukasberbuer@users.noreply.github.com> Co-authored-by: Wanming Lin <wanming.lin@intel.com> Co-authored-by: Xavier Dupré <xadupre@users.noreply.github.com> Co-authored-by: aimilefth <60664743+aimilefth@users.noreply.github.com> Co-authored-by: Baiju Meswani <bmeswani@microsoft.com> Co-authored-by: Adam Pocock <adam.pocock@oracle.com> Co-authored-by: Chi Lo <54722500+chilo-ms@users.noreply.github.com> Co-authored-by: RandySheriffH <48490400+RandySheriffH@users.noreply.github.com> Co-authored-by: Randy Shuai <rashuai@microsoft.com> Co-authored-by: Vadym Stupakov <vadim.stupakov@gmail.com> Co-authored-by: Jian Chen <cjian@microsoft.com> Co-authored-by: Brian Lambert <98757707+brian-pieces@users.noreply.github.com> Co-authored-by: Nicolò Lucchesi <nicolo.lucchesi@gmail.com> Co-authored-by: liqun Fu <liqfu@microsoft.com> Co-authored-by: trajep <trajepl@gmail.com> Co-authored-by: Scott McKay <skottmckay@gmail.com> Co-authored-by: Mustafa Ateş Uzun <mustafauzun0@gmail.com> Co-authored-by: MistEO <mistereo@hotmail.com> Co-authored-by: satyajandhyala <satya.k.jandhyala@gmail.com> Co-authored-by: shaahji <96227573+shaahji@users.noreply.github.com> Co-authored-by: Rachel Guo <35738743+YUNQIUGUO@users.noreply.github.com> Co-authored-by: rachguo <rachguo@rachguos-Mini.attlocal.net> Co-authored-by: Caroline Zhu <wolfivyaura@gmail.com> Co-authored-by: Caroline Zhu <carolinezhu@microsoft.com> Co-authored-by: Guenther Schmuelling <guschmue@microsoft.com> Co-authored-by: xhcao <xinghua.cao@intel.com> Co-authored-by: Ella Charlaix <80481427+echarlaix@users.noreply.github.com> Co-authored-by: Xu Xing <xing.xu@intel.com> Co-authored-by: Hector Li <hecli@microsoft.com> Co-authored-by: Ye Wang <52801275+wangyems@users.noreply.github.com> Co-authored-by: Your Name <you@example.com> Co-authored-by: Benedikt Hilmes <benedikt.hilmes@rwth-aachen.de> Co-authored-by: rachguo <rachguo@rachguos-Mac-mini.local> Co-authored-by: George Wu <jywu@microsoft.com> Co-authored-by: JiCheng <wejoncy@163.com> Co-authored-by: Sheil Kumar <smk2007@gmail.com> Co-authored-by: Sheil Kumar <sheilk@microsoft.com> Co-authored-by: cloudhan <guangyunhan@microsoft.com> Co-authored-by: kyoshisuki <143475866+kyoshisuki@users.noreply.github.com> Co-authored-by: aciddelgado <139922440+aciddelgado@users.noreply.github.com> Co-authored-by: tlwu@microsoft.com <tlwu@a100.crj0ad2y1kku1j4yxl4sj10o4e.gx.internal.cloudapp.net> Co-authored-by: Maximilian Müller <44298237+gedoensmax@users.noreply.github.com> Co-authored-by: Tang, Cheng <souptc@gmail.com> Co-authored-by: Cheng Tang <chenta@microsoft.com@orttrainingdev9.d32nl1ml4oruzj4qz3bqlggovf.px.internal.cloudapp.net> Co-authored-by: Cheng Tang <chenta@microsoft.com> Co-authored-by: Jeff Daily <jeff.daily@amd.com> Co-authored-by: cloudhan <cloudhan@outlook.com> Co-authored-by: Yufeng Li <liyufeng1987@gmail.com> Co-authored-by: Zhang Lei <zhang.huanning@hotmail.com> Co-authored-by: Dwayne Robinson <fdwr@hotmail.com> Co-authored-by: Zhipeng Han <zhipeng.han@outlook.com> Co-authored-by: Thiago Crepaldi <thiago.crepaldi@microsoft.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Patrice Vignola <vignola.patrice@gmail.com> Co-authored-by: kunal-vaishnavi <115581922+kunal-vaishnavi@users.noreply.github.com> Co-authored-by: snadampal <87143774+snadampal@users.noreply.github.com> Co-authored-by: Sumit Agarwal <sumitagarwal330@gmail.com> Co-authored-by: Ashwini Khade <askhade@microsoft.com> Co-authored-by: Yang Gu <yang.gu@intel.com> Co-authored-by: Cheng Tang <chenta@a100.crj0ad2y1kku1j4yxl4sj10o4e.gx.internal.cloudapp.net> Co-authored-by: mindest <30493312+mindest@users.noreply.github.com> Co-authored-by: Scott McKay <Scott.McKay@microsoft.com> Co-authored-by: Xavier Dupre <xadupre@microsoft.com@orttrainingdev9.d32nl1ml4oruzj4qz3bqlggovf.px.internal.cloudapp.net> Co-authored-by: guyang3532 <62738430+guyang3532@users.noreply.github.com> Co-authored-by: Carson M <carson@pyke.io> Co-authored-by: sophies927 <107952697+sophies927@users.noreply.github.com>
215 lines
8.8 KiB
C++
215 lines
8.8 KiB
C++
#include "testPch.h"
|
|
#include "ort_value_helper.h"
|
|
#include "StringHelpers.h"
|
|
using namespace winml;
|
|
using namespace winrt::Windows::Foundation::Collections;
|
|
namespace OrtValueHelpers {
|
|
|
|
template <ONNXTensorElementDataType T>
|
|
winml::ITensor CreateTensorFromShape(std::vector<int64_t>& shape) {
|
|
using WinMLTensorKind = typename ONNXTensorElementDataTypeToWinMLTensorKind<T>::Type;
|
|
ITensor tensor = nullptr;
|
|
WINML_EXPECT_NO_THROW(tensor = WinMLTensorKind::Create(shape));
|
|
return tensor;
|
|
}
|
|
|
|
static uint64_t ShapeSize(const int64_t* shape, size_t count) {
|
|
// for each dim
|
|
int64_t size = 1;
|
|
for (size_t i = 0; i < count; i++) {
|
|
// find out it's total size
|
|
size *= shape[i];
|
|
// make sure there are no invalid dimensions (-1 or any invalid shape)
|
|
THROW_HR_IF(E_INVALIDARG, shape[i] <= 0);
|
|
}
|
|
return size;
|
|
}
|
|
|
|
winml::ITensor CreateStringTensor(Ort::Value& val) {
|
|
size_t dimensionCount = 0;
|
|
WINML_EXPECT_NO_THROW(dimensionCount = val.GetTensorTypeAndShapeInfo().GetDimensionsCount());
|
|
std::vector<int64_t> shape;
|
|
if (dimensionCount > 0) {
|
|
WINML_EXPECT_NO_THROW(shape = val.GetTensorTypeAndShapeInfo().GetShape());
|
|
}
|
|
auto length = ShapeSize(shape.data(), shape.size());
|
|
|
|
// make a big buffer to hold all the string data
|
|
size_t bufferLength = 0;
|
|
WINML_EXPECT_NO_THROW(bufferLength = val.GetStringTensorDataLength());
|
|
|
|
std::vector<winrt::hstring> strings;
|
|
std::unique_ptr<uint8_t[]> buffer(new uint8_t[bufferLength]);
|
|
std::vector<size_t> offsets(static_cast<size_t>(length));
|
|
|
|
WINML_EXPECT_NO_THROW(val.GetStringTensorContent(buffer.get(), bufferLength, offsets.data(), offsets.size()));
|
|
|
|
// now go build all the strings
|
|
for (size_t i = 0; i < length; ++i) {
|
|
size_t strLength = 0;
|
|
// are we on the last one?
|
|
if (i == (length - 1)) {
|
|
strLength = bufferLength - offsets[i];
|
|
} else {
|
|
strLength = offsets[i + 1] - offsets[i];
|
|
}
|
|
auto strView = std::string_view(reinterpret_cast<const char*>(buffer.get() + offsets[i]), strLength);
|
|
strings.push_back(_winml::Strings::HStringFromUTF8(strView.data(), strLength));
|
|
}
|
|
|
|
TensorString tensor = nullptr;
|
|
WINML_EXPECT_NO_THROW(tensor = TensorString::CreateFromShapeArrayAndDataArray(shape, strings));
|
|
return tensor;
|
|
}
|
|
|
|
// This function takes in an Ort::Value and returns a copy of winml::ITensor
|
|
// TODO: String types still need to be implemented.
|
|
winml::ITensor LoadTensorFromOrtValue(Ort::Value& val) {
|
|
ITensor tensor = nullptr;
|
|
auto tensorTypeAndShape = val.GetTensorTypeAndShapeInfo();
|
|
auto shape = tensorTypeAndShape.GetShape();
|
|
switch (tensorTypeAndShape.GetElementType()) {
|
|
case (ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT): {
|
|
tensor = CreateTensorFromShape<ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT>(shape);
|
|
break;
|
|
}
|
|
case (ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT8): {
|
|
tensor = CreateTensorFromShape<ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT8>(shape);
|
|
break;
|
|
}
|
|
case (ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT8): {
|
|
tensor = CreateTensorFromShape<ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT8>(shape);
|
|
}
|
|
case (ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT16): {
|
|
tensor = CreateTensorFromShape<ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT16>(shape);
|
|
break;
|
|
}
|
|
case (ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT16): {
|
|
tensor = CreateTensorFromShape<ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT16>(shape);
|
|
break;
|
|
}
|
|
case (ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_STRING): {
|
|
return CreateStringTensor(val);
|
|
}
|
|
case (ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT32): {
|
|
tensor = CreateTensorFromShape<ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT32>(shape);
|
|
break;
|
|
}
|
|
case (ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT64): {
|
|
tensor = CreateTensorFromShape<ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_INT64>(shape);
|
|
break;
|
|
}
|
|
case (ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_BOOL): {
|
|
tensor = CreateTensorFromShape<ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_BOOL>(shape);
|
|
break;
|
|
}
|
|
case (ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT16): {
|
|
tensor = CreateTensorFromShape<ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT16>(shape);
|
|
break;
|
|
}
|
|
case (ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_DOUBLE): {
|
|
tensor = CreateTensorFromShape<ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_DOUBLE>(shape);
|
|
break;
|
|
}
|
|
case (ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT32): {
|
|
tensor = CreateTensorFromShape<ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT32>(shape);
|
|
break;
|
|
}
|
|
case (ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT64): {
|
|
tensor = CreateTensorFromShape<ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT64>(shape);
|
|
break;
|
|
}
|
|
case (ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_BFLOAT16): {
|
|
tensor = CreateTensorFromShape<ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_BFLOAT16>(shape);
|
|
break;
|
|
}
|
|
default:
|
|
throw winrt::hresult_invalid_argument(L"TensorType not implemented yet.");
|
|
}
|
|
BYTE* actualData = nullptr;
|
|
uint32_t actualSizeInBytes = 0;
|
|
WINML_EXPECT_NO_THROW(tensor.as<ITensorNative>()->GetBuffer(&actualData, &actualSizeInBytes));
|
|
void* ortValueTensorData = nullptr;
|
|
WINML_EXPECT_NO_THROW(Ort::GetApi().GetTensorMutableData(val, &ortValueTensorData));
|
|
WINML_EXPECT_NO_THROW(memcpy(actualData, ortValueTensorData, actualSizeInBytes * sizeof(char)));
|
|
return tensor;
|
|
}
|
|
|
|
static ONNXTensorElementDataType OnnxTensorTypeFromWinMLType(winml::TensorKind tensorKind) {
|
|
switch (tensorKind) {
|
|
case (TensorKind::Float):
|
|
return ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT;
|
|
case (TensorKind::UInt8):
|
|
return ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT8;
|
|
case (TensorKind::Int8):
|
|
return ONNX_TENSOR_ELEMENT_DATA_TYPE_INT8;
|
|
case (TensorKind::UInt16):
|
|
return ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT16;
|
|
case (TensorKind::Int16):
|
|
return ONNX_TENSOR_ELEMENT_DATA_TYPE_INT16;
|
|
case (TensorKind::Int32):
|
|
return ONNX_TENSOR_ELEMENT_DATA_TYPE_INT32;
|
|
case (TensorKind::Int64):
|
|
return ONNX_TENSOR_ELEMENT_DATA_TYPE_INT64;
|
|
case (TensorKind::Boolean):
|
|
return ONNX_TENSOR_ELEMENT_DATA_TYPE_BOOL;
|
|
case (TensorKind::Float16):
|
|
return ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT16;
|
|
case (TensorKind::Double):
|
|
return ONNX_TENSOR_ELEMENT_DATA_TYPE_DOUBLE;
|
|
case (TensorKind::UInt32):
|
|
return ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT32;
|
|
case (TensorKind::UInt64):
|
|
return ONNX_TENSOR_ELEMENT_DATA_TYPE_UINT64;
|
|
case (TensorKind::Complex64):
|
|
return ONNX_TENSOR_ELEMENT_DATA_TYPE_COMPLEX64;
|
|
case (TensorKind::Complex128):
|
|
return ONNX_TENSOR_ELEMENT_DATA_TYPE_COMPLEX128;
|
|
default:
|
|
throw std::invalid_argument("No conversion from WinML Type into Onnx TensorType");
|
|
}
|
|
}
|
|
|
|
Ort::Value CreateOrtValueFromITensor(winml::ITensor winmlTensor) {
|
|
Ort::Value ortValueCreated = Ort::Value{nullptr};
|
|
auto memoryInfo = Ort::MemoryInfo{nullptr};
|
|
WINML_EXPECT_NO_THROW(memoryInfo = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault));
|
|
std::vector<int64_t> shape;
|
|
auto vectorViewShape = winmlTensor.Shape();
|
|
for (int64_t dimension : vectorViewShape) {
|
|
shape.push_back(dimension);
|
|
}
|
|
if (winmlTensor.TensorKind() != winml::TensorKind::String) {
|
|
auto winmlTensorNative = winmlTensor.as<ITensorNative>();
|
|
BYTE* actualData;
|
|
uint32_t actualSizeInBytes;
|
|
WINML_EXPECT_HRESULT_SUCCEEDED(winmlTensorNative->GetBuffer(&actualData, &actualSizeInBytes));
|
|
WINML_EXPECT_NO_THROW(
|
|
ortValueCreated = Ort::Value::CreateTensor(
|
|
memoryInfo,
|
|
actualData,
|
|
actualSizeInBytes,
|
|
shape.data(),
|
|
shape.size(),
|
|
OnnxTensorTypeFromWinMLType(winmlTensor.TensorKind())
|
|
)
|
|
);
|
|
} else {
|
|
Ort::AllocatorWithDefaultOptions allocator;
|
|
WINML_EXPECT_NO_THROW(
|
|
ortValueCreated = Ort::Value::CreateTensor(
|
|
allocator, shape.data(), shape.size(), ONNXTensorElementDataType::ONNX_TENSOR_ELEMENT_DATA_TYPE_STRING
|
|
)
|
|
);
|
|
std::vector<const char*> strData;
|
|
std::vector<std::string> utf8Strs;
|
|
auto strValues = winmlTensor.as<TensorString>().GetAsVectorView();
|
|
for (winrt::hstring str : strValues) {
|
|
utf8Strs.push_back(_winml::Strings::UTF8FromHString(str));
|
|
strData.push_back(utf8Strs.back().c_str());
|
|
}
|
|
WINML_EXPECT_NO_THROW(ortValueCreated.FillStringTensor(strData.data(), strData.size()));
|
|
}
|
|
return ortValueCreated;
|
|
}
|
|
} // namespace OrtValueHelpers
|