Table of Content
Overview
环境:Windows 10,64 位,仅支持 CPU,仅 C++
实测版本:Visual Studio 2017 Professional + Python 3.7.2 (Anaconda 1.9.6) + CMake 3.13.4 + Git 2.20.1
Caffe2 现仅支持 x64 版本,若需支持 GPU,有额外的配置步骤,具体请参考相关文档
Caffe2 仍在不断更迭,Python 以外环境的文档还相当欠缺,本文主要基于当前版本文档教程、技术博客及个人探索尝试,不保证能够应用于所有环境的所有版本配置,请知悉
所需依赖
Visual Studio
- Visual Studio 2017 | 官方下载
安装 Visual Studio 2017,三种版本皆可,建议语言英文,安装时左侧必须勾选 Desktop Development with C++,右侧必须勾选 C++/CLI support
通常原有的 Visual Studio 2012 可以保留,如需多版本并行,建议先安装低版本,再安装高版本
另外,自 Visual Studio 2015 以后,C++ 标准库被抽离出来成为独立的 C Run-Time Libraries (CRT),默认路径 C:\Program Files (x86)\Windows Kits\10\Lib
因此,在低版本 Visual Studio 2012 中,可能会丢失必需的 C++ 标准库,工程属性中需要额外添加 include 与 lib(x86/x64) 两个路径,默认 C:\Program Files (x86)\Microsoft Visual Studio\2012\VC\include 与 C:\Program Files (x86)\Microsoft Visual Studio\2012\VC\lib (\amd64)
[注] 最新版本 Visual Studio 2017 更新已修复此问题
Python
官方推荐安装 Python 2.7.6 到 2.7.14,Python 3 现只提供实验性支持,可通过 Anaconda 进行安装
- Anaconda Python/R Distribution - Anaconda
如果安装 Python 2.7 版本,还需要额外安装 VC++ Compiler
安装必需的 Python 依赖:
pip install future hypothesis numpy protobuf six
可选的非必需 Python 依赖:
pip install flask glog graphviz jupyter matplotlib pydot python-nvd3 pyyaml requests scikit-image scipy setuptools tornado
CMake
- 安装 CMake
Git
- 安装 Git
环境变量
添加系统变量中的 Path:
…\Python27 或 …\Anaconda3
…\Python27\scripts 或 …\Anaconda3\scripts
…\CMake\bin
…\Git\cmd
编译安装
下载源码
推荐使用 Git 的方式 clone,因为采用下载 .zip 的方式会丢失第三方依赖模块,导致编译失败
git clone --recursive https://github.com/pytorch/pytorch.git
编译源码
打开 Developer Command Prompt for VS 2017
运行 ${PYTORCH_ROOT}\scripts\build_host_protoc.bat
如果需要编译 Python 环境,编辑 ${PYTORCH_ROOT}\scripts\build_windows.bat,将 CMake 参数中的 -DBUILD_PYTHON=OFF 改为 -DBUILD_PYTHON=ON
运行 ${PYTORCH_ROOT}\scripts\build_windows.bat
编译需要一段较长的时间,成功后会提示 Caffe2 built successfully,且在 ${PYTORCH_ROOT}\scripts\ 下生成 Caffe2.sln 工程
生成安装
必须以管理员身份运行 Visual Studio 2017,打开 Caffe2.sln 工程
在 Release x64 模式下生成解决方案
成功后右键点击工程列表中的 INSTALL,生成项目
成功后默认会在 C:\Program Files\Caffe2\ 下安装 Caffe2 的运行库文件,包含 bin\ cmake\ include\ lib\ share\ 共五个文件夹
这一安装路径可在 ${PYTORCH_ROOT}\scripts\cmake_install.cmake 中第 5 行进行自定义
由于默认安装库不全,完成之后还需要将 ${PYTORCH_ROOT}\scripts\lib\Release\ 下独有的 .lib 和 .dll 文件拷贝到 C:\Program Files\Caffe2\lib\ 下
在 VS 中引用
在 Visual Studio 2017 中新建 C++ Windows Console Application 工程,切换至 Release x64 模式,右键编辑工程属性
引用目录
在 VC++ Directories - Include Directories 中添加
C:\Program Files\Caffe2\include
C:\Program Files\Caffe2\include\c10
C:\Program Files\Caffe2\include\caffe2
C:\Program Files\Caffe2\include\google
C:\Program Files\Caffe2\include\onnx
库目录
在 VC++ Directories - Library Directories 中添加
C:\Program Files\Caffe2\lib
附加依赖项
在 Linker - Input - Additional Dependencies 中添加
c10.lib
caffe2.lib
Caffe2_perfkernels_avx.lib
Caffe2_perfkernels_avx2.lib
Caffe2_perfkernels_avx512.lib
caffe2_protos.lib
clog.lib
cpuinfo.lib
cpuinfo_internals.lib
foxi.lib
foxi_dummy.lib
foxi_loader.lib
libprotobuf.lib
libprotobuf-lite.lib
libprotoc.lib
onnx.lib
onnx_proto.lib
onnxifi.lib
onnxifi_dummy.lib
onnxifi_loader.lib
运行库
将 C/C++ - Code Generation - Runtime Library 由 Multi-threaded DLL (/MD) 改为 Multi-threaded (/MT)
SDL 检查
将 C/C++ - General - SDL Checks 由 Yes (/sdl) 改为 No (/sdl-)
修改源码
为避免 VS 中的 IntelliSense 错误,修改了 Caffe2\include 文件中的两处源码
修改了 c10\marcos\Marcos.h 中的 line 46:
//#elif __cplusplus && defined(__has_cpp_attribute)
#elif __cplusplus && defined(__clang__) && defined(__has_cpp_attribute)
注释了 c10\util\ArrayRef.h 中的 line 273:
//using IntList C10_DEPRECATED_USING = ArrayRef<int64_t>;
编译生成
导入头文件:
#include "caffe2/core/net.h"
#include "caffe2/core/blob.h"
#include "caffe2/core/init.h"
#include "caffe2/core/flags.h"
#include "caffe2/core/common.h"
#include "caffe2/core/operator.h"
#include "caffe2/proto/caffe2_pb.h"
#include "caffe2/utils/proto_utils.h"
#include "caffe2/utils/string_utils.h"
#include "caffe2/predictor/predictor.h"
在 main 函数中添加:
caffe2::NetDef net;
caffe2::TensorCPU input;
生成解决方案,应该就没问题了
如果还有问题……那就愉快地 debug 吧……
希望能够对大家有所帮助 ~ 转载请注明出处 ~
References
[1] Install Caffe2 | windows & compile
[3] Caffe2的安装
[4] Introducing the Universal CRT | Visual C++ Team Blog
[6] Windows10下VS2017+caffe2 - HY_JT的博客