diff --git a/BUILD.md b/BUILD.md index fd08399dac..4bda3f8b53 100644 --- a/BUILD.md +++ b/BUILD.md @@ -115,7 +115,7 @@ To build ONNX Runtime with MKL-DNN support, build it with `./build.sh --use_mkld To build ONNX Runtime using MKL-DNN built with dependency on MKL small libraries, build it with `./build.sh --use_mkldnn --use_mklml` ### nGraph -ONNX runtime with nGraph as an execution provider (released as preview) can be built on Linux as follows : `./build.sh --use_ngraph` +ONNX runtime with nGraph as an execution provider (released as preview) can be built on Linux as follows : `./build.sh --use_ngraph`. Similarly, on Windows use `.\build.bat --use_ngraph`. ### TensorRT ONNX Runtime supports the TensorRT execution provider (released as preview). You will need to download and install [CUDA](https://developer.nvidia.com/cuda-toolkit), [CUDNN](https://developer.nvidia.com/cudnn) and [TensorRT](https://developer.nvidia.com/nvidia-tensorrt-download). diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 0f5b3d8588..2e6337efc6 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -478,9 +478,6 @@ if (onnxruntime_USE_MKLDNN) endif() if (onnxruntime_USE_NGRAPH) - if (Win32) - message(FATAL_ERROR "nGraph is not currently supported on Windows.") - endif() #if (onnxruntime_USE_OPENMP) # message(FATAL_ERROR "Please set onnxruntime_USE_OPENMP=OFF for nGraph execution provider.") #endif() diff --git a/cmake/external/ngraph.cmake b/cmake/external/ngraph.cmake index 542e9ac205..65b7159e34 100644 --- a/cmake/external/ngraph.cmake +++ b/cmake/external/ngraph.cmake @@ -14,45 +14,95 @@ set(ngraph_URL "https://github.com/NervanaSystems/ngraph.git") set(ngraph_TAG "v0.18.1") # Libraries for python package. -set(NGRAPH_SHARED_LIB libngraph.so) -set(NGRAPH_CODEGEN_SHARED_LIB libcodegen.so) -set(NGRAPH_CPU_BACKEND_SHARED_LIB libcpu_backend.so) -set(NGRAPH_IOMP5MD_SHARED_LIB libiomp5.so) -set(NGRAPH_MKLDNN_SHARED_LIB libmkldnn.so) -set(NGRAPH_MKLML_SHARED_LIB libmklml_intel.so) -if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") - set(NGRAPH_TBB_SHARED_LIB libtbb_debug.so) - set(NGRAPH_TBB_SHARED_LIB_2 libtbb_debug.so.2) +if (WIN32) + set(NGRAPH_SHARED_LIB ngraph.dll) + set(NGRAPH_CPU_BACKEND_SHARED_LIB cpu_backend.dll) + set(NGRAPH_IOMP5MD_SHARED_LIB libiomp5md.dll) + set(NGRAPH_MKLDNN_SHARED_LIB mkldnn.dll) + set(NGRAPH_MKLML_SHARED_LIB mklml.dll) + if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + set(NGRAPH_TBB_SHARED_LIB tbb_debug.dll) + else() + set(NGRAPH_TBB_SHARED_LIB tbb.dll) + endif() else() - set(NGRAPH_TBB_SHARED_LIB libtbb.so) - set(NGRAPH_TBB_SHARED_LIB_2 libtbb.so.2) + set(NGRAPH_SHARED_LIB libngraph.so) + set(NGRAPH_CODEGEN_SHARED_LIB libcodegen.so) + set(NGRAPH_CPU_BACKEND_SHARED_LIB libcpu_backend.so) + set(NGRAPH_IOMP5MD_SHARED_LIB libiomp5.so) + set(NGRAPH_MKLDNN_SHARED_LIB libmkldnn.so) + set(NGRAPH_MKLML_SHARED_LIB libmklml_intel.so) + if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") + set(NGRAPH_TBB_SHARED_LIB libtbb_debug.so) + set(NGRAPH_TBB_SHARED_LIB_2 libtbb_debug.so.2) + else() + set(NGRAPH_TBB_SHARED_LIB libtbb.so) + set(NGRAPH_TBB_SHARED_LIB_2 libtbb.so.2) + endif() endif() -ExternalProject_Add(project_ngraph - PREFIX ngraph - GIT_REPOSITORY ${ngraph_URL} - GIT_TAG ${ngraph_TAG} - GIT_SHALLOW TRUE - # Here we use onnx and protobuf built by onnxruntime to avoid linking with incompatible libraries. This might change in future. - PATCH_COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/patches/ngraph/ngraph_onnx.cmake ${ngraph_SRC}/cmake/external_onnx.cmake - # TODO: Use cmake.file+copy as above. - COMMAND patch -p1 < ${PROJECT_SOURCE_DIR}/patches/ngraph/ngraph_protobuf.patch - CMAKE_ARGS - -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DNGRAPH_USE_PREBUILT_LLVM=TRUE - -DNGRAPH_USE_SYSTEM_PROTOBUF=FALSE - -DNGRAPH_ONNX_IMPORT_ENABLE=TRUE - -DNGRAPH_INTERPRETER_ENABLE=FALSE - -DNGRAPH_ONNXIFI_ENABLE=FALSE - -DNGRAPH_UNIT_TEST_ENABLE=FALSE - -DNGRAPH_TOOLS_ENABLE=FALSE - -DCMAKE_INSTALL_PREFIX=${ngraph_INSTALL_DIR} - -Dprebuilt_ONNX_BINARY_DIR=${prebuilt_ONNX_BINARY_DIR} - -Dprebuilt_ONNX_SOURCE_DIR=${prebuilt_ONNX_SOURCE_DIR} - DEPENDS onnx - ) +# discard prior changes due to unblock incremental builds. +set(NGRAPH_PATCH_DISCARD_COMMAND cd ${ngraph_SRC} && git checkout -- .) -add_library(ngraph SHARED IMPORTED) -set_property(TARGET ngraph PROPERTY IMPORTED_LOCATION ${ngraph_LIBRARIES}/${NGRAPH_SHARED_LIB}) +if (MSVC) + set(prebuilt_ONNX_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/onnx/${CMAKE_BUILD_TYPE}") + set(prebuilt_ONNX_SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}") + + + # For the moment, Windows does not support codegen, it works on DEX-only mode + ExternalProject_Add(project_ngraph + PREFIX ngraph + GIT_REPOSITORY ${ngraph_URL} + GIT_TAG ${ngraph_TAG} + PATCH_COMMAND ${NGRAPH_PATCH_DISCARD_COMMAND} + COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/patches/ngraph/ngraph_onnx.cmake ${ngraph_SRC}/cmake/external_onnx.cmake + COMMAND git apply --ignore-space-change --ignore-whitespace ${PROJECT_SOURCE_DIR}/patches/ngraph/ngraph_protobuf.patch + COMMAND git apply --ignore-space-change --ignore-whitespace ${PROJECT_SOURCE_DIR}/patches/ngraph/ngraph_fix_install_error.patch + COMMAND git apply --ignore-space-change --ignore-whitespace ${PROJECT_SOURCE_DIR}/patches/ngraph/ngraph_fix_library_path.patch + CMAKE_ARGS + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DNGRAPH_DEX_ONLY=ON + -DNGRAPH_USE_SYSTEM_PROTOBUF=FALSE + -DNGRAPH_ONNX_IMPORT_ENABLE=TRUE + -DNGRAPH_INTERPRETER_ENABLE=FALSE + -DNGRAPH_ONNXIFI_ENABLE=FALSE + -DNGRAPH_UNIT_TEST_ENABLE=FALSE + -DNGRAPH_TOOLS_ENABLE=FALSE + -DCMAKE_INSTALL_PREFIX=${ngraph_INSTALL_DIR} + -Dprebuilt_ONNX_BINARY_DIR=${prebuilt_ONNX_BINARY_DIR} + -Dprebuilt_ONNX_SOURCE_DIR=${prebuilt_ONNX_SOURCE_DIR} + DEPENDS onnx + ) + add_library(ngraph STATIC IMPORTED) + set_property(TARGET ngraph PROPERTY IMPORTED_LOCATION ${ngraph_LIBRARIES}/ngraph.lib) +else() + ExternalProject_Add(project_ngraph + PREFIX ngraph + GIT_REPOSITORY ${ngraph_URL} + GIT_TAG ${ngraph_TAG} + GIT_SHALLOW TRUE + PATCH_COMMAND ${NGRAPH_PATCH_DISCARD_COMMAND} + # Here we use onnx and protobuf built by onnxruntime to avoid linking with incompatible libraries. This might change in future. + COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_SOURCE_DIR}/patches/ngraph/ngraph_onnx.cmake ${ngraph_SRC}/cmake/external_onnx.cmake + # TODO: Use cmake.file+copy as above. + COMMAND git apply --ignore-space-change --ignore-whitespace ${PROJECT_SOURCE_DIR}/patches/ngraph/ngraph_protobuf.patch + CMAKE_ARGS + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DNGRAPH_USE_PREBUILT_LLVM=TRUE + -DNGRAPH_USE_SYSTEM_PROTOBUF=FALSE + -DNGRAPH_ONNX_IMPORT_ENABLE=TRUE + -DNGRAPH_INTERPRETER_ENABLE=FALSE + -DNGRAPH_ONNXIFI_ENABLE=FALSE + -DNGRAPH_UNIT_TEST_ENABLE=FALSE + -DNGRAPH_TOOLS_ENABLE=FALSE + -DCMAKE_INSTALL_PREFIX=${ngraph_INSTALL_DIR} + -Dprebuilt_ONNX_BINARY_DIR=${prebuilt_ONNX_BINARY_DIR} + -Dprebuilt_ONNX_SOURCE_DIR=${prebuilt_ONNX_SOURCE_DIR} + DEPENDS onnx + ) + + add_library(ngraph SHARED IMPORTED) + set_property(TARGET ngraph PROPERTY IMPORTED_LOCATION ${ngraph_LIBRARIES}/${NGRAPH_SHARED_LIB}) +endif() add_dependencies(ngraph project_ngraph) include_directories(${ngraph_INCLUDE_DIRS}) diff --git a/cmake/onnxruntime_providers.cmake b/cmake/onnxruntime_providers.cmake index 15ad19948e..ea16ba590d 100644 --- a/cmake/onnxruntime_providers.cmake +++ b/cmake/onnxruntime_providers.cmake @@ -195,9 +195,10 @@ if (onnxruntime_USE_NGRAPH) target_include_directories(onnxruntime_providers_ngraph PRIVATE ${ONNXRUNTIME_ROOT} ${ngraph_INCLUDE_DIRS}) set_target_properties(onnxruntime_providers_ngraph PROPERTIES LINKER_LANGUAGE CXX) - target_compile_options(onnxruntime_providers_ngraph PRIVATE "SHELL:-Wformat" "SHELL:-Wformat-security" "SHELL:-fstack-protector-strong" "SHELL:-D_FORTIFY_SOURCE=2") - target_link_options(onnxruntime_providers_ngraph PRIVATE "LINKER:-z, noexecstack " "LINKER:-z relro" "LINKER:-z now" "LINKER:-pie") - + if (NOT MSVC) + target_compile_options(onnxruntime_providers_ngraph PRIVATE "SHELL:-Wformat" "SHELL:-Wformat-security" "SHELL:-fstack-protector-strong" "SHELL:-D_FORTIFY_SOURCE=2") + target_link_options(onnxruntime_providers_ngraph PRIVATE "LINKER:-z, noexecstack " "LINKER:-z relro" "LINKER:-z now" "LINKER:-pie") + endif() endif() if (onnxruntime_ENABLE_MICROSOFT_INTERNAL) diff --git a/cmake/onnxruntime_unittests.cmake b/cmake/onnxruntime_unittests.cmake index 67dafa2e5b..5499698ce7 100644 --- a/cmake/onnxruntime_unittests.cmake +++ b/cmake/onnxruntime_unittests.cmake @@ -370,7 +370,15 @@ if(WIN32) ${MKLML_LIB_DIR}/${MKLML_SHARED_LIB} ${MKLML_LIB_DIR}/${IOMP5MD_SHARED_LIB} $ ) - endif() + endif() + if (onnxruntime_USE_NGRAPH) + add_custom_command( + TARGET ${test_data_target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${ngraph_LIBRARIES}/ + $ + ) + endif() endif() add_library(onnx_test_data_proto ${TEST_SRC_DIR}/proto/tml.proto) diff --git a/cmake/patches/ngraph/ngraph_fix_install_error.patch b/cmake/patches/ngraph/ngraph_fix_install_error.patch new file mode 100644 index 0000000000..ddabbb7d86 --- /dev/null +++ b/cmake/patches/ngraph/ngraph_fix_install_error.patch @@ -0,0 +1,127 @@ +From 280fbc003ea2794adb24d6a81d42db838a793dd9 Mon Sep 17 00:00:00 2001 +From: Sang Ik Lee +Date: Mon, 15 Apr 2019 16:11:27 -0700 +Subject: [PATCH] CMAKE_CFG_INTDIR does not work at install time. Use + CMAKE_INSTALL_CONFIG_NAME on Windows. + +--- + CMakeLists.txt | 7 ++++++- + cmake/external_mkldnn.cmake | 22 +++++++++++----------- + cmake/external_tbb.cmake | 4 ++-- + cmake/external_tbb_prebuilt.cmake | 6 +++--- + 4 files changed, 22 insertions(+), 17 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 2a21ed3a3..a695e217f 100755 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -390,12 +390,17 @@ endif() + + set(NGRAPH_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/src/ngraph) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${NGRAPH_BUILD_DIR}) +-set(NGRAPH_LIBRARY_OUTPUT_DIRECTORY ${NGRAPH_BUILD_DIR}/${CMAKE_CFG_INTDIR}) + if(WIN32) ++ set(NGRAPH_LIBRARY_OUTPUT_DIRECTORY ${NGRAPH_BUILD_DIR}/${CMAKE_CFG_INTDIR}) ++ set(NGRAPH_LIBRARY_INSTALLSRC_DIRECTORY ${NGRAPH_BUILD_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${NGRAPH_BUILD_DIR}) + set(NGRAPH_ARCHIVE_OUTPUT_DIRECTORY ${NGRAPH_BUILD_DIR}/${CMAKE_CFG_INTDIR}) ++ set(NGRAPH_ARCHIVE_INSTALLSRC_DIRECTORY ${NGRAPH_BUILD_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}) + set(CMAKE_PDB_OUTPUT_DIRECTORY ${NGRAPH_BUILD_DIR}) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${NGRAPH_BUILD_DIR}) ++else() ++ set(NGRAPH_LIBRARY_OUTPUT_DIRECTORY ${NGRAPH_BUILD_DIR}) ++ set(NGRAPH_LIBRARY_INSTALLSRC_DIRECTORY ${NGRAPH_BUILD_DIR}) + endif() + + set(EXTERNAL_INSTALL_DIR ${CMAKE_BINARY_DIR}/external) +diff --git a/cmake/external_mkldnn.cmake b/cmake/external_mkldnn.cmake +index 25445bf0b..7874aca76 100644 +--- a/cmake/external_mkldnn.cmake ++++ b/cmake/external_mkldnn.cmake +@@ -312,12 +312,12 @@ endif() + if(WIN32) + install( + FILES +- ${NGRAPH_LIBRARY_OUTPUT_DIRECTORY}/${MKLML_LIB} +- ${NGRAPH_ARCHIVE_OUTPUT_DIRECTORY}/${MKLML_IMPLIB} +- ${NGRAPH_LIBRARY_OUTPUT_DIRECTORY}/${OMP_LIB} +- ${NGRAPH_ARCHIVE_OUTPUT_DIRECTORY}/${OMP_IMPLIB} +- ${NGRAPH_LIBRARY_OUTPUT_DIRECTORY}/${MKLDNN_LIB} +- ${NGRAPH_ARCHIVE_OUTPUT_DIRECTORY}/${MKLDNN_IMPLIB} ++ ${NGRAPH_LIBRARY_INSTALLSRC_DIRECTORY}/${MKLML_LIB} ++ ${NGRAPH_ARCHIVE_INSTALLSRC_DIRECTORY}/${MKLML_IMPLIB} ++ ${NGRAPH_LIBRARY_INSTALLSRC_DIRECTORY}/${OMP_LIB} ++ ${NGRAPH_ARCHIVE_INSTALLSRC_DIRECTORY}/${OMP_IMPLIB} ++ ${NGRAPH_LIBRARY_INSTALLSRC_DIRECTORY}/${MKLDNN_LIB} ++ ${NGRAPH_ARCHIVE_INSTALLSRC_DIRECTORY}/${MKLDNN_IMPLIB} + DESTINATION + ${NGRAPH_INSTALL_LIB} + OPTIONAL +@@ -325,9 +325,9 @@ if(WIN32) + else() + install( + FILES +- ${NGRAPH_LIBRARY_OUTPUT_DIRECTORY}/${MKLML_LIB} +- ${NGRAPH_LIBRARY_OUTPUT_DIRECTORY}/${OMP_LIB} +- ${NGRAPH_LIBRARY_OUTPUT_DIRECTORY}/${MKLDNN_LIB} ++ ${NGRAPH_LIBRARY_INSTALLSRC_DIRECTORY}/${MKLML_LIB} ++ ${NGRAPH_LIBRARY_INSTALLSRC_DIRECTORY}/${OMP_LIB} ++ ${NGRAPH_LIBRARY_INSTALLSRC_DIRECTORY}/${MKLDNN_LIB} + DESTINATION + ${NGRAPH_INSTALL_LIB} + OPTIONAL +@@ -335,8 +335,8 @@ else() + if(NGRAPH_LIB_VERSIONING_ENABLE) + install( + FILES +- ${NGRAPH_LIBRARY_OUTPUT_DIRECTORY}/${MKLDNN_SHORT_LIB} +- ${NGRAPH_LIBRARY_OUTPUT_DIRECTORY}/${MKLDNN_FULL_LIB} ++ ${NGRAPH_LIBRARY_INSTALLSRC_DIRECTORY}/${MKLDNN_SHORT_LIB} ++ ${NGRAPH_LIBRARY_INSTALLSRC_DIRECTORY}/${MKLDNN_FULL_LIB} + DESTINATION + ${NGRAPH_INSTALL_LIB} + OPTIONAL +diff --git a/cmake/external_tbb.cmake b/cmake/external_tbb.cmake +index 761c5b3bd..6960ea929 100644 +--- a/cmake/external_tbb.cmake ++++ b/cmake/external_tbb.cmake +@@ -63,10 +63,10 @@ if(NGRAPH_TBB_ENABLE) + ${TBB_BUILD_DIR}/${TBB_LIB}.${TBB_SOVER} + DESTINATION ${NGRAPH_LIBRARY_OUTPUT_DIRECTORY}) + endif() +- install(FILES ${NGRAPH_LIBRARY_OUTPUT_DIRECTORY}/${TBB_LIB} ++ install(FILES ${NGRAPH_LIBRARY_INSTALLSRC_DIRECTORY}/${TBB_LIB} + DESTINATION ${NGRAPH_INSTALL_LIB}) + if(LINUX) +- install(FILES ${NGRAPH_LIBRARY_OUTPUT_DIRECTORY}/${TBB_LIB}.${TBB_SOVER} ++ install(FILES ${NGRAPH_LIBRARY_INSTALLSRC_DIRECTORY}/${TBB_LIB}.${TBB_SOVER} + DESTINATION ${NGRAPH_INSTALL_LIB}) + endif() + add_library(libtbb INTERFACE) +diff --git a/cmake/external_tbb_prebuilt.cmake b/cmake/external_tbb_prebuilt.cmake +index 3e1d0688f..a1cf1922a 100644 +--- a/cmake/external_tbb_prebuilt.cmake ++++ b/cmake/external_tbb_prebuilt.cmake +@@ -69,8 +69,8 @@ if (WIN32) + DEPENDEES download + ) + +- install(FILES ${NGRAPH_ARCHIVE_OUTPUT_DIRECTORY}/${TBB_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX} +- ${NGRAPH_LIBRARY_OUTPUT_DIRECTORY}/${TBB_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX} ++ install(FILES ${NGRAPH_ARCHIVE_INSTALLSRC_DIRECTORY}/${TBB_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX} ++ ${NGRAPH_LIBRARY_INSTALLSRC_DIRECTORY}/${TBB_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX} + DESTINATION ${NGRAPH_INSTALL_LIB}) + elseif(APPLE) + set(TBB_LINK_LIBS +@@ -82,7 +82,7 @@ elseif(APPLE) + COMMENT "Move tbb libraries to ngraph build directory" + ) + +- install(FILES ${NGRAPH_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_SHARED_LIBRARY_PREFIX}${TBB_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX} ++ install(FILES ${NGRAPH_LIBRARY_INSTALLSRC_DIRECTORY}/${CMAKE_SHARED_LIBRARY_PREFIX}${TBB_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX} + DESTINATION ${NGRAPH_INSTALL_LIB}) + endif() + +-- +2.13.0.windows.1 + diff --git a/cmake/patches/ngraph/ngraph_fix_library_path.patch b/cmake/patches/ngraph/ngraph_fix_library_path.patch new file mode 100644 index 0000000000..aaa63e96e7 --- /dev/null +++ b/cmake/patches/ngraph/ngraph_fix_library_path.patch @@ -0,0 +1,33 @@ +From fcd51f874f4a96fb4ca77d762ed39ea1bf3f2c0d Mon Sep 17 00:00:00 2001 +From: Junfeng Dong +Date: Wed, 17 Apr 2019 13:42:42 -0700 +Subject: [PATCH] Fix dll library load path on Windows. + +--- + src/ngraph/runtime/backend_manager.cpp | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/ngraph/runtime/backend_manager.cpp b/src/ngraph/runtime/backend_manager.cpp +index eaa8fc26a..4d35c63ec 100644 +--- a/src/ngraph/runtime/backend_manager.cpp ++++ b/src/ngraph/runtime/backend_manager.cpp +@@ -123,7 +123,7 @@ unique_ptr runtime::BackendManager::create_backend(const std:: + static string find_my_file() + { + #ifdef _WIN32 +- HMODULE hModule = GetModuleHandleW(NULL); ++ HMODULE hModule = GetModuleHandleW(L"ngraph.dll"); + WCHAR wpath[MAX_PATH]; + GetModuleFileNameW(hModule, wpath, MAX_PATH); + wstring ws(wpath); +@@ -157,6 +157,7 @@ DL_HANDLE runtime::BackendManager::open_shared_library(string type) + string my_directory = file_util::get_directory(find_my_file()); + string library_path = file_util::path_join(my_directory, library_name); + #ifdef _WIN32 ++ SetDllDirectory((LPCSTR)my_directory.c_str()); + handle = LoadLibrary(library_path.c_str()); + #else + handle = dlopen(library_path.c_str(), RTLD_NOW | RTLD_GLOBAL); +-- +2.13.0.windows.1 + diff --git a/cmake/patches/ngraph/ngraph_onnx.cmake b/cmake/patches/ngraph/ngraph_onnx.cmake index b27cc16019..6a1eba8b3b 100644 --- a/cmake/patches/ngraph/ngraph_onnx.cmake +++ b/cmake/patches/ngraph/ngraph_onnx.cmake @@ -3,8 +3,13 @@ set(ONNX_INCLUDE_DIR ${BINARY_DIR}) set(ONNX_SOURCE_INCLUDE_DIR "${prebuilt_ONNX_SOURCE_DIR}/onnx") include_directories("${ONNX_SOURCE_INCLUDE_DIR}") set(ONNX_PROTO_INCLUDE_DIR ${ONNX_INCLUDE_DIR}) -set(ONNX_LIBRARY ${BINARY_DIR}/libonnx.a) -set(ONNX_PROTO_LIBRARY ${BINARY_DIR}/libonnx_proto.a) +if (WIN32) + set(ONNX_LIBRARY ${BINARY_DIR}/onnx.lib) + set(ONNX_PROTO_LIBRARY ${BINARY_DIR}/onnx_proto.lib) +else() + set(ONNX_LIBRARY ${BINARY_DIR}/libonnx.a) + set(ONNX_PROTO_LIBRARY ${BINARY_DIR}/libonnx_proto.a) +endif() set(ONNX_LIBRARIES ${ONNX_LIBRARY} ${ONNX_PROTO_LIBRARY}) if (NOT TARGET onnx::libonnx) diff --git a/cmake/patches/ngraph/ngraph_protobuf.patch b/cmake/patches/ngraph/ngraph_protobuf.patch index 0736ef5aea..ac824a4203 100644 --- a/cmake/patches/ngraph/ngraph_protobuf.patch +++ b/cmake/patches/ngraph/ngraph_protobuf.patch @@ -1,13 +1,14 @@ diff --git a/cmake/external_protobuf.cmake b/cmake/external_protobuf.cmake -index 47977b3..1a66e1c 100644 +index 32217f5d..f6de5e76 100644 --- a/cmake/external_protobuf.cmake +++ b/cmake/external_protobuf.cmake @@ -23,7 +23,7 @@ include(ExternalProject) - + # This version of PROTOBUF is required by Microsoft ONNX Runtime. set(NGRAPH_PROTOBUF_GIT_REPO_URL "https://github.com/protocolbuffers/protobuf") -set(NGRAPH_PROTOBUF_GIT_TAG "v3.5.2") +set(NGRAPH_PROTOBUF_GIT_TAG "v3.6.1") + + if (WIN32) + ExternalProject_Add( - ExternalProject_Add( - ext_protobuf diff --git a/nGraph-ExecutionProvider.md b/nGraph-ExecutionProvider.md index faaddf901d..871e3b63c8 100644 --- a/nGraph-ExecutionProvider.md +++ b/nGraph-ExecutionProvider.md @@ -12,6 +12,7 @@ Developers can now tap into the power of nGraph through ONNX Runtime to accelera While the nGraph Compiler stack supports various operating systems and backends ([full list available here](https://www.ngraph.ai/ecosystem)), the nGraph execution provider for ONNX Runtime is validated for the following: ### Supported OS * Ubuntu 16.04 +* Windows 10 (`DEX_ONLY` mode is only one supported for the moment, codegen mode is work-in-progress.) * More to be added soon! ### Supported backend diff --git a/onnxruntime/core/providers/ngraph/ngraph_custom_op.cc b/onnxruntime/core/providers/ngraph/ngraph_custom_op.cc index e7c681d510..22d6b4a649 100644 --- a/onnxruntime/core/providers/ngraph/ngraph_custom_op.cc +++ b/onnxruntime/core/providers/ngraph/ngraph_custom_op.cc @@ -5,10 +5,18 @@ #include #include +#if defined(_MSC_VER) +#pragma warning(disable:4244 4245) +#elif __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" +#endif #include +#if defined(_MSC_VER) +#pragma warning(default:4244 4245) +#elif __GNUC__ #pragma GCC diagnostic pop +#endif #include "ngraph_custom_op.h" #include "core/common/logging/logging.h" @@ -45,6 +53,16 @@ static DType GetDataType(const ngraph::element::Type& ng_type) { } } +static bool check_ngraph_dump_ops() { +#ifdef _WIN32 + size_t env_name_len = 0; + char* env_name = nullptr; + return (_dupenv_s(&env_name, &env_name_len, "ONNXRUNTIME_NGRAPH_DUMP_OPS") == 0); +#else + return (std::getenv("ONNXRUNTIME_NGRAPH_DUMP_OPS") != nullptr); +#endif +} + NGRAPHCustomOp::NGRAPHCustomOp(const ComputeContext* context, const ONNX_NAMESPACE::ModelProto& model_proto, const std::shared_ptr& ng_backend) : ng_backend_{ng_backend}, @@ -54,7 +72,7 @@ NGRAPHCustomOp::NGRAPHCustomOp(const ComputeContext* context, const ONNX_NAMESPA allocator_ = context->allocator_handle; name_ = context->node_name; - if (std::getenv("ONNXRUNTIME_NGRAPH_DUMP_OPS") != nullptr) { + if (check_ngraph_dump_ops()) { std::fstream dump(name_ + ".onnx", std::ios::out | std::ios::trunc | std::ios::binary); model_proto_.SerializeToOstream(&dump); } @@ -92,7 +110,7 @@ void NGRAPHCustomOp::Initialize(const ONNXRunTimeTensor* input_tensors, const si auto graph_proto = model_proto_.mutable_graph(); // Clear previous shapes if any and set new input shapes for (size_t i = 0; i < num_inputs; i++) { - auto g_in_shape = graph_proto->mutable_input(i)->mutable_type()->mutable_tensor_type()->mutable_shape(); + auto g_in_shape = graph_proto->mutable_input((int)i)->mutable_type()->mutable_tensor_type()->mutable_shape(); g_in_shape->clear_dim(); for (size_t dim = 0; dim < input_tensors[i].ndim; dim++) { diff --git a/onnxruntime/core/providers/ngraph/ngraph_custom_op.h b/onnxruntime/core/providers/ngraph/ngraph_custom_op.h index 630a070cdc..80676fc1a0 100644 --- a/onnxruntime/core/providers/ngraph/ngraph_custom_op.h +++ b/onnxruntime/core/providers/ngraph/ngraph_custom_op.h @@ -3,10 +3,19 @@ #pragma once +#if defined(_MSC_VER) +#pragma warning(disable:4244 4245) +#elif __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" +#endif #include +#if defined(_MSC_VER) +#pragma warning(default:4244 4245) +#elif __GNUC__ #pragma GCC diagnostic pop +#endif + #include "core/framework/func_api.h" #include "core/graph/onnx_protobuf.h" diff --git a/onnxruntime/core/providers/ngraph/ngraph_execution_provider.cc b/onnxruntime/core/providers/ngraph/ngraph_execution_provider.cc index a9a13875a6..f584aac478 100644 --- a/onnxruntime/core/providers/ngraph/ngraph_execution_provider.cc +++ b/onnxruntime/core/providers/ngraph/ngraph_execution_provider.cc @@ -11,13 +11,21 @@ #include "ngraph_execution_provider.h" #include "ngraph_custom_op.h" +#if defined(_MSC_VER) +#pragma warning(disable:4244 4245) +#elif __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" +#endif #include #include +#if defined(_MSC_VER) +#pragma warning(default:4244 4245) +#elif __GNUC__ #pragma GCC diagnostic pop +#endif -#define MEMCPY_S(dest, src, destsz, srcsz) memcpy(dest, src, MIN(destsz, srcsz)) +#define MEMCPY_S(dest, src, destsz, srcsz) memcpy(dest, src, std::min(destsz, srcsz)) namespace onnxruntime { diff --git a/tools/ci_build/github/azure-pipelines/win-ngraph-ci-pipeline.yml b/tools/ci_build/github/azure-pipelines/win-ngraph-ci-pipeline.yml new file mode 100644 index 0000000000..4493786a6f --- /dev/null +++ b/tools/ci_build/github/azure-pipelines/win-ngraph-ci-pipeline.yml @@ -0,0 +1,40 @@ +jobs: +- job: Windows_nGraph_CI_Dev + variables: + buildDirectory: '$(Build.BinariesDirectory)' + steps: + - template: templates/set-test-data-variables-step.yml + - template: templates/windows-build-tools-setup-steps.yml + parameters: + EnvSetupScript: 'setup_env.bat' + buildArch: 'x64' + setVcvars: false + - task: CmdLine@1 + displayName: 'Download test data and generate cmake config' + inputs: + filename: '$(Build.BinariesDirectory)\packages\python\python.exe' + arguments: '$(Build.SourcesDirectory)\tools\ci_build\build.py --config Release --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --cmake_path $(Build.BinariesDirectory)\cmake\bin\cmake.exe --ctest_path $(Build.BinariesDirectory)\cmake\bin\ctest.exe --enable_pybind --use_openmp --use_ngraph --use_full_protobuf --build_shared_lib --enable_onnx_tests --test_data_url $(TestDataUrl) --test_data_checksum $(TestDataChecksum) --gen_doc --update' + workingDirectory: "$(Build.BinariesDirectory)" + + - task: VSBuild@1 + displayName: 'Build Release' + inputs: + solution: '$(Build.BinariesDirectory)\Release\onnxruntime.sln' + platform: 'x64' + configuration: 'Release' + msbuildArgs: '/m' + msbuildArchitecture: 'x64' + logProjectEvents: true + workingFolder: '$(Build.BinariesDirectory)\Release' + - task: BatchScript@1 + displayName: 'Test Release' + inputs: + filename: '$(Build.BinariesDirectory)\packages\python\python.exe' + arguments: '$(Build.SourcesDirectory)\tools\ci_build\build.py --config Release --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --cmake_path $(Build.BinariesDirectory)\cmake\bin\cmake.exe --ctest_path $(Build.BinariesDirectory)\cmake\bin\ctest.exe --use_tvm --enable_pybind --use_mkldnn --use_mklml --use_openmp --use_ngraph --build_shared_lib --enable_onnx_tests --test_data_url $(TestDataUrl) --test_data_checksum $(TestDataChecksum) --test' + workingFolder: "$(Build.BinariesDirectory)" + + - task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0 + displayName: 'Component Detection' + condition: and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI')) + + - template: templates/clean-agent-build-directory-step.yml