From 9445ec0f6ada0d2005ca3085825dafd3a1908f0c Mon Sep 17 00:00:00 2001 From: silingtong123 <35439432+silingtong123@users.noreply.github.com> Date: Fri, 15 May 2020 11:04:25 +0800 Subject: [PATCH] [Demo&Doc][Windows]Add the document of windows compiled (#3626) * test=develop, add the document of windows compiled * test=develop, modify the x86 demo on windows * test=develop, modify the name of windows batch file * test=develop, fix the doc --- docs/demo_guides/x86.md | 97 ++++++++++++++++++- lite/CMakeLists.txt | 8 +- .../x86_mobilenetv1_full_demo/CMakeLists.txt | 38 +++++++- .../cxx/x86_mobilenetv1_full_demo/build.bat | 61 ++++++++++++ .../x86_mobilenetv1_light_demo/CMakeLists.txt | 38 +++++++- .../cxx/x86_mobilenetv1_light_demo/build.bat | 61 ++++++++++++ lite/tools/{build.bat => build_windows.bat} | 11 ++- 7 files changed, 291 insertions(+), 23 deletions(-) create mode 100644 lite/demo/cxx/x86_mobilenetv1_full_demo/build.bat create mode 100644 lite/demo/cxx/x86_mobilenetv1_light_demo/build.bat rename lite/tools/{build.bat => build_windows.bat} (99%) diff --git a/docs/demo_guides/x86.md b/docs/demo_guides/x86.md index 9c2a632edd..1c37914b27 100644 --- a/docs/demo_guides/x86.md +++ b/docs/demo_guides/x86.md @@ -1,8 +1,10 @@ # PaddleLite使用X86预测部署 +## 一、Docker或者Linux环境 + Paddle-Lite 支持在Docker或Linux环境编译x86预测库。环境搭建参考[环境准备](../user_guides/source_compile)。 -## 编译 +### 编译 1、 下载代码 ```bash @@ -22,7 +24,7 @@ cd Paddle-Lite # --with_log=OFF 关闭LOG信息输出 ``` -## 编译结果说明 +### 编译结果说明 x86编译结果位于 `build.lite.x86/inference_lite_lib` **具体内容**说明: @@ -52,7 +54,7 @@ x86编译结果位于 `build.lite.x86/inference_lite_lib` -## x86预测API使用示例 +### x86预测API使用示例 1、`mobilenetv1_full`目录结构 @@ -60,7 +62,8 @@ x86编译结果位于 `build.lite.x86/inference_lite_lib` mobilenetv1_full/ |-- CMakeLists.txt |-- build.sh -`-- mobilenet_full_api.cc +|-- build.bat +-- mobilenet_full_api.cc ``` 本demo使用cmake构建`CMakeLists.txt`为cmake脚本,`mobilenet_full_api.cc`是x86示例的源代码、`build.sh`为编译的脚本。 @@ -156,3 +159,89 @@ int main(int argc, char** argv) { } ``` + +## 二、Windows环境 + +### 环境准备 + +#### 编译环境需求 + +- Windows 10 专业版 + - 目前Windows暂不支持GPU编译 +- *Python 版本 2.7/3.5.1+/3.6/3.7 (64 bit)* +- *pip 或 pip3 版本 9.0.1+ (64 bit)* +- *Visual Studio 2015 Update3* + +#### 安装步骤 + +1. cmake 需要3.15版本, 可在官网[下载](https://cmake.org/download/),并添加到环境变量中。 + +2. python 需要2.7 及以上版本, 可在官网[下载](https://www.python.org/download/releases/2.7/)。 + +3. git可以在官网[下载](https://gitforwindows.org/),并添加到环境变量中 + +### 编译 + +1、 下载代码 + +```bash +git clone https://github.com/PaddlePaddle/Paddle-Lite.git +# 切换到release分支 +git checkout release/v2.6.0 +``` +2、 源码编译(需要按照提示输入对应的参数) + +```bash +cd Paddle-Lite +lite/tools/build_windows.bat +``` + +### 编译结果说明 + +x86编译结果位于 `build.lite.x86/inference_lite_lib` +**具体内容**说明: + +1、 `cxx`文件夹:包含c++的库文件与相应的头文件 + +- `include` : 头文件 +- `lib` : 库文件 + - 静态库文件: + - `libpaddle_api_full_bundled.lib` :full_api 静态库 + - `libpaddle_api_light_bundled.lib` :light_api 静态库 + +2、 `third_party` 文件夹:依赖的第三方预测库mklml + +- mklml : Paddle-Lite预测库依赖的mklml数学库 + +3、 `demo/cxx`文件夹:x86预测库的C++ 示例demo + +- `mobilenetv1_full` :使用full_api 执行mobilenet_v1预测的C++ demo +- `mobilenetv1_light` :使用light_api 执行mobilenet_v1预测的C++ demo + +### x86预测API使用示例 + +1、`mobilenetv1_full`目录结构 + +```bash +mobilenetv1_full/ +|-- CMakeLists.txt +|-- build.sh +|-- build.bat +`-- mobilenet_full_api.cc +``` + +本demo使用cmake构建`CMakeLists.txt`为cmake脚本,`mobilenet_full_api.cc`是x86示例的源代码、`build.sh`为Linux x86编译的脚本,build.bat为windows x86编译脚本。 + +2、demo使用方法 + +``` bash +# 1、编译 +cd mobilenetv1_full +build.bat +``` +编译结果为当前目录下的 `Release\mobilenet_full_api.exe ` +``` bash +# 2、执行预测 +Release\\mobilenet_full_api.exe mobilenet_v1 +``` +下载并解压模型[`mobilenet_v1`](http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz)到当前目录,执行以上命令进行预测。 diff --git a/lite/CMakeLists.txt b/lite/CMakeLists.txt index 3a9e77e35d..c9cad2d4f9 100644 --- a/lite/CMakeLists.txt +++ b/lite/CMakeLists.txt @@ -206,7 +206,6 @@ if (LITE_WITH_X86) if(WIN32) add_custom_target(publish_inference_x86_cxx_lib ${TARGET} COMMAND ${CMAKE_COMMAND} -E make_directory "${INFER_LITE_PUBLISH_ROOT}/cxx/lib" - COMMAND ${CMAKE_COMMAND} -E make_directory "${INFER_LITE_PUBLISH_ROOT}/bin" COMMAND ${CMAKE_COMMAND} -E make_directory "${INFER_LITE_PUBLISH_ROOT}/cxx/include" COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/lite/api/paddle_api.h" "${INFER_LITE_PUBLISH_ROOT}/cxx/include" COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/lite/api/paddle_place.h" "${INFER_LITE_PUBLISH_ROOT}/cxx/include" @@ -223,10 +222,11 @@ if (LITE_WITH_X86) add_dependencies(publish_inference publish_inference_x86_cxx_lib) add_custom_target(publish_inference_x86_cxx_demos ${TARGET} - COMMAND ${CMAKE_COMMAND} -E make_directory "${INFER_LITE_PUBLISH_ROOT}/third_party" - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_BINARY_DIR}/third_party/install" "${INFER_LITE_PUBLISH_ROOT}/third_party" - COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_BINARY_DIR}/third_party/eigen3" "${INFER_LITE_PUBLISH_ROOT}/third_party" + COMMAND ${CMAKE_COMMAND} -E make_directory "${INFER_LITE_PUBLISH_ROOT}/third_party/mklml" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_BINARY_DIR}/third_party/install/mklml" "${INFER_LITE_PUBLISH_ROOT}/third_party/mklml" COMMAND ${CMAKE_COMMAND} -E make_directory "${INFER_LITE_PUBLISH_ROOT}/demo/cxx" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/lite/demo/cxx/x86_mobilenetv1_light_demo" "${INFER_LITE_PUBLISH_ROOT}/demo/cxx/mobilenetv1_light" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/lite/demo/cxx/x86_mobilenetv1_full_demo" "${INFER_LITE_PUBLISH_ROOT}/demo/cxx/mobilenetv1_full" ) add_dependencies(publish_inference_x86_cxx_lib publish_inference_x86_cxx_demos) add_dependencies(publish_inference_x86_cxx_demos paddle_api_full_bundled eigen3) diff --git a/lite/demo/cxx/x86_mobilenetv1_full_demo/CMakeLists.txt b/lite/demo/cxx/x86_mobilenetv1_full_demo/CMakeLists.txt index a4b8497ebb..8aef18c1f9 100644 --- a/lite/demo/cxx/x86_mobilenetv1_full_demo/CMakeLists.txt +++ b/lite/demo/cxx/x86_mobilenetv1_full_demo/CMakeLists.txt @@ -6,16 +6,44 @@ set(TARGET mobilenet_full_api) set(LITE_DIR "${PROJECT_SOURCE_DIR}/../../../cxx") set(MKLML_DIR "${PROJECT_SOURCE_DIR}/../../../third_party/mklml/") +if (WIN32) + add_definitions("/DGOOGLE_GLOG_DLL_DECL=") + option(MSVC_STATIC_CRT "use static C Runtime library by default" ON) + if (MSVC_STATIC_CRT) + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /bigobj /MTd") + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /bigobj /MT") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /bigobj /MTd") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /bigobj /MT") + endif() +endif() + # 2. link mklml and Paddle-Lite directory link_directories(${LITE_DIR}/lib ${MKLML_DIR}/lib) include_directories(${LITE_DIR}/include/ ${MKLML_DIR}/include) # 3. compile options -add_definitions(-std=c++11 -g -O3 -pthread) -set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}) +if (NOT WIN32) + add_definitions(-std=c++11 -g -O3 -pthread) + set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}) +endif() # 4.add executable output add_executable(${TARGET} ${TARGET}.cc) -target_link_libraries(${TARGET} -lpaddle_full_api_shared) -target_link_libraries(${TARGET} -liomp5) -target_link_libraries(${TARGET} -ldl) +if (WIN32) + set(MATH_LIB ${MKLML_DIR}/lib/mklml${CMAKE_STATIC_LIBRARY_SUFFIX} + ${MKLML_DIR}/lib/libiomp5md${CMAKE_STATIC_LIBRARY_SUFFIX}) + + + target_link_libraries(${TARGET} libpaddle_api_full_bundled.lib) + target_link_libraries(${TARGET} shlwapi.lib) + target_link_libraries(${TARGET} ${MATH_LIB}) + + add_custom_command(TARGET ${TARGET} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${MKLML_DIR}/lib/mklml.dll ${CMAKE_BINARY_DIR}/Release + COMMAND ${CMAKE_COMMAND} -E copy ${MKLML_DIR}/lib/libiomp5md.dll ${CMAKE_BINARY_DIR}/Release + ) +else() + target_link_libraries(${TARGET} -lpaddle_full_api_shared) + target_link_libraries(${TARGET} -liomp5) + target_link_libraries(${TARGET} -ldl) +endif() diff --git a/lite/demo/cxx/x86_mobilenetv1_full_demo/build.bat b/lite/demo/cxx/x86_mobilenetv1_full_demo/build.bat new file mode 100644 index 0000000000..968ed3c077 --- /dev/null +++ b/lite/demo/cxx/x86_mobilenetv1_full_demo/build.bat @@ -0,0 +1,61 @@ +@echo off +setlocal +setlocal enabledelayedexpansion + +set source_path=%~dp0 + +set build_directory=%source_path%\build + +if EXIST "%build_directory%" ( + call:rm_rebuild_dir "%build_directory%" +) + +md "%build_directory%" +set vcvarsall_dir=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat + +IF NOT EXIST "%vcvarsall_dir%" ( + goto set_vcvarsall_dir +) else ( + goto cmake +) + +:set_vcvarsall_dir +SET /P vcvarsall_dir="Please input the path of visual studio command Prompt, such as C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat =======>" +set tmp_var=!vcvarsall_dir! +call:remove_space +set vcvarsall_dir=!tmp_var! +IF NOT EXIST "!vcvarsall_dir!" ( + echo "------------!vcvarsall_dir! not exist------------" + goto set_vcvarsall_dir +) + +:cmake +D: +cd "%build_directory%" + +cmake .. -G "Visual Studio 14 2015 Win64" -T host=x64 + +call "%vcvarsall_dir%" amd64 + +msbuild /maxcpucount:8 /p:Configuration=Release mobilenet_full_api.vcxproj + +goto:eof + +:rm_rebuild_dir + del /f /s /q "%~1\*.*" >nul 2>&1 + rd /s /q "%~1" >nul 2>&1 +goto:eof + +:remove_space +:remove_left_space +if "%tmp_var:~0,1%"==" " ( + set "tmp_var=%tmp_var:~1%" + goto remove_left_space +) + +:remove_right_space +if "%tmp_var:~-1%"==" " ( + set "tmp_var=%tmp_var:~0,-1%" + goto remove_left_space +) +goto:eof diff --git a/lite/demo/cxx/x86_mobilenetv1_light_demo/CMakeLists.txt b/lite/demo/cxx/x86_mobilenetv1_light_demo/CMakeLists.txt index e85b8fe67e..a4e5e75208 100644 --- a/lite/demo/cxx/x86_mobilenetv1_light_demo/CMakeLists.txt +++ b/lite/demo/cxx/x86_mobilenetv1_light_demo/CMakeLists.txt @@ -6,16 +6,44 @@ set(TARGET mobilenet_light_api) set(LITE_DIR "${PROJECT_SOURCE_DIR}/../../../cxx") set(MKLML_DIR "${PROJECT_SOURCE_DIR}/../../../third_party/mklml/") +if (WIN32) + add_definitions("/DGOOGLE_GLOG_DLL_DECL=") + option(MSVC_STATIC_CRT "use static C Runtime library by default" ON) + if (MSVC_STATIC_CRT) + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /bigobj /MTd") + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /bigobj /MT") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /bigobj /MTd") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /bigobj /MT") + endif() +endif() + # 2. link mklml and Paddle-Lite directory link_directories(${LITE_DIR}/lib ${MKLML_DIR}/lib) include_directories(${LITE_DIR}/include/ ${MKLML_DIR}/include) # 3. compile options -add_definitions(-std=c++11 -g -O3 -pthread) -set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}) +if (NOT WIN32) + add_definitions(-std=c++11 -g -O3 -pthread) + set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}) +endif() # 4.add executable output add_executable(${TARGET} ${TARGET}.cc) -target_link_libraries(${TARGET} -lpaddle_light_api_shared) -target_link_libraries(${TARGET} -liomp5) -target_link_libraries(${TARGET} -ldl) +if (WIN32) + set(MATH_LIB ${MKLML_DIR}/lib/mklml${CMAKE_STATIC_LIBRARY_SUFFIX} + ${MKLML_DIR}/lib/libiomp5md${CMAKE_STATIC_LIBRARY_SUFFIX}) + + + target_link_libraries(${TARGET} libpaddle_api_light_bundled.lib) + target_link_libraries(${TARGET} shlwapi.lib) + target_link_libraries(${TARGET} ${MATH_LIB}) + + add_custom_command(TARGET ${TARGET} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${MKLML_DIR}/lib/mklml.dll ${CMAKE_BINARY_DIR}/Release + COMMAND ${CMAKE_COMMAND} -E copy ${MKLML_DIR}/lib/libiomp5md.dll ${CMAKE_BINARY_DIR}/Release + ) +else() + target_link_libraries(${TARGET} -lpaddle_light_api_shared) + target_link_libraries(${TARGET} -liomp5) + target_link_libraries(${TARGET} -ldl) +endif() diff --git a/lite/demo/cxx/x86_mobilenetv1_light_demo/build.bat b/lite/demo/cxx/x86_mobilenetv1_light_demo/build.bat new file mode 100644 index 0000000000..bc5ba16f16 --- /dev/null +++ b/lite/demo/cxx/x86_mobilenetv1_light_demo/build.bat @@ -0,0 +1,61 @@ +@echo off +setlocal +setlocal enabledelayedexpansion + +set source_path=%~dp0 + +set build_directory=%source_path%\build + +if EXIST "%build_directory%" ( + call:rm_rebuild_dir "%build_directory%" +) + +md "%build_directory%" +set vcvarsall_dir=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat + +IF NOT EXIST "%vcvarsall_dir%" ( + goto set_vcvarsall_dir +) else ( + goto cmake +) + +:set_vcvarsall_dir +SET /P vcvarsall_dir="Please input the path of visual studio command Prompt, such as C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat =======>" +set tmp_var=!vcvarsall_dir! +call:remove_space +set vcvarsall_dir=!tmp_var! +IF NOT EXIST "!vcvarsall_dir!" ( + echo "------------!vcvarsall_dir! not exist------------" + goto set_vcvarsall_dir +) + +:cmake +D: +cd "%build_directory%" + +cmake .. -G "Visual Studio 14 2015 Win64" -T host=x64 + +call "%vcvarsall_dir%" amd64 + +msbuild /maxcpucount:8 /p:Configuration=Release mobilenet_light_api.vcxproj + +goto:eof + +:rm_rebuild_dir + del /f /s /q "%~1\*.*" >nul 2>&1 + rd /s /q "%~1" >nul 2>&1 +goto:eof + +:remove_space +:remove_left_space +if "%tmp_var:~0,1%"==" " ( + set "tmp_var=%tmp_var:~1%" + goto remove_left_space +) + +:remove_right_space +if "%tmp_var:~-1%"==" " ( + set "tmp_var=%tmp_var:~0,-1%" + goto remove_left_space +) +goto:eof diff --git a/lite/tools/build.bat b/lite/tools/build_windows.bat similarity index 99% rename from lite/tools/build.bat rename to lite/tools/build_windows.bat index 1022c96c4f..7343d151f6 100644 --- a/lite/tools/build.bat +++ b/lite/tools/build_windows.bat @@ -29,16 +29,17 @@ IF NOT EXIST "%vcvarsall_dir%" ( call:prepare_thirdparty -if EXIST "%build_directory%" ( - call:rm_rebuild_dir "%build_directory%" - md "%build_directory%" -) - set root_dir=%workspace% set build_directory=%BUILD_DIR%\build.lite.x86 set GEN_CODE_PATH_PREFIX=%build_directory%\lite\gen_code set DEBUG_TOOL_PATH_PREFIX=%build_directory%\lite\tools\debug +if EXIST "%build_directory%" ( + call:rm_rebuild_dir "%build_directory%" +) + +md "%build_directory%" + rem for code gen, a source file is generated after a test, but is dependended by some targets in cmake. rem here we fake an empty file to make cmake works. if NOT EXIST "%GEN_CODE_PATH_PREFIX%" ( -- GitLab