From 7f44ff309d7c86ddd6938f2de067ec9a412468e0 Mon Sep 17 00:00:00 2001 From: wangguibao Date: Mon, 23 Sep 2019 21:56:49 +0800 Subject: [PATCH] binary_inference_lib --- CMakeLists.txt | 1 + cmake/external/cudnn.cmake | 102 ++++++++++++++++++ cmake/paddlepaddle.cmake | 94 ++++++++-------- demo-serving/CMakeLists.txt | 7 +- demo-serving/op/classify_op.h | 2 +- demo-serving/op/ctr_prediction_op.h | 2 +- demo-serving/op/reader_op.h | 2 +- demo-serving/op/text_classification_op.h | 2 +- .../include/fluid_cpu_engine.h | 2 +- .../include/fluid_gpu_engine.h | 2 +- 10 files changed, 164 insertions(+), 52 deletions(-) create mode 100644 cmake/external/cudnn.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 8dab01f1..83f9ca4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,6 +75,7 @@ include(generic) include(flags) if (NOT CLIENT_ONLY) +include(external/cudnn) include(paddlepaddle) include(external/opencv) endif() diff --git a/cmake/external/cudnn.cmake b/cmake/external/cudnn.cmake new file mode 100644 index 00000000..98466d44 --- /dev/null +++ b/cmake/external/cudnn.cmake @@ -0,0 +1,102 @@ +if(NOT WITH_GPU) + return() +endif() + +if(WIN32) + set(CUDNN_ROOT ${CUDA_TOOLKIT_ROOT_DIR}) +else(WIN32) + set(CUDNN_ROOT "/usr" CACHE PATH "CUDNN ROOT") +endif(WIN32) + +find_path(CUDNN_INCLUDE_DIR cudnn.h + PATHS ${CUDNN_ROOT} ${CUDNN_ROOT}/include + $ENV{CUDNN_ROOT} $ENV{CUDNN_ROOT}/include ${CUDA_TOOLKIT_INCLUDE} + NO_DEFAULT_PATH +) + +get_filename_component(__libpath_hist ${CUDA_CUDART_LIBRARY} PATH) + +set(TARGET_ARCH "x86_64") +if(NOT ${CMAKE_SYSTEM_PROCESSOR}) + set(TARGET_ARCH ${CMAKE_SYSTEM_PROCESSOR}) +endif() + +list(APPEND CUDNN_CHECK_LIBRARY_DIRS + ${CUDNN_ROOT} + ${CUDNN_ROOT}/lib64 + ${CUDNN_ROOT}/lib + ${CUDNN_ROOT}/lib/${TARGET_ARCH}-linux-gnu + ${CUDNN_ROOT}/local/cuda-${CUDA_VERSION}/targets/${TARGET_ARCH}-linux/lib/ + $ENV{CUDNN_ROOT} + $ENV{CUDNN_ROOT}/lib64 + $ENV{CUDNN_ROOT}/lib + /usr/lib + ${CUDA_TOOLKIT_ROOT_DIR} + ${CUDA_TOOLKIT_ROOT_DIR}/lib/x64 + ) +set(CUDNN_LIB_NAME "") +if (LINUX) +set(CUDNN_LIB_NAME "libcudnn.so") +endif(LINUX) + +if(WIN32) +# only support cudnn7 +set(CUDNN_LIB_NAME "cudnn.lib" "cudnn64_7.dll") +endif(WIN32) + +if(APPLE) +set(CUDNN_LIB_NAME "libcudnn.dylib" "libcudnn.so") +endif(APPLE) + +find_library(CUDNN_LIBRARY NAMES ${CUDNN_LIB_NAME} # libcudnn_static.a + PATHS ${CUDNN_CHECK_LIBRARY_DIRS} ${CUDNN_INCLUDE_DIR} ${__libpath_hist} + NO_DEFAULT_PATH + DOC "Path to cuDNN library.") + + +if(CUDNN_INCLUDE_DIR AND CUDNN_LIBRARY) + set(CUDNN_FOUND ON) +else() + set(CUDNN_FOUND OFF) +endif() + +if(CUDNN_FOUND) + file(READ ${CUDNN_INCLUDE_DIR}/cudnn.h CUDNN_VERSION_FILE_CONTENTS) + + get_filename_component(CUDNN_LIB_PATH ${CUDNN_LIBRARY} DIRECTORY) + + string(REGEX MATCH "define CUDNN_VERSION +([0-9]+)" + CUDNN_VERSION "${CUDNN_VERSION_FILE_CONTENTS}") + string(REGEX REPLACE "define CUDNN_VERSION +([0-9]+)" "\\1" + CUDNN_VERSION "${CUDNN_VERSION}") + + if("${CUDNN_VERSION}" STREQUAL "2000") + message(STATUS "Current cuDNN version is v2. ") + else() + string(REGEX MATCH "define CUDNN_MAJOR +([0-9]+)" CUDNN_MAJOR_VERSION + "${CUDNN_VERSION_FILE_CONTENTS}") + string(REGEX REPLACE "define CUDNN_MAJOR +([0-9]+)" "\\1" + CUDNN_MAJOR_VERSION "${CUDNN_MAJOR_VERSION}") + string(REGEX MATCH "define CUDNN_MINOR +([0-9]+)" CUDNN_MINOR_VERSION + "${CUDNN_VERSION_FILE_CONTENTS}") + string(REGEX REPLACE "define CUDNN_MINOR +([0-9]+)" "\\1" + CUDNN_MINOR_VERSION "${CUDNN_MINOR_VERSION}") + string(REGEX MATCH "define CUDNN_PATCHLEVEL +([0-9]+)" + CUDNN_PATCHLEVEL_VERSION "${CUDNN_VERSION_FILE_CONTENTS}") + string(REGEX REPLACE "define CUDNN_PATCHLEVEL +([0-9]+)" "\\1" + CUDNN_PATCHLEVEL_VERSION "${CUDNN_PATCHLEVEL_VERSION}") + + if(NOT CUDNN_MAJOR_VERSION) + set(CUDNN_VERSION "???") + else() + add_definitions("-DPADDLE_CUDNN_BINVER=\"${CUDNN_MAJOR_VERSION}\"") + math(EXPR CUDNN_VERSION + "${CUDNN_MAJOR_VERSION} * 1000 + + ${CUDNN_MINOR_VERSION} * 100 + ${CUDNN_PATCHLEVEL_VERSION}") + endif() + + message(STATUS "Current cuDNN header is ${CUDNN_INCLUDE_DIR}/cudnn.h. " + "Current cuDNN version is v${CUDNN_MAJOR_VERSION}.${CUDNN_MINOR_VERSION}. ") + + endif() +endif() diff --git a/cmake/paddlepaddle.cmake b/cmake/paddlepaddle.cmake index 46f172dd..06affcc1 100644 --- a/cmake/paddlepaddle.cmake +++ b/cmake/paddlepaddle.cmake @@ -15,76 +15,82 @@ INCLUDE(ExternalProject) SET(PADDLE_SOURCES_DIR ${THIRD_PARTY_PATH}/Paddle) +SET(PADDLE_DOWNLOAD_DIR ${PADDLE_SOURCES_DIR}/src/extern_paddle) SET(PADDLE_INSTALL_DIR ${THIRD_PARTY_PATH}/install/Paddle/) SET(PADDLE_INCLUDE_DIR "${PADDLE_INSTALL_DIR}/include" CACHE PATH "PaddlePaddle include directory." FORCE) SET(PADDLE_LIBRARIES "${PADDLE_INSTALL_DIR}/lib/libpaddle_fluid.a" CACHE FILEPATH "Paddle library." FORCE) -INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/Paddle/fluid_install_dir) # Reference https://stackoverflow.com/questions/45414507/pass-a-list-of-prefix-paths-to-externalproject-add-in-cmake-args set(prefix_path "${THIRD_PARTY_PATH}/install/gflags|${THIRD_PARTY_PATH}/install/leveldb|${THIRD_PARTY_PATH}/install/snappy|${THIRD_PARTY_PATH}/install/gtest|${THIRD_PARTY_PATH}/install/protobuf|${THIRD_PARTY_PATH}/install/zlib|${THIRD_PARTY_PATH}/install/glog") message( "WITH_GPU = ${WITH_GPU}") -# If minimal .a is need, you can set WITH_DEBUG_SYMBOLS=OFF + +# Paddle Version should be one of: +# latest: latest develop build +# version number like 1.5.2 +SET(PADDLE_VERSION "latest") + +if (WITH_GPU) + SET(PADDLE_LIB_VERSION "${PADDLE_VERSION}-gpu-cuda${CUDA_VERSION_MAJOR}-cudnn7-avx-mkl") +else() + if (AVX_FOUND) + if (WITH_MKLML) + SET(PADDLE_LIB_VERSION "${PADDLE_VERSION}-cpu-avx-mkl") + else() + SET(PADDLE_LIB_VERSION "${PADDLE_VERSION}-cpu-avx-openblas") + endif() + else() + SET(PADDLE_LIB_VERSION "${PADDLE_VERSION}-cpu-noavx-openblas") + endif() +endif() + +SET(PADDLE_LIB_PATH "http://paddle-inference-lib.bj.bcebos.com/${PADDLE_LIB_VERSION}/fluid_inference.tgz") +MESSAGE(STATUS "PADDLE_LIB_PATH=${PADDLE_LIB_PATH}") + ExternalProject_Add( - extern_paddle + "extern_paddle" ${EXTERNAL_PROJECT_LOG_ARGS} - # TODO(wangguibao): change to de newst repo when they changed. - GIT_REPOSITORY "https://github.com/PaddlePaddle/Paddle" - GIT_TAG "v1.5.1" - PREFIX ${PADDLE_SOURCES_DIR} - UPDATE_COMMAND "" - BINARY_DIR ${CMAKE_BINARY_DIR}/Paddle - CMAKE_ARGS -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} - -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} - -DCMAKE_INSTALL_PREFIX=${PADDLE_INSTALL_DIR} - -DCMAKE_INSTALL_LIBDIR=${PADDLE_INSTALL_DIR}/lib - -DCMAKE_POSITION_INDEPENDENT_CODE=ON - -DCMAKE_BUILD_TYPE=${THIRD_PARTY_BUILD_TYPE} - -DCMAKE_PREFIX_PATH=${prefix_path} - -DCMAKE_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} - -DWITH_SWIG_PY=OFF - -DWITH_PYTHON=OFF - -DWITH_MKL=${WITH_MKL} - -DWITH_AVX=${WITH_AVX} - -DWITH_MKLDNN=OFF - -DWITH_GPU=${WITH_GPU} - -DWITH_FLUID_ONLY=ON - -DWITH_TESTING=OFF - -DWITH_DISTRIBUTE=OFF - -DON_INFER=ON - ${EXTERNAL_OPTIONAL_ARGS} - LIST_SEPARATOR | - CMAKE_CACHE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=${PADDLE_INSTALL_DIR} - -DCMAKE_INSTALL_LIBDIR:PATH=${PADDLE_INSTALL_DIR}/lib - -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON - -DCMAKE_BUILD_TYPE:STRING=${THIRD_PARTY_BUILD_TYPE} - BUILD_COMMAND $(MAKE) - INSTALL_COMMAND $(MAKE) fluid_lib_dist + URL "${PADDLE_LIB_PATH}" + PREFIX "${PADDLE_SOURCES_DIR}" + DOWNLOAD_DIR "${PADDLE_DOWNLOAD_DIR}" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + UPDATE_COMMAND "" + INSTALL_COMMAND + ${CMAKE_COMMAND} -E copy_directory ${PADDLE_DOWNLOAD_DIR}/paddle/include ${PADDLE_INSTALL_DIR}/include && + ${CMAKE_COMMAND} -E copy_directory ${PADDLE_DOWNLOAD_DIR}/paddle/lib ${PADDLE_INSTALL_DIR}/lib && + ${CMAKE_COMMAND} -E copy_directory ${PADDLE_DOWNLOAD_DIR}/third_party ${PADDLE_INSTALL_DIR}/third_party ) -ExternalProject_Get_Property(extern_paddle BINARY_DIR) +INCLUDE_DIRECTORIES(${PADDLE_INCLUDE_DIR}) + ADD_LIBRARY(paddle_fluid STATIC IMPORTED GLOBAL) -SET_PROPERTY(TARGET paddle_fluid PROPERTY IMPORTED_LOCATION ${BINARY_DIR}/fluid_install_dir/paddle/fluid/inference/libpaddle_fluid.a) +SET_PROPERTY(TARGET paddle_fluid PROPERTY IMPORTED_LOCATION ${PADDLE_INSTALL_DIR}/lib/libpaddle_fluid.a) LIST(APPEND external_project_dependencies paddle) -ADD_LIBRARY(snappystream STATIC IMPORTED GLOBAL) -SET_PROPERTY(TARGET snappystream PROPERTY IMPORTED_LOCATION ${BINARY_DIR}/fluid_install_dir/third_party/install/snappystream/lib/libsnappystream.a) +#ADD_LIBRARY(snappystream STATIC IMPORTED GLOBAL) +#SET_PROPERTY(TARGET snappystream PROPERTY IMPORTED_LOCATION ${PADDLE_INSTALL_DIR}/third_party/install/snappystream/lib/libsnappystream.a) ADD_LIBRARY(xxhash STATIC IMPORTED GLOBAL) -SET_PROPERTY(TARGET xxhash PROPERTY IMPORTED_LOCATION ${BINARY_DIR}/fluid_install_dir/third_party/install/xxhash/lib/libxxhash.a) +SET_PROPERTY(TARGET xxhash PROPERTY IMPORTED_LOCATION ${PADDLE_INSTALL_DIR}/third_party/install/xxhash/lib/libxxhash.a) ADD_LIBRARY(iomp5 SHARED IMPORTED GLOBAL) -SET_PROPERTY(TARGET iomp5 PROPERTY IMPORTED_LOCATION ${BINARY_DIR}/fluid_install_dir/third_party/install/mklml/lib/libiomp5.so) +SET_PROPERTY(TARGET iomp5 PROPERTY IMPORTED_LOCATION ${PADDLE_INSTALL_DIR}/third_party/install/mklml/lib/libiomp5.so) ADD_LIBRARY(mklml_intel SHARED IMPORTED GLOBAL) -SET_PROPERTY(TARGET mklml_intel PROPERTY IMPORTED_LOCATION ${BINARY_DIR}/fluid_install_dir/third_party/install/mklml/lib/libmklml_intel.so) +SET_PROPERTY(TARGET mklml_intel PROPERTY IMPORTED_LOCATION ${PADDLE_INSTALL_DIR}/third_party/install/mklml/lib/libmklml_intel.so) + +ADD_LIBRARY(mkldnn SHARED IMPORTED GLOBAL) +SET_PROPERTY(TARGET mkldnn PROPERTY IMPORTED_LOCATION ${PADDLE_INSTALL_DIR}/third_party/install/mkldnn/lib/libmkldnn.so.0) LIST(APPEND paddle_depend_libs - snappystream + # snappystream snappy iomp5 mklml_intel - xxhash) + mkldnn + xxhash + ) diff --git a/demo-serving/CMakeLists.txt b/demo-serving/CMakeLists.txt index 7db1ce01..2dcee7be 100644 --- a/demo-serving/CMakeLists.txt +++ b/demo-serving/CMakeLists.txt @@ -75,7 +75,10 @@ install(FILES ${inc} DESTINATION ${PADDLE_SERVING_INSTALL_DIR}/include/serving) if (${WITH_MKL}) - install(FILES ${CMAKE_BINARY_DIR}/Paddle/third_party/install/mklml/lib/libmklml_intel.so - ${CMAKE_BINARY_DIR}/Paddle/third_party/install/mklml/lib/libiomp5.so DESTINATION + install(FILES + ${CMAKE_BINARY_DIR}/third_party/install/Paddle/third_party/install/mklml/lib/libmklml_intel.so + ${CMAKE_BINARY_DIR}/third_party/install/Paddle/third_party/install/mklml/lib/libiomp5.so + ${CMAKE_BINARY_DIR}/third_party/install/Paddle/third_party/install/mkldnn/lib/libmkldnn.so.0 + DESTINATION ${PADDLE_SERVING_INSTALL_DIR}/demo/serving/bin) endif() diff --git a/demo-serving/op/classify_op.h b/demo-serving/op/classify_op.h index 366793cc..c381f032 100644 --- a/demo-serving/op/classify_op.h +++ b/demo-serving/op/classify_op.h @@ -21,7 +21,7 @@ #include "paddle/fluid/inference/api/paddle_inference_api.h" #endif #else -#include "paddle/fluid/inference/paddle_inference_api.h" +#include "paddle_inference_api.h" // NOLINT #endif #include "demo-serving/image_class.pb.h" diff --git a/demo-serving/op/ctr_prediction_op.h b/demo-serving/op/ctr_prediction_op.h index a12cccab..6bec7c64 100644 --- a/demo-serving/op/ctr_prediction_op.h +++ b/demo-serving/op/ctr_prediction_op.h @@ -21,7 +21,7 @@ #include "paddle/fluid/inference/api/paddle_inference_api.h" #endif #else -#include "paddle/fluid/inference/paddle_inference_api.h" +#include "paddle_inference_api.h" // NOLINT #endif #include "demo-serving/ctr_prediction.pb.h" diff --git a/demo-serving/op/reader_op.h b/demo-serving/op/reader_op.h index 484d6f62..546ca196 100644 --- a/demo-serving/op/reader_op.h +++ b/demo-serving/op/reader_op.h @@ -35,7 +35,7 @@ #include "paddle/fluid/inference/api/paddle_inference_api.h" #endif #else -#include "paddle/fluid/inference/paddle_inference_api.h" +#include "paddle_inference_api.h" // NOLINT #endif namespace baidu { diff --git a/demo-serving/op/text_classification_op.h b/demo-serving/op/text_classification_op.h index bef8ec52..21ac6991 100644 --- a/demo-serving/op/text_classification_op.h +++ b/demo-serving/op/text_classification_op.h @@ -21,7 +21,7 @@ #include "paddle/fluid/inference/api/paddle_inference_api.h" #endif #else -#include "paddle/fluid/inference/paddle_inference_api.h" +#include "paddle_inference_api.h" // NOLINT #endif #include "demo-serving/text_classification.pb.h" diff --git a/inferencer-fluid-cpu/include/fluid_cpu_engine.h b/inferencer-fluid-cpu/include/fluid_cpu_engine.h index 41ab6399..b951670e 100644 --- a/inferencer-fluid-cpu/include/fluid_cpu_engine.h +++ b/inferencer-fluid-cpu/include/fluid_cpu_engine.h @@ -28,7 +28,7 @@ #include "paddle/fluid/inference/api/paddle_inference_api.h" #endif #else -#include "paddle/fluid/inference/paddle_inference_api.h" +#include "paddle_inference_api.h" // NOLINT #endif #include "predictor/framework/infer.h" diff --git a/inferencer-fluid-gpu/include/fluid_gpu_engine.h b/inferencer-fluid-gpu/include/fluid_gpu_engine.h index 226e114f..30bae22d 100644 --- a/inferencer-fluid-gpu/include/fluid_gpu_engine.h +++ b/inferencer-fluid-gpu/include/fluid_gpu_engine.h @@ -28,7 +28,7 @@ #include "paddle/fluid/inference/api/paddle_inference_api.h" #endif #else -#include "paddle/fluid/inference/paddle_inference_api.h" +#include "paddle_inference_api.h" // NOLINT #endif #include "predictor/framework/infer.h" -- GitLab