onnxruntime/winml/lib/Api.Core/CpuOrtSessionBuilder.cpp
Paul McDaniel 5350abe19d
LearningModelSession is cleaned up to use the adapter, and parts of b… (#2382)
this is a big PR.    we are going to move it up to layer_dev , which is still a L3 so we are still safe to do work there agile.

we are going to move this into the L3 so that ryan can start doing intergration testing.   

we will pause for a full code review and integration test result prior to going into the L2.

>>>> raw comments from previous commits >>> 

* LearningModelSession is cleaned up to use the adapter, and parts of binding are.
* moved everything in the winmladapter
made it all nano-com using, WRL to construct objects in the ORT side.
base interfaces for everythign for winml to call
cleaned up a bunch of winml to use the base interfaces.
* more pieces
* GetData across the abi.
* renamed some namepsace
cleaned up OrtValue
cleaned up Tensor
cleaned up custom ops.
everything *but* learnignmodel should be clean
* make sure it's building.   winml.dll is still a monolith.
2019-11-14 17:44:07 -08:00

91 lines
No EOL
2.7 KiB
C++

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
#include "pch.h"
// Needed to work around the fact that OnnxRuntime defines ERROR
#ifdef ERROR
#undef ERROR
#endif
#include "core/session/inference_session.h"
// Restore ERROR define
#define ERROR 0
#include "CpuOrtSessionBuilder.h"
#include "inc/WinMLAdapter.h"
// winml includes
#include "core/providers/dml/GraphTransformers/GraphTransformerHelpers.h"
// ort includes
#include "core/providers/cpu/cpu_execution_provider.h"
#include "core/optimizer/conv_activation_fusion.h"
#include "core/optimizer/gemm_activation_fusion.h"
using namespace Windows::AI::MachineLearning;
namespace Windows::AI::MachineLearning::Adapter {
CpuOrtSessionBuilder::CpuOrtSessionBuilder() {
}
HRESULT
CpuOrtSessionBuilder::CreateSessionOptions(
onnxruntime::SessionOptions* p_options) {
RETURN_HR_IF_NULL(E_POINTER, p_options);
*p_options = onnxruntime::SessionOptions();
p_options->graph_optimization_level = onnxruntime::TransformerLevel::Level3;
// Onnxruntime will use half the number of concurrent threads supported on the system
// by default. This causes MLAS to not exercise every logical core.
// We force the thread pool size to be maxxed out to ensure that WinML always
// runs the fastest.
p_options->intra_op_num_threads = std::thread::hardware_concurrency();
return S_OK;
}
HRESULT
CpuOrtSessionBuilder::CreateSession(
const onnxruntime::SessionOptions& options,
_winmla::IInferenceSession** p_session,
onnxruntime::IExecutionProvider** pp_provider) {
RETURN_HR_IF_NULL(E_POINTER, p_session);
RETURN_HR_IF_NULL(E_POINTER, pp_provider);
RETURN_HR_IF(E_POINTER, *pp_provider != nullptr);
// Create the inference session
auto session = std::make_unique<onnxruntime::InferenceSession>(options);
// Create the cpu execution provider
onnxruntime::CPUExecutionProviderInfo xpInfo;
#ifndef _WIN64
xpInfo.create_arena = false;
#endif
auto cpu_provider = std::make_unique<onnxruntime::CPUExecutionProvider>(xpInfo);
// Cache the provider's raw pointer
*pp_provider = cpu_provider.get();
// Register the cpu xp
ORT_THROW_IF_ERROR(session->RegisterExecutionProvider(std::move(cpu_provider)));
// assign the session to the out parameter
auto sessionptr = wil::MakeOrThrow<_winmla::InferenceSession>(session.release());
RETURN_IF_FAILED(sessionptr.CopyTo(_uuidof(_winmla::IInferenceSession), (void**)p_session));
return S_OK;
}
HRESULT
CpuOrtSessionBuilder::Initialize(
_winmla::IInferenceSession* p_session,
onnxruntime::IExecutionProvider* /*p_provider*/
) {
ORT_THROW_IF_ERROR(p_session->get()->Initialize());
return S_OK;
}
} // Windows::AI::MachineLearning::Adapter