From e16b9f78fdc7a3f2d60b8bc6fff4173fd44a6a5d Mon Sep 17 00:00:00 2001 From: jiweibo Date: Thu, 3 Dec 2020 07:44:40 +0000 Subject: [PATCH] update resneto demo with 2.0 api --- c++/resnet50/CMakeLists.txt | 191 +++++++++++++++++++++++++--------- c++/resnet50/README.md | 2 +- c++/resnet50/resnet50_test.cc | 53 +++++----- c++/resnet50/run_impl.sh | 2 +- 4 files changed, 172 insertions(+), 76 deletions(-) diff --git a/c++/resnet50/CMakeLists.txt b/c++/resnet50/CMakeLists.txt index a1c02c9696190b..b7e8f40e40859f 100644 --- a/c++/resnet50/CMakeLists.txt +++ b/c++/resnet50/CMakeLists.txt @@ -1,9 +1,17 @@ +cmake_minimum_required(VERSION 3.0) project(cpp_inference_demo CXX C) option(WITH_MKL "Compile demo with MKL/OpenBlas support, default use MKL." ON) option(WITH_GPU "Compile demo with GPU/CPU, default use CPU." OFF) option(WITH_STATIC_LIB "Compile demo with static/shared library, default use static." ON) option(USE_TENSORRT "Compile demo with TensorRT." OFF) +if(NOT WITH_STATIC_LIB) + add_definitions("-DPADDLE_WITH_SHARED_LIB") +else() + # PD_INFER_DECL is mainly used to set the dllimport/dllexport attribute in dynamic library mode. + # Set it to empty in static library mode to avoid compilation issues. + add_definitions("/DPD_INFER_DECL=") +endif() macro(safe_set_static_flag) foreach(flag_var @@ -15,10 +23,6 @@ macro(safe_set_static_flag) endforeach(flag_var) endmacro() -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g") -set(CMAKE_STATIC_LIBRARY_PREFIX "") -message("flags" ${CMAKE_CXX_FLAGS}) - if(NOT DEFINED PADDLE_LIB) message(FATAL_ERROR "please set PADDLE_LIB with -DPADDLE_LIB=/path/paddle/lib") endif() @@ -26,70 +30,163 @@ if(NOT DEFINED DEMO_NAME) message(FATAL_ERROR "please set DEMO_NAME with -DDEMO_NAME=demo_name") endif() +include_directories("${PADDLE_LIB}/") +set(PADDLE_LIB_THIRD_PARTY_PATH "${PADDLE_LIB}/third_party/install/") +include_directories("${PADDLE_LIB_THIRD_PARTY_PATH}protobuf/include") +include_directories("${PADDLE_LIB_THIRD_PARTY_PATH}glog/include") +include_directories("${PADDLE_LIB_THIRD_PARTY_PATH}gflags/include") +include_directories("${PADDLE_LIB_THIRD_PARTY_PATH}xxhash/include") -include_directories("${PADDLE_LIB}") -include_directories("${PADDLE_LIB}/third_party/install/protobuf/include") -include_directories("${PADDLE_LIB}/third_party/install/glog/include") -include_directories("${PADDLE_LIB}/third_party/install/gflags/include") -include_directories("${PADDLE_LIB}/third_party/install/xxhash/include") -include_directories("${PADDLE_LIB}/third_party/install/zlib/include") -include_directories("${PADDLE_LIB}/third_party/boost") -include_directories("${PADDLE_LIB}/third_party/eigen3") +link_directories("${PADDLE_LIB_THIRD_PARTY_PATH}protobuf/lib") +link_directories("${PADDLE_LIB_THIRD_PARTY_PATH}glog/lib") +link_directories("${PADDLE_LIB_THIRD_PARTY_PATH}gflags/lib") +link_directories("${PADDLE_LIB_THIRD_PARTY_PATH}xxhash/lib") +link_directories("${PADDLE_LIB}/paddle/lib") -if (USE_TENSORRT AND WITH_GPU) - include_directories("${TENSORRT_ROOT}/include") - link_directories("${TENSORRT_ROOT}/lib") +if (WIN32) + add_definitions("/DGOOGLE_GLOG_DLL_DECL=") + option(MSVC_STATIC_CRT "use static C Runtime library by default" ON) + if (MSVC_STATIC_CRT) + if (WITH_MKL) + set(FLAG_OPENMP "/openmp") + endif() + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /bigobj /MTd ${FLAG_OPENMP}") + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /bigobj /MT ${FLAG_OPENMP}") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /bigobj /MTd ${FLAG_OPENMP}") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /bigobj /MT ${FLAG_OPENMP}") + safe_set_static_flag() + if (WITH_STATIC_LIB) + add_definitions(-DSTATIC_LIB) + endif() + endif() +else() + if(WITH_MKL) + set(FLAG_OPENMP "-fopenmp") + endif() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ${FLAG_OPENMP}") endif() -link_directories("${PADDLE_LIB}/third_party/install/zlib/lib") +if(WITH_GPU) + if(NOT WIN32) + set(CUDA_LIB "/usr/local/cuda/lib64/" CACHE STRING "CUDA Library") + else() + if(CUDA_LIB STREQUAL "") + set(CUDA_LIB "C:\\Program\ Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v8.0\\lib\\x64") + endif() + endif(NOT WIN32) +endif() -link_directories("${PADDLE_LIB}/third_party/install/protobuf/lib") -link_directories("${PADDLE_LIB}/third_party/install/glog/lib") -link_directories("${PADDLE_LIB}/third_party/install/gflags/lib") -link_directories("${PADDLE_LIB}/third_party/install/xxhash/lib") -link_directories("${PADDLE_LIB}/paddle/lib") +if (USE_TENSORRT AND WITH_GPU) + set(TENSORRT_ROOT "" CACHE STRING "The root directory of TensorRT library") + if("${TENSORRT_ROOT}" STREQUAL "") + message(FATAL_ERROR "The TENSORRT_ROOT is empty, you must assign it a value with CMake command. Such as: -DTENSORRT_ROOT=TENSORRT_ROOT_PATH ") + endif() + set(TENSORRT_INCLUDE_DIR ${TENSORRT_ROOT}/include) + set(TENSORRT_LIB_DIR ${TENSORRT_ROOT}/lib) +endif() -add_executable(${DEMO_NAME} ${DEMO_NAME}.cc) +if (NOT WIN32) + if (USE_TENSORRT AND WITH_GPU) + include_directories("${TENSORRT_INCLUDE_DIR}") + link_directories("${TENSORRT_LIB_DIR}") + endif() +endif(NOT WIN32) if(WITH_MKL) - include_directories("${PADDLE_LIB}/third_party/install/mklml/include") - set(MATH_LIB ${PADDLE_LIB}/third_party/install/mklml/lib/libmklml_intel${CMAKE_SHARED_LIBRARY_SUFFIX} - ${PADDLE_LIB}/third_party/install/mklml/lib/libiomp5${CMAKE_SHARED_LIBRARY_SUFFIX}) - set(MKLDNN_PATH "${PADDLE_LIB}/third_party/install/mkldnn") + set(MATH_LIB_PATH "${PADDLE_LIB_THIRD_PARTY_PATH}mklml") + include_directories("${MATH_LIB_PATH}/include") + if(WIN32) + set(MATH_LIB ${MATH_LIB_PATH}/lib/mklml${CMAKE_STATIC_LIBRARY_SUFFIX} + ${MATH_LIB_PATH}/lib/libiomp5md${CMAKE_STATIC_LIBRARY_SUFFIX}) + else() + set(MATH_LIB ${MATH_LIB_PATH}/lib/libmklml_intel${CMAKE_SHARED_LIBRARY_SUFFIX} + ${MATH_LIB_PATH}/lib/libiomp5${CMAKE_SHARED_LIBRARY_SUFFIX}) + endif() + set(MKLDNN_PATH "${PADDLE_LIB_THIRD_PARTY_PATH}mkldnn") if(EXISTS ${MKLDNN_PATH}) include_directories("${MKLDNN_PATH}/include") - set(MKLDNN_LIB ${MKLDNN_PATH}/lib/libmkldnn.so.0) + if(WIN32) + set(MKLDNN_LIB ${MKLDNN_PATH}/lib/mkldnn.lib) + else(WIN32) + set(MKLDNN_LIB ${MKLDNN_PATH}/lib/libmkldnn.so.0) + endif(WIN32) endif() else() - set(MATH_LIB ${PADDLE_LIB}/third_party/install/openblas/lib/libopenblas${CMAKE_STATIC_LIBRARY_SUFFIX}) + set(OPENBLAS_LIB_PATH "${PADDLE_LIB_THIRD_PARTY_PATH}openblas") + include_directories("${OPENBLAS_LIB_PATH}/include/openblas") + if(WIN32) + set(MATH_LIB ${OPENBLAS_LIB_PATH}/lib/openblas${CMAKE_STATIC_LIBRARY_SUFFIX}) + else() + set(MATH_LIB ${OPENBLAS_LIB_PATH}/lib/libopenblas${CMAKE_STATIC_LIBRARY_SUFFIX}) + endif() endif() -# Note: libpaddle_inference_api.so/a must put before libpaddle_fluid.so/a if(WITH_STATIC_LIB) - set(DEPS - ${PADDLE_LIB}/paddle/lib/libpaddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) + set(DEPS ${PADDLE_LIB}/paddle/lib/libpaddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) else() - set(DEPS - ${PADDLE_LIB}/paddle/lib/libpaddle_fluid${CMAKE_SHARED_LIBRARY_SUFFIX}) + if(WIN32) + set(DEPS ${PADDLE_LIB}/paddle/lib/paddle_fluid${CMAKE_STATIC_LIBRARY_SUFFIX}) + else() + set(DEPS ${PADDLE_LIB}/paddle/lib/libpaddle_fluid${CMAKE_SHARED_LIBRARY_SUFFIX}) + endif() endif() -set(EXTERNAL_LIB "-lrt -ldl -lpthread") -set(DEPS ${DEPS} - ${MATH_LIB} ${MKLDNN_LIB} - glog gflags protobuf z xxhash - ${EXTERNAL_LIB}) +if (NOT WIN32) + set(EXTERNAL_LIB "-lrt -ldl -lpthread") + set(DEPS ${DEPS} + ${MATH_LIB} ${MKLDNN_LIB} + glog gflags protobuf xxhash + ${EXTERNAL_LIB}) +else() + set(DEPS ${DEPS} + ${MATH_LIB} ${MKLDNN_LIB} + glog gflags_static libprotobuf xxhash ${EXTERNAL_LIB}) + set(DEPS ${DEPS} shlwapi.lib) +endif(NOT WIN32) if(WITH_GPU) - if (USE_TENSORRT) - set(DEPS ${DEPS} - ${TENSORRT_ROOT}/lib/libnvinfer${CMAKE_SHARED_LIBRARY_SUFFIX}) - set(DEPS ${DEPS} - ${TENSORRT_ROOT}/lib/libnvinfer_plugin${CMAKE_SHARED_LIBRARY_SUFFIX}) + if(NOT WIN32) + if (USE_TENSORRT) + set(DEPS ${DEPS} ${TENSORRT_LIB_DIR}/libnvinfer${CMAKE_STATIC_LIBRARY_SUFFIX}) + set(DEPS ${DEPS} ${TENSORRT_LIB_DIR}/libnvinfer_plugin${CMAKE_STATIC_LIBRARY_SUFFIX}) + endif() + set(DEPS ${DEPS} ${CUDA_LIB}/libcudart${CMAKE_SHARED_LIBRARY_SUFFIX}) + else() + if(USE_TENSORRT) + set(DEPS ${DEPS} ${TENSORRT_LIB_DIR}/nvinfer${CMAKE_STATIC_LIBRARY_SUFFIX}) + set(DEPS ${DEPS} ${TENSORRT_LIB_DIR}/nvinfer_plugin${CMAKE_STATIC_LIBRARY_SUFFIX}) + endif() + set(DEPS ${DEPS} ${CUDA_LIB}/cudart${CMAKE_STATIC_LIBRARY_SUFFIX} ) + set(DEPS ${DEPS} ${CUDA_LIB}/cublas${CMAKE_STATIC_LIBRARY_SUFFIX} ) + set(DEPS ${DEPS} ${CUDA_LIB}/cudnn${CMAKE_STATIC_LIBRARY_SUFFIX} ) endif() - set(DEPS ${DEPS} ${CUDA_LIB}/libcudart${CMAKE_SHARED_LIBRARY_SUFFIX}) - set(DEPS ${DEPS} ${CUDA_LIB}/libcudart${CMAKE_SHARED_LIBRARY_SUFFIX} ) - set(DEPS ${DEPS} ${CUDA_LIB}/libcublas${CMAKE_SHARED_LIBRARY_SUFFIX} ) - set(DEPS ${DEPS} ${CUDNN_LIB}/libcudnn${CMAKE_SHARED_LIBRARY_SUFFIX} ) endif() +add_executable(${DEMO_NAME} ${DEMO_NAME}.cc) target_link_libraries(${DEMO_NAME} ${DEPS}) +if(WIN32) + if(USE_TENSORRT) + add_custom_command(TARGET ${DEMO_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${TENSORRT_LIB_DIR}/nvinfer${CMAKE_SHARED_LIBRARY_SUFFIX} + ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE} + COMMAND ${CMAKE_COMMAND} -E copy ${TENSORRT_LIB_DIR}/nvinfer_plugin${CMAKE_SHARED_LIBRARY_SUFFIX} + ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE} + ) + endif() + if(WITH_MKL) + add_custom_command(TARGET ${DEMO_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${MATH_LIB_PATH}/lib/mklml.dll ${CMAKE_BINARY_DIR}/Release + COMMAND ${CMAKE_COMMAND} -E copy ${MATH_LIB_PATH}/lib/libiomp5md.dll ${CMAKE_BINARY_DIR}/Release + COMMAND ${CMAKE_COMMAND} -E copy ${MKLDNN_PATH}/lib/mkldnn.dll ${CMAKE_BINARY_DIR}/Release + ) + else() + add_custom_command(TARGET ${DEMO_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${OPENBLAS_LIB_PATH}/lib/openblas.dll ${CMAKE_BINARY_DIR}/Release + ) + endif() + if(NOT WITH_STATIC_LIB) + add_custom_command(TARGET ${DEMO_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy "${PADDLE_LIB}/paddle/lib/paddle_fluid.dll" ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE} + ) + endif() +endif() diff --git a/c++/resnet50/README.md b/c++/resnet50/README.md index 1105eea66d3835..7fd3e96be01587 100644 --- a/c++/resnet50/README.md +++ b/c++/resnet50/README.md @@ -23,7 +23,7 @@ WITH_GPU=ON USE_TENSORRT=OFF # 配置预测库的根目录 -LIB_DIR=${YOUR_LIB_DIR}/fluid_inference_install_dir +LIB_DIR=${YOUR_LIB_DIR}/paddle_inference_install_dir # 如果上述的WITH_GPU 或 USE_TENSORRT设为ON,请设置对应的CUDA, CUDNN, TENSORRT的路径。 CUDNN_LIB=/paddle/nvidia-downloads/cudnn_v7.5_cuda10.1/lib64 diff --git a/c++/resnet50/resnet50_test.cc b/c++/resnet50/resnet50_test.cc index b0418ba12aeaf1..151a73f3173262 100644 --- a/c++/resnet50/resnet50_test.cc +++ b/c++/resnet50/resnet50_test.cc @@ -1,14 +1,16 @@ -#include +#include #include #include -#include +#include #include #include #include "paddle/include/paddle_inference_api.h" -using paddle::AnalysisConfig; +using paddle_infer::Config; +using paddle_infer::Predictor; +using paddle_infer::CreatePredictor; DEFINE_string(model_file, "", "Directory of the inference model."); DEFINE_string(params_file, "", "Directory of the inference model."); @@ -24,55 +26,52 @@ double time_diff(Time t1, Time t2) { return counter.count() / 1000.0; } -std::unique_ptr CreatePredictor() { - AnalysisConfig config; +std::shared_ptr InitPredictor() { + Config config; if (FLAGS_model_dir != "") { config.SetModel(FLAGS_model_dir); } - config.SetModel(FLAGS_model_file, - FLAGS_params_file); + config.SetModel(FLAGS_model_file, FLAGS_params_file); config.EnableUseGpu(100, 0); - // We use ZeroCopy, so we set config->SwitchUseFeedFetchOps(false) - config.SwitchUseFeedFetchOps(false); config.EnableMKLDNN(); // Open the memory optim. config.EnableMemoryOptim(); - return CreatePaddlePredictor(config); + return CreatePredictor(config); } -void run(paddle::PaddlePredictor *predictor, - const std::vector& input, - const std::vector& input_shape, - std::vector *out_data) { - int input_num = std::accumulate(input_shape.begin(), input_shape.end(), 1, std::multiplies()); +void run(Predictor *predictor, const std::vector &input, + const std::vector &input_shape, std::vector *out_data) { + int input_num = std::accumulate(input_shape.begin(), input_shape.end(), 1, + std::multiplies()); auto input_names = predictor->GetInputNames(); - auto input_t = predictor->GetInputTensor(input_names[0]); + auto input_t = predictor->GetInputHandle(input_names[0]); input_t->Reshape(input_shape); - input_t->copy_from_cpu(input.data()); + input_t->CopyFromCpu(input.data()); - CHECK(predictor->ZeroCopyRun()); + CHECK(predictor->Run()); auto output_names = predictor->GetOutputNames(); // there is only one output of Resnet50 - auto output_t = predictor->GetOutputTensor(output_names[0]); + auto output_t = predictor->GetOutputHandle(output_names[0]); std::vector output_shape = output_t->shape(); - int out_num = std::accumulate(output_shape.begin(), output_shape.end(), 1, std::multiplies()); + int out_num = std::accumulate(output_shape.begin(), output_shape.end(), 1, + std::multiplies()); out_data->resize(out_num); - output_t->copy_to_cpu(out_data->data()); + output_t->CopyToCpu(out_data->data()); } -int main(int argc, char* argv[]) { +int main(int argc, char *argv[]) { google::ParseCommandLineFlags(&argc, &argv, true); - auto predictor = CreatePredictor(); - std::vector input_shape = {FLAGS_batch_size, 3, 224, 224}; - // init 0 for the input. - std::vector input_data(FLAGS_batch_size * 3 * 224 * 224, 0); + auto predictor = InitPredictor(); + std::vector input_shape = {FLAGS_batch_size, 3, 224, 224}; + // init 0 for the input. + std::vector input_data(FLAGS_batch_size * 3 * 224 * 224, 0); std::vector out_data; run(predictor.get(), input_data, input_shape, &out_data); - + for (auto e : out_data) { LOG(INFO) << e << std::endl; } diff --git a/c++/resnet50/run_impl.sh b/c++/resnet50/run_impl.sh index 4dd6b21191eab3..e459c65d4f13bc 100755 --- a/c++/resnet50/run_impl.sh +++ b/c++/resnet50/run_impl.sh @@ -9,7 +9,7 @@ WITH_MKL=ON WITH_GPU=ON USE_TENSORRT=OFF -LIB_DIR=/paddle/trt_refine_int8/build/fluid_inference_install_dir +LIB_DIR=/paddle/trt_refine_int8/build/paddle_inference_install_dir CUDNN_LIB=/paddle/nvidia-downloads/cudnn_v7.5_cuda10.1/lib64 CUDA_LIB=/paddle/nvidia-downloads/cuda-10.1/lib64 # TENSORRT_ROOT=/paddle/nvidia-downloads/TensorRT-6.0.1.5