From 58a46a174efd626fe8dfda05cf73ccf0c5589fb6 Mon Sep 17 00:00:00 2001 From: Mo Zhou Date: Wed, 29 Apr 2020 09:20:15 -0700 Subject: [PATCH] [cmake] add USE_SYSTEM_{XNNPACK,ONNX} options. (#37501) Summary: ezyang Pull Request resolved: https://github.com/pytorch/pytorch/pull/37501 Differential Revision: D21303527 Pulled By: ezyang fbshipit-source-id: 58353d78c66e5bcc9198ce8cde36ac7232bb4b2f --- CMakeLists.txt | 10 +++++++- cmake/Dependencies.cmake | 50 +++++++++++++++++++++++++++++-------- test/cpp/jit/CMakeLists.txt | 3 +++ 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 88748ac3dcd..6e9d392391e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -222,6 +222,8 @@ option(USE_SYSTEM_PTHREADPOOL "Use system-provided pthreadpool." OFF) option(USE_SYSTEM_PSIMD "Use system-provided psimd." OFF) option(USE_SYSTEM_FXDIV "Use system-provided fxdiv." OFF) option(USE_SYSTEM_BENCHMARK "Use system-provided google benchmark." OFF) +option(USE_SYSTEM_ONNX "Use system-provided onnx." OFF) +option(USE_SYSTEM_XNNPACK "Use system-provided xnnpack." OFF) if(USE_SYSTEM_LIBS) set(USE_SYSTEM_CPUINFO ON) set(USE_SYSTEM_SLEEF ON) @@ -233,6 +235,8 @@ if(USE_SYSTEM_LIBS) set(USE_SYSTEM_PSIMD ON) set(USE_SYSTEM_FXDIV ON) set(USE_SYSTEM_BENCHMARK ON) + set(USE_SYSTEM_ONNX ON) + set(USE_SYSTEM_XNNPACK ON) endif() # Used when building Caffe2 through setup.py @@ -246,7 +250,11 @@ cmake_dependent_option( MSVC_Z7_OVERRIDE "Work around sccache bug by replacing /Zi and /ZI with /Z7 when using MSVC (if you are not using sccache, you can turn this OFF)" ON "MSVC" OFF) -set(ONNX_NAMESPACE "onnx_torch" CACHE STRING "A namespace for ONNX; needed to build with other frameworks that share ONNX.") +if(NOT USE_SYSTEM_ONNX) + set(ONNX_NAMESPACE "onnx_torch" CACHE STRING "A namespace for ONNX; needed to build with other frameworks that share ONNX.") +elseif() + set(ONNX_NAMESPACE "onnx" CACHE STRING "A namespace for ONNX; needed to build with other frameworks that share ONNX.") +endif() set(SELECTED_OP_LIST "" CACHE STRING "Path to the yaml file that contains the list of operators to include for custom build. Include all operators by default.") set(OP_DEPENDENCY "" CACHE STRING diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake index 0de990c5154..366354fa141 100644 --- a/cmake/Dependencies.cmake +++ b/cmake/Dependencies.cmake @@ -299,7 +299,7 @@ endif() # that allows us to hijack pthreadpool interface. # Thus not doing this ends up building pthreadpool as well as # the internal implemenation of pthreadpool which results in symbol conflicts. -if(USE_XNNPACK) +if(USE_XNNPACK AND NOT USE_SYSTEM_XNNPACK) if(NOT DEFINED PTHREADPOOL_SOURCE_DIR) set(CAFFE2_THIRD_PARTY_ROOT "${PROJECT_SOURCE_DIR}/third_party") set(PTHREADPOOL_SOURCE_DIR "${CAFFE2_THIRD_PARTY_ROOT}/pthreadpool" CACHE STRING "pthreadpool source directory") @@ -430,7 +430,7 @@ if(USE_NNPACK) endif() # ---[ XNNPACK -if(USE_XNNPACK) +if(USE_XNNPACK AND NOT USE_SYSTEM_XNNPACK) if(NOT DEFINED XNNPACK_SOURCE_DIR) set(XNNPACK_SOURCE_DIR "${CAFFE2_THIRD_PARTY_ROOT}/XNNPACK" CACHE STRING "XNNPACK source directory") endif() @@ -463,6 +463,15 @@ if(USE_XNNPACK) include_directories(SYSTEM ${XNNPACK_INCLUDE_DIR}) list(APPEND Caffe2_DEPENDENCY_LIBS XNNPACK) +elseif(NOT TARGET XNNPACK AND USE_SYSTEM_XNNPACK) + add_library(XNNPACK SHARED IMPORTED) + find_library(XNNPACK_LIBRARY XNNPACK) + set_property(TARGET XNNPACK PROPERTY IMPORTED_LOCATION "${XNNPACK_LIBRARY}") + if(NOT XNNPACK_LIBRARY) + message(FATAL_ERROR "Cannot find XNNPACK") + endif() + message("-- Found XNNPACK: ${XNNPACK_LIBRARY}") + list(APPEND Caffe2_DEPENDENCY_LIBS XNNPACK) endif() # ---[ gflags @@ -1280,20 +1289,39 @@ if(CAFFE2_CMAKE_BUILDING_WITH_MAIN_REPO AND NOT INTERN_DISABLE_ONNX) add_definitions(-DONNXIFI_ENABLE_EXT=1) # Add op schemas in "ai.onnx.pytorch" domain add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/../caffe2/onnx/torch_ops") - add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../third_party/onnx EXCLUDE_FROM_ALL) + if(NOT USE_SYSTEM_ONNX) + add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../third_party/onnx EXCLUDE_FROM_ALL) + endif() add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../third_party/foxi EXCLUDE_FROM_ALL) - include_directories(${ONNX_INCLUDE_DIRS}) - include_directories(${FOXI_INCLUDE_DIRS}) add_definitions(-DONNX_NAMESPACE=${ONNX_NAMESPACE}) - # In mobile build we care about code size, and so we need drop - # everything (e.g. checker, optimizer) in onnx but the pb definition. - if(ANDROID OR IOS) - caffe2_interface_library(onnx_proto onnx_library) + if(NOT USE_SYSTEM_ONNX) + include_directories(${ONNX_INCLUDE_DIRS}) + # In mobile build we care about code size, and so we need drop + # everything (e.g. checker, optimizer) in onnx but the pb definition. + if(ANDROID OR IOS) + caffe2_interface_library(onnx_proto onnx_library) + else() + caffe2_interface_library(onnx onnx_library) + endif() + list(APPEND Caffe2_DEPENDENCY_WHOLE_LINK_LIBS onnx_library) else() - caffe2_interface_library(onnx onnx_library) + add_library(onnx SHARED IMPORTED) + find_library(ONNX_LIBRARY onnx) + if(NOT ONNX_LIBRARY) + message(FATAL_ERROR "Cannot find onnx") + endif() + set_property(TARGET onnx PROPERTY IMPORTED_LOCATION ${ONNX_LIBRARY}) + add_library(onnx_proto SHARED IMPORTED) + find_library(ONNX_PROTO_LIBRARY onnx_proto) + if(NOT ONNX_PROTO_LIBRARY) + message(FATAL_ERROR "Cannot find onnx") + endif() + set_property(TARGET onnx_proto PROPERTY IMPORTED_LOCATION ${ONNX_PROTO_LIBRARY}) + message("-- Found onnx: ${ONNX_LIBRARY} ${ONNX_PROTO_LIBRARY}") + list(APPEND Caffe2_DEPENDENCY_LIBS onnx_proto onnx) endif() - list(APPEND Caffe2_DEPENDENCY_WHOLE_LINK_LIBS onnx_library) + include_directories(${FOXI_INCLUDE_DIRS}) list(APPEND Caffe2_DEPENDENCY_LIBS foxi_loader) # Recover the build shared libs option. set(BUILD_SHARED_LIBS ${TEMP_BUILD_SHARED_LIBS}) diff --git a/test/cpp/jit/CMakeLists.txt b/test/cpp/jit/CMakeLists.txt index d0aea000152..c91b7fc09fc 100644 --- a/test/cpp/jit/CMakeLists.txt +++ b/test/cpp/jit/CMakeLists.txt @@ -47,6 +47,9 @@ add_executable(test_jit ${TORCH_ROOT}/test/cpp/common/main.cpp ${JIT_TEST_ROOT}/gtest.cpp ${JIT_TEST_SRCS}) +if(USE_SYSTEM_ONNX) + target_link_libraries(test_jit PRIVATE onnx_proto onnx) +endif() set(JIT_TEST_DEPENDENCIES torch gtest)