未验证 提交 9445ec0f 编写于 作者: S silingtong123 提交者: GitHub

[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
上级 1caba6ff
# PaddleLite使用X86预测部署 # PaddleLite使用X86预测部署
## 一、Docker或者Linux环境
Paddle-Lite 支持在Docker或Linux环境编译x86预测库。环境搭建参考[环境准备](../user_guides/source_compile) Paddle-Lite 支持在Docker或Linux环境编译x86预测库。环境搭建参考[环境准备](../user_guides/source_compile)
## 编译 ### 编译
1、 下载代码 1、 下载代码
```bash ```bash
...@@ -22,7 +24,7 @@ cd Paddle-Lite ...@@ -22,7 +24,7 @@ cd Paddle-Lite
# --with_log=OFF 关闭LOG信息输出 # --with_log=OFF 关闭LOG信息输出
``` ```
## 编译结果说明 ### 编译结果说明
x86编译结果位于 `build.lite.x86/inference_lite_lib` x86编译结果位于 `build.lite.x86/inference_lite_lib`
**具体内容**说明: **具体内容**说明:
...@@ -52,7 +54,7 @@ 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`目录结构 1、`mobilenetv1_full`目录结构
...@@ -60,7 +62,8 @@ x86编译结果位于 `build.lite.x86/inference_lite_lib` ...@@ -60,7 +62,8 @@ x86编译结果位于 `build.lite.x86/inference_lite_lib`
mobilenetv1_full/ mobilenetv1_full/
|-- CMakeLists.txt |-- CMakeLists.txt
|-- build.sh |-- build.sh
`-- mobilenet_full_api.cc |-- build.bat
-- mobilenet_full_api.cc
``` ```
本demo使用cmake构建`CMakeLists.txt`为cmake脚本,`mobilenet_full_api.cc`是x86示例的源代码、`build.sh`为编译的脚本。 本demo使用cmake构建`CMakeLists.txt`为cmake脚本,`mobilenet_full_api.cc`是x86示例的源代码、`build.sh`为编译的脚本。
...@@ -156,3 +159,89 @@ int main(int argc, char** argv) { ...@@ -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)到当前目录,执行以上命令进行预测。
...@@ -206,7 +206,6 @@ if (LITE_WITH_X86) ...@@ -206,7 +206,6 @@ if (LITE_WITH_X86)
if(WIN32) if(WIN32)
add_custom_target(publish_inference_x86_cxx_lib ${TARGET} 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}/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 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_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" 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) ...@@ -223,10 +222,11 @@ if (LITE_WITH_X86)
add_dependencies(publish_inference publish_inference_x86_cxx_lib) add_dependencies(publish_inference publish_inference_x86_cxx_lib)
add_custom_target(publish_inference_x86_cxx_demos ${TARGET} 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 make_directory "${INFER_LITE_PUBLISH_ROOT}/third_party/mklml"
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/install/mklml" "${INFER_LITE_PUBLISH_ROOT}/third_party/mklml"
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}/demo/cxx" 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_lib publish_inference_x86_cxx_demos)
add_dependencies(publish_inference_x86_cxx_demos paddle_api_full_bundled eigen3) add_dependencies(publish_inference_x86_cxx_demos paddle_api_full_bundled eigen3)
......
...@@ -6,16 +6,44 @@ set(TARGET mobilenet_full_api) ...@@ -6,16 +6,44 @@ set(TARGET mobilenet_full_api)
set(LITE_DIR "${PROJECT_SOURCE_DIR}/../../../cxx") set(LITE_DIR "${PROJECT_SOURCE_DIR}/../../../cxx")
set(MKLML_DIR "${PROJECT_SOURCE_DIR}/../../../third_party/mklml/") 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 # 2. link mklml and Paddle-Lite directory
link_directories(${LITE_DIR}/lib ${MKLML_DIR}/lib) link_directories(${LITE_DIR}/lib ${MKLML_DIR}/lib)
include_directories(${LITE_DIR}/include/ ${MKLML_DIR}/include) include_directories(${LITE_DIR}/include/ ${MKLML_DIR}/include)
# 3. compile options # 3. compile options
add_definitions(-std=c++11 -g -O3 -pthread) if (NOT WIN32)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}) add_definitions(-std=c++11 -g -O3 -pthread)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
endif()
# 4.add executable output # 4.add executable output
add_executable(${TARGET} ${TARGET}.cc) add_executable(${TARGET} ${TARGET}.cc)
target_link_libraries(${TARGET} -lpaddle_full_api_shared) if (WIN32)
target_link_libraries(${TARGET} -liomp5) set(MATH_LIB ${MKLML_DIR}/lib/mklml${CMAKE_STATIC_LIBRARY_SUFFIX}
target_link_libraries(${TARGET} -ldl) ${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()
@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
...@@ -6,16 +6,44 @@ set(TARGET mobilenet_light_api) ...@@ -6,16 +6,44 @@ set(TARGET mobilenet_light_api)
set(LITE_DIR "${PROJECT_SOURCE_DIR}/../../../cxx") set(LITE_DIR "${PROJECT_SOURCE_DIR}/../../../cxx")
set(MKLML_DIR "${PROJECT_SOURCE_DIR}/../../../third_party/mklml/") 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 # 2. link mklml and Paddle-Lite directory
link_directories(${LITE_DIR}/lib ${MKLML_DIR}/lib) link_directories(${LITE_DIR}/lib ${MKLML_DIR}/lib)
include_directories(${LITE_DIR}/include/ ${MKLML_DIR}/include) include_directories(${LITE_DIR}/include/ ${MKLML_DIR}/include)
# 3. compile options # 3. compile options
add_definitions(-std=c++11 -g -O3 -pthread) if (NOT WIN32)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}) add_definitions(-std=c++11 -g -O3 -pthread)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
endif()
# 4.add executable output # 4.add executable output
add_executable(${TARGET} ${TARGET}.cc) add_executable(${TARGET} ${TARGET}.cc)
target_link_libraries(${TARGET} -lpaddle_light_api_shared) if (WIN32)
target_link_libraries(${TARGET} -liomp5) set(MATH_LIB ${MKLML_DIR}/lib/mklml${CMAKE_STATIC_LIBRARY_SUFFIX}
target_link_libraries(${TARGET} -ldl) ${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()
@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
...@@ -29,16 +29,17 @@ IF NOT EXIST "%vcvarsall_dir%" ( ...@@ -29,16 +29,17 @@ IF NOT EXIST "%vcvarsall_dir%" (
call:prepare_thirdparty call:prepare_thirdparty
if EXIST "%build_directory%" (
call:rm_rebuild_dir "%build_directory%"
md "%build_directory%"
)
set root_dir=%workspace% set root_dir=%workspace%
set build_directory=%BUILD_DIR%\build.lite.x86 set build_directory=%BUILD_DIR%\build.lite.x86
set GEN_CODE_PATH_PREFIX=%build_directory%\lite\gen_code set GEN_CODE_PATH_PREFIX=%build_directory%\lite\gen_code
set DEBUG_TOOL_PATH_PREFIX=%build_directory%\lite\tools\debug 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 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. rem here we fake an empty file to make cmake works.
if NOT EXIST "%GEN_CODE_PATH_PREFIX%" ( if NOT EXIST "%GEN_CODE_PATH_PREFIX%" (
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册