mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-05-28 22:56:32 +00:00
## Description 1. Convert some git submodules to cmake external projects 2. Update nsync from [1.23.0](https://github.com/google/nsync/releases/tag/1.23.0) to [1.25.0](https://github.com/google/nsync/releases/tag/1.25.0) 3. Update re2 from 2021-06-01 to 2022-06-01 4. Update wil from an old commit to 1.0.220914.1 tag 5. Update gtest to a newer commit so that it can optionally leverage absl/re2 for parsing command line flags. The following git submodules are deleted: 1. FP16 2. safeint 3. XNNPACK 4. cxxopts 5. dlpack 7. flatbuffers 8. googlebenchmark 9. json 10. mimalloc 11. mp11 12. pthreadpool More will come. ## Motivation and Context There are 3 ways of integrating 3rd party C/C++ libraries into ONNX Runtime: 1. Install them to a system location, then use cmake's find_package module to locate them. 2. Use git submodules 6. Use cmake's external projects(externalproject_add). At first when this project was just started, we considered both option 2 and option 3. We preferred option 2 because: 1. It's easier to handle authentication. At first this project was not open source, and it had some other non-public dependencies. If we use git submodule, ADO will handle authentication smoothly. Otherwise we need to manually pass tokens around and be very careful on not exposing them in build logs. 2. At that time, cmake fetched dependencies after "cmake" finished generating vcprojects/makefiles. So it was very difficult to make cflags consistent. Since cmake 3.11, it has a new command: FetchContent, which fetches dependencies when it generates vcprojects/makefiles just before add_subdirectories, so the parent project's variables/settings can be easily passed to the child projects. And when the project went on, we had some new concerns: 1. As we started to have more and more EPs and build configs, the number of submodules grew quickly. For more developers, most ORT submodules are not relevant to them. They shouldn't need to download all of them. 2. It is impossible to let two different build configs use two different versions of the same dependency. For example, right now we have protobuf 3.18.3 in the submodules. Then every EP must use the same version. Whenever we have a need to upgrade protobuf, we need to coordinate across the whole team and many external developers. I can't manage it anymore. 3. Some projects want to manage the dependencies in a different way, either because of their preference or because of compliance requirements. For example, some Microsoft teams want to use vcpkg, but we don't want to force every user of onnxruntime using vcpkg. 7. Someone wants to dynamically link to protobuf, but our build script only does static link. 8. Hard to handle security vulnerabilities. For example, whenever protobuf has a security patch, we have a lot of things to do. But if we allowed people to build ORT with a different version of protobuf without changing ORT"s source code, the customer who build ORT from source will be able to act on such things in a quicker way. They will not need to wait ORT having a patch release. 9. Every time we do a release, github will also publish a source file zip file and a source file tarball for us. But they are not usable, because they miss submodules. ### New features After this change, users will be able to: 1. Build the dependencies in the way they want, then install them to somewhere(for example, /usr or a temp folder). 2. Or download the dependencies by using cmake commands from these dependencies official website 3. Similar to the above, but use your private mirrors to migrate supply chain risks. 4. Use different versions of the dependencies, as long as our source code is compatible with them. For example, you may use you can't use protobuf 3.20.x as they need code changes in ONNX Runtime. 6. Only download the things the current build needs. 10. Avoid building external dependencies again and again in every build. ### Breaking change The onnxruntime_PREFER_SYSTEM_LIB build option is removed you could think from now it is default ON. If you don't like the new behavior, you can set FETCHCONTENT_TRY_FIND_PACKAGE_MODE to NEVER. Besides, for who relied on the onnxruntime_PREFER_SYSTEM_LIB build option, please be aware that this PR will change find_package calls from Module mode to Config mode. For example, in the past if you have installed protobuf from apt-get from ubuntu 20.04's official repo, find_package can find it and use it. But after this PR, it won't. This is because that protobuf version provided by Ubuntu 20.04 is too old to support the "config mode". It can be resolved by getting a newer version of protobuf from somewhere.
269 lines
13 KiB
CMake
269 lines
13 KiB
CMake
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
# Licensed under the MIT License.
|
|
|
|
set (CXXOPTS ${cxxopts_SOURCE_DIR}/include)
|
|
|
|
# training lib
|
|
file(GLOB_RECURSE onnxruntime_training_srcs
|
|
"${ORTTRAINING_SOURCE_DIR}/core/framework/*.h"
|
|
"${ORTTRAINING_SOURCE_DIR}/core/framework/*.cc"
|
|
"${ORTTRAINING_SOURCE_DIR}/core/framework/tensorboard/*.h"
|
|
"${ORTTRAINING_SOURCE_DIR}/core/framework/tensorboard/*.cc"
|
|
"${ORTTRAINING_SOURCE_DIR}/core/framework/adasum/*"
|
|
"${ORTTRAINING_SOURCE_DIR}/core/framework/communication/*"
|
|
"${ORTTRAINING_SOURCE_DIR}/core/session/*.h"
|
|
"${ORTTRAINING_SOURCE_DIR}/core/session/*.cc"
|
|
"${ORTTRAINING_SOURCE_DIR}/core/agent/*.h"
|
|
"${ORTTRAINING_SOURCE_DIR}/core/agent/*.cc"
|
|
)
|
|
|
|
|
|
# This needs to be built in framework.cmake
|
|
file(GLOB_RECURSE onnxruntime_training_framework_excluded_srcs CONFIGURE_DEPENDS
|
|
"${ORTTRAINING_SOURCE_DIR}/core/framework/torch/*.h"
|
|
"${ORTTRAINING_SOURCE_DIR}/core/framework/torch/*.cc"
|
|
)
|
|
|
|
list(REMOVE_ITEM onnxruntime_training_srcs ${onnxruntime_training_framework_excluded_srcs})
|
|
|
|
onnxruntime_add_static_library(onnxruntime_training ${onnxruntime_training_srcs})
|
|
add_dependencies(onnxruntime_training onnx tensorboard ${onnxruntime_EXTERNAL_DEPENDENCIES})
|
|
onnxruntime_add_include_to_target(onnxruntime_training onnxruntime_common onnx onnx_proto tensorboard ${PROTOBUF_LIB} flatbuffers re2::re2 Boost::mp11 safeint_interface)
|
|
|
|
# fix event_writer.cc 4100 warning
|
|
if(WIN32)
|
|
target_compile_options(onnxruntime_training PRIVATE /wd4100)
|
|
endif()
|
|
|
|
target_include_directories(onnxruntime_training PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${ONNXRUNTIME_ROOT} ${ORTTRAINING_ROOT} ${eigen_INCLUDE_DIRS} PUBLIC ${onnxruntime_graph_header} ${MPI_CXX_INCLUDE_DIRS})
|
|
|
|
if (onnxruntime_USE_CUDA)
|
|
target_include_directories(onnxruntime_training PRIVATE ${onnxruntime_CUDNN_HOME}/include ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
|
|
endif()
|
|
|
|
if (onnxruntime_USE_NCCL)
|
|
target_include_directories(onnxruntime_training PRIVATE ${NCCL_INCLUDE_DIRS})
|
|
endif()
|
|
|
|
if (onnxruntime_BUILD_UNIT_TESTS)
|
|
set_target_properties(onnxruntime_training PROPERTIES FOLDER "ONNXRuntime")
|
|
source_group(TREE ${ORTTRAINING_ROOT} FILES ${onnxruntime_training_srcs})
|
|
|
|
# training runner lib
|
|
file(GLOB_RECURSE onnxruntime_training_runner_srcs
|
|
"${ORTTRAINING_SOURCE_DIR}/models/runner/*.h"
|
|
"${ORTTRAINING_SOURCE_DIR}/models/runner/*.cc"
|
|
)
|
|
|
|
# perf test utils
|
|
set(onnxruntime_perf_test_src_dir ${TEST_SRC_DIR}/perftest)
|
|
set(onnxruntime_perf_test_src
|
|
"${onnxruntime_perf_test_src_dir}/utils.h")
|
|
|
|
if(WIN32)
|
|
list(APPEND onnxruntime_perf_test_src
|
|
"${onnxruntime_perf_test_src_dir}/windows/utils.cc")
|
|
else ()
|
|
list(APPEND onnxruntime_perf_test_src
|
|
"${onnxruntime_perf_test_src_dir}/posix/utils.cc")
|
|
endif()
|
|
|
|
onnxruntime_add_static_library(onnxruntime_training_runner ${onnxruntime_training_runner_srcs} ${onnxruntime_perf_test_src})
|
|
add_dependencies(onnxruntime_training_runner ${onnxruntime_EXTERNAL_DEPENDENCIES} onnx onnxruntime_providers)
|
|
|
|
if (onnxruntime_ENABLE_TRAINING_TORCH_INTEROP)
|
|
target_link_libraries(onnxruntime_training_runner PRIVATE Python::Python)
|
|
endif()
|
|
|
|
onnxruntime_add_include_to_target(onnxruntime_training_runner onnxruntime_training onnxruntime_framework onnxruntime_common onnx onnx_proto ${PROTOBUF_LIB} onnxruntime_training flatbuffers Boost::mp11 safeint_interface)
|
|
|
|
target_include_directories(onnxruntime_training_runner PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${ONNXRUNTIME_ROOT} ${ORTTRAINING_ROOT} ${eigen_INCLUDE_DIRS} PUBLIC ${onnxruntime_graph_header})
|
|
target_link_libraries(onnxruntime_training_runner PRIVATE nlohmann_json::nlohmann_json)
|
|
if (onnxruntime_USE_CUDA)
|
|
target_include_directories(onnxruntime_training_runner PUBLIC ${onnxruntime_CUDNN_HOME}/include ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
|
|
endif()
|
|
|
|
if (onnxruntime_USE_NCCL)
|
|
target_include_directories(onnxruntime_training_runner PRIVATE ${NCCL_INCLUDE_DIRS})
|
|
endif()
|
|
|
|
if (onnxruntime_USE_ROCM)
|
|
add_definitions(-DUSE_ROCM=1)
|
|
target_include_directories(onnxruntime_training_runner PUBLIC ${onnxruntime_ROCM_HOME}/include)
|
|
endif()
|
|
|
|
check_cxx_compiler_flag(-Wno-maybe-uninitialized HAS_NO_MAYBE_UNINITIALIZED)
|
|
if(UNIX AND NOT APPLE)
|
|
if (HAS_NO_MAYBE_UNINITIALIZED)
|
|
target_compile_options(onnxruntime_training_runner PUBLIC "-Wno-maybe-uninitialized")
|
|
endif()
|
|
endif()
|
|
|
|
if (onnxruntime_USE_ROCM)
|
|
target_compile_options(onnxruntime_training_runner PUBLIC -D__HIP_PLATFORM_AMD__=1 -D__HIP_PLATFORM_HCC__=1)
|
|
endif()
|
|
|
|
set_target_properties(onnxruntime_training_runner PROPERTIES FOLDER "ONNXRuntimeTest")
|
|
source_group(TREE ${REPO_ROOT} FILES ${onnxruntime_training_runner_srcs} ${onnxruntime_perf_test_src})
|
|
|
|
# MNIST
|
|
file(GLOB_RECURSE training_mnist_src
|
|
"${ORTTRAINING_SOURCE_DIR}/models/mnist/*.h"
|
|
"${ORTTRAINING_SOURCE_DIR}/models/mnist/mnist_data_provider.cc"
|
|
"${ORTTRAINING_SOURCE_DIR}/models/mnist/main.cc"
|
|
)
|
|
onnxruntime_add_executable(onnxruntime_training_mnist ${training_mnist_src})
|
|
onnxruntime_add_include_to_target(onnxruntime_training_mnist onnxruntime_common onnx onnx_proto ${PROTOBUF_LIB} onnxruntime_training flatbuffers Boost::mp11 safeint_interface)
|
|
target_include_directories(onnxruntime_training_mnist PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${ONNXRUNTIME_ROOT} ${ORTTRAINING_ROOT} ${eigen_INCLUDE_DIRS} ${CXXOPTS} ${extra_includes} ${onnxruntime_graph_header} ${onnxruntime_exec_src_dir} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/onnx onnxruntime_training_runner)
|
|
|
|
set(ONNXRUNTIME_LIBS
|
|
onnxruntime_session
|
|
${onnxruntime_libs}
|
|
${PROVIDERS_MKLDNN}
|
|
${PROVIDERS_DML}
|
|
onnxruntime_optimizer
|
|
onnxruntime_providers
|
|
onnxruntime_util
|
|
onnxruntime_framework
|
|
)
|
|
|
|
if (onnxruntime_ENABLE_TRAINING_TORCH_INTEROP)
|
|
list(APPEND ONNXRUNTIME_LIBS Python::Python)
|
|
endif()
|
|
|
|
list(APPEND ONNXRUNTIME_LIBS
|
|
onnxruntime_graph
|
|
${ONNXRUNTIME_MLAS_LIBS}
|
|
onnxruntime_common
|
|
onnxruntime_flatbuffers
|
|
Boost::mp11 safeint_interface
|
|
)
|
|
|
|
if (onnxruntime_ENABLE_LANGUAGE_INTEROP_OPS)
|
|
list(APPEND ONNXRUNTIME_LIBS onnxruntime_language_interop onnxruntime_pyop)
|
|
endif()
|
|
|
|
if(UNIX AND NOT APPLE)
|
|
if (HAS_NO_MAYBE_UNINITIALIZED)
|
|
target_compile_options(onnxruntime_training_mnist PUBLIC "-Wno-maybe-uninitialized")
|
|
endif()
|
|
endif()
|
|
target_link_libraries(onnxruntime_training_mnist PRIVATE onnxruntime_training_runner onnxruntime_training ${ONNXRUNTIME_LIBS} ${onnxruntime_EXTERNAL_LIBRARIES})
|
|
set_target_properties(onnxruntime_training_mnist PROPERTIES FOLDER "ONNXRuntimeTest")
|
|
|
|
# squeezenet
|
|
# Disabling build for squeezenet, as no one is using this
|
|
#[[
|
|
file(GLOB_RECURSE training_squeezene_src
|
|
"${ORTTRAINING_SOURCE_DIR}/models/squeezenet/*.h"
|
|
"${ORTTRAINING_SOURCE_DIR}/models/squeezenet/*.cc"
|
|
)
|
|
onnxruntime_add_executable(onnxruntime_training_squeezenet ${training_squeezene_src})
|
|
onnxruntime_add_include_to_target(onnxruntime_training_squeezenet onnxruntime_common onnx onnx_proto ${PROTOBUF_LIB} onnxruntime_training flatbuffers Boost::mp11 safeint_interface)
|
|
target_include_directories(onnxruntime_training_squeezenet PUBLIC ${ONNXRUNTIME_ROOT} ${ORTTRAINING_ROOT} ${eigen_INCLUDE_DIRS} ${extra_includes} ${onnxruntime_graph_header} ${onnxruntime_exec_src_dir} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/onnx onnxruntime_training_runner)
|
|
|
|
if(UNIX AND NOT APPLE)
|
|
target_compile_options(onnxruntime_training_squeezenet PUBLIC "-Wno-maybe-uninitialized")
|
|
endif()
|
|
target_link_libraries(onnxruntime_training_squeezenet PRIVATE onnxruntime_training_runner onnxruntime_training ${ONNXRUNTIME_LIBS} ${onnxruntime_EXTERNAL_LIBRARIES})
|
|
set_target_properties(onnxruntime_training_squeezenet PROPERTIES FOLDER "ONNXRuntimeTest")
|
|
]]
|
|
|
|
# BERT
|
|
file(GLOB_RECURSE training_bert_src
|
|
"${ORTTRAINING_SOURCE_DIR}/models/bert/*.h"
|
|
"${ORTTRAINING_SOURCE_DIR}/models/bert/*.cc"
|
|
)
|
|
onnxruntime_add_executable(onnxruntime_training_bert ${training_bert_src})
|
|
|
|
if(UNIX AND NOT APPLE)
|
|
if (HAS_NO_MAYBE_UNINITIALIZED)
|
|
target_compile_options(onnxruntime_training_bert PUBLIC "-Wno-maybe-uninitialized")
|
|
endif()
|
|
endif()
|
|
|
|
onnxruntime_add_include_to_target(onnxruntime_training_bert onnxruntime_common onnx onnx_proto ${PROTOBUF_LIB} onnxruntime_training flatbuffers Boost::mp11 safeint_interface)
|
|
target_include_directories(onnxruntime_training_bert PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${ONNXRUNTIME_ROOT} ${ORTTRAINING_ROOT} ${MPI_CXX_INCLUDE_DIRS} ${eigen_INCLUDE_DIRS} ${CXXOPTS} ${extra_includes} ${onnxruntime_graph_header} ${onnxruntime_exec_src_dir} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/onnx onnxruntime_training_runner)
|
|
|
|
# ROCM provider sources are generated, need to add include directory for generated headers
|
|
if (onnxruntime_USE_ROCM)
|
|
target_include_directories(onnxruntime_training_bert PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/amdgpu/onnxruntime)
|
|
endif()
|
|
|
|
target_link_libraries(onnxruntime_training_bert PRIVATE onnxruntime_training_runner onnxruntime_training ${ONNXRUNTIME_LIBS} ${onnxruntime_EXTERNAL_LIBRARIES})
|
|
set_target_properties(onnxruntime_training_bert PROPERTIES FOLDER "ONNXRuntimeTest")
|
|
|
|
# Pipeline
|
|
file(GLOB_RECURSE training_pipeline_poc_src
|
|
"${ORTTRAINING_SOURCE_DIR}/models/pipeline_poc/*.h"
|
|
"${ORTTRAINING_SOURCE_DIR}/models/pipeline_poc/*.cc"
|
|
)
|
|
onnxruntime_add_executable(onnxruntime_training_pipeline_poc ${training_pipeline_poc_src})
|
|
|
|
if(UNIX AND NOT APPLE)
|
|
if (HAS_NO_MAYBE_UNINITIALIZED)
|
|
target_compile_options(onnxruntime_training_pipeline_poc PUBLIC "-Wno-maybe-uninitialized")
|
|
endif()
|
|
endif()
|
|
|
|
onnxruntime_add_include_to_target(onnxruntime_training_pipeline_poc onnxruntime_common onnx onnx_proto ${PROTOBUF_LIB} onnxruntime_training flatbuffers Boost::mp11 safeint_interface)
|
|
target_include_directories(onnxruntime_training_pipeline_poc PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${ONNXRUNTIME_ROOT} ${ORTTRAINING_ROOT} ${MPI_CXX_INCLUDE_DIRS} ${eigen_INCLUDE_DIRS} ${CXXOPTS} ${extra_includes} ${onnxruntime_graph_header} ${onnxruntime_exec_src_dir} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/onnx onnxruntime_training_runner)
|
|
if (onnxruntime_USE_NCCL)
|
|
target_include_directories(onnxruntime_training_pipeline_poc PRIVATE ${NCCL_INCLUDE_DIRS})
|
|
endif()
|
|
|
|
target_link_libraries(onnxruntime_training_pipeline_poc PRIVATE onnxruntime_training_runner onnxruntime_training ${ONNXRUNTIME_LIBS} ${onnxruntime_EXTERNAL_LIBRARIES})
|
|
set_target_properties(onnxruntime_training_pipeline_poc PROPERTIES FOLDER "ONNXRuntimeTest")
|
|
|
|
# GPT-2
|
|
file(GLOB_RECURSE training_gpt2_src
|
|
"${ORTTRAINING_SOURCE_DIR}/models/gpt2/*.h"
|
|
"${ORTTRAINING_SOURCE_DIR}/models/gpt2/*.cc"
|
|
)
|
|
onnxruntime_add_executable(onnxruntime_training_gpt2 ${training_gpt2_src})
|
|
if(UNIX AND NOT APPLE)
|
|
if (HAS_NO_MAYBE_UNINITIALIZED)
|
|
target_compile_options(onnxruntime_training_gpt2 PUBLIC "-Wno-maybe-uninitialized")
|
|
endif()
|
|
endif()
|
|
|
|
target_include_directories(onnxruntime_training_gpt2 PUBLIC ${CMAKE_CURRENT_BINARY_DIR} ${ONNXRUNTIME_ROOT} ${ORTTRAINING_ROOT} ${MPI_CXX_INCLUDE_DIRS} ${eigen_INCLUDE_DIRS} ${CXXOPTS} ${extra_includes} ${onnxruntime_graph_header} ${onnxruntime_exec_src_dir} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/onnx onnxruntime_training_runner)
|
|
|
|
target_link_libraries(onnxruntime_training_gpt2 PRIVATE onnxruntime_training_runner onnxruntime_training ${ONNXRUNTIME_LIBS} ${onnxruntime_EXTERNAL_LIBRARIES})
|
|
set_target_properties(onnxruntime_training_gpt2 PROPERTIES FOLDER "ONNXRuntimeTest")
|
|
|
|
# Training API Tests
|
|
# Currently disable it by default for internal development usage.
|
|
if (onnxruntime_ENABLE_TRAINING_ON_DEVICE)
|
|
# Only files in the trainer and common folder will be compiled into test trainer.
|
|
file(GLOB training_api_test_trainer_src
|
|
"${ORTTRAINING_SOURCE_DIR}/test/training_api/common/*.cc"
|
|
"${ORTTRAINING_SOURCE_DIR}/test/training_api/common/*.h"
|
|
"${ORTTRAINING_SOURCE_DIR}/test/training_api/trainer/*.cc"
|
|
"${ORTTRAINING_SOURCE_DIR}/test/training_api/trainer/*.h"
|
|
)
|
|
onnxruntime_add_executable(onnxruntime_test_trainer ${training_api_test_trainer_src})
|
|
|
|
onnxruntime_add_include_to_target(onnxruntime_test_trainer onnxruntime_training
|
|
onnxruntime_framework onnxruntime_common onnx onnx_proto ${PROTOBUF_LIB} flatbuffers)
|
|
|
|
target_include_directories(onnxruntime_test_trainer PRIVATE
|
|
${CMAKE_CURRENT_BINARY_DIR}
|
|
${ONNXRUNTIME_ROOT}
|
|
${ORTTRAINING_ROOT}
|
|
${eigen_INCLUDE_DIRS}
|
|
${CXXOPTS}
|
|
${extra_includes}
|
|
${onnxruntime_graph_header}
|
|
${onnxruntime_exec_src_dir}
|
|
)
|
|
|
|
target_link_libraries(onnxruntime_test_trainer PRIVATE
|
|
onnxruntime_training
|
|
${ONNXRUNTIME_LIBS}
|
|
${onnxruntime_EXTERNAL_LIBRARIES}
|
|
)
|
|
set_target_properties(onnxruntime_test_trainer PROPERTIES FOLDER "ONNXRuntimeTest")
|
|
endif()
|
|
|
|
endif()
|