这个需要一定caffe基础的人才可以配置,入门者请先看如何把caffe-master给编译成功。
参考博客: Win7_64bit + VS2013 + CUDA7.5 + Opencv2.4.10 成功配置Caffe环境 其主要时GPU版的配置
Cuda学习笔记(四)——在vs2010中配置.cpp和.cu文件 其时关于GPU版本时添加cu文件需要修改项类型的原因。
windows下的caffe配置过程 GPU版本的配置,注意:其后面的3.4 修改部分在现在的新版本是不用修改了,这些bug已经被微软修复了。
A、caffe配置CPU版本。简单出错低!
其大概就是:
1.准备工作
我在自己的笔记本配置的caffe,配置的环境为:Windows7 64位+ cuda8.0+ Opencv2413 + boost1.59+VS2013。
1.1安装CUDA8.0
下载CUDA8.0: https://developer.nvidia.com/cuda-downloads,安装完成后会自动创建环境变量CUDA_PATH_V8_0 ,把bin路径添加到环境变量里。
1.2安装boost1.59
下载boost1.56:http://sourceforge.net/projects/boost/files/boost-binaries/1.56.0/,选择boost_1_56_0-msvc-12.0-64.exe,安装完成后手动创建环境变量BOOST_1_59_0。(创建变量只是为了后期包含库更方便)。把bin路径加到环境变量里,个人的百度盘为:http://pan.baidu.com/s/1kVwqMbX 密码:fep3
1.3安装opencv2413
下载OpenCV2413:http://opencv.org/downloads.html,安装完成后把bin路径加到环境变量里。
1.4第三方库
这一部分主要包括Glog+Gflag+Protobuf+LevelDB+HDF5+LMDB+Openblas,不容易下载。使用的是Neil Z. SHAO‘s Blog提供的编译好的。
下载地址:http://pan.baidu.com/s/1ge9FN71 密码是:434e
下载完,解压得到3rdparty文件夹。其主要是x64平台的debug、release模式下的库跟dll,把bin路径添加到环境变量里。
其实其就是:
是为了方便我们后期的环境配置而已。
1.5下载caffe源码:我使用的地址是:微软提供Windows工具包(caffe-master):https://github.com/Microsoft/caffe 百度云下载地址:链接:http://pan.baidu.com/s/1hs8ngpA 密码:ith0
特点是:比caffe官网的好,修复了很多bug。
2、就可以自己创建一个工程,工程文件如下:
其中src、include是caffe里的,3rdparty是1.4步安装的第三方库。这些都是自己加的。
(1)、然后把与\src\caffe对应的所有文件及文件夹添加进工程源文件中,其大概如下:
任何版本的boost得头文件都相同,所以不用加F:\installed soft\boost_1_59_0\lib64-msvc-12.0里的头文件,因为已经有./3rdparty。接着就是配置工程环境(debug x64)其中的cuda也要加,否则会报错:
VC++目录->包含目录:
./include
./3rdparty
$(CUDA_PATH_V8_0)\include
./3rdparty/include
./3rdparty/include/openblas
./3rdparty/include/hdf5
./3rdparty/include/lmdb
./3rdparty/include/leveldb
./3rdparty/include/gflag
./3rdparty/include/glog
./3rdparty/include/google/protobuf
./src
库目录:
.\3rdparty\lib
$(CUDA_PATH_V8_0)\lib\$(PlatformName)
.\src\caffe\proto
F:\installed soft\boost_1_59_0\lib64-msvc-12.0
其附加依赖项是:
gflagsd.lib
libglog.lib
libopenblas.dll.a
libprotobufd.lib
libprotoc.lib
libgflags.lib
leveldbd.lib
lmdbd.lib
libhdf5.lib
libhdf5_hl.lib
预处理定义为:
WIN32
_DEBUG
_CONSOLE
_LIB
USE_OPENCV
CPU_ONLY
其opencv需要自己另外配置上去就可,我使用的是脚本,所以可以很快。
(2)接着只要编译工程就可,即可成功,很少出错:
原因:应为当预定义里定义了CPU_ONLY时,则这个那些cu文件就不会参与项目编译,我们只编译了一些cpp,hpp文件,故出错概率很低。成功如下:
B、GPU的版本的配置:
注意:这一步出现的错误会挺多的做好心理准备。
3.3 编译源码
3.3.1 建立项目
(1)、打开Visual Studio在caffe根目录下新建一个项目名为caffe的空项目。并设置为x64 Release平台,
(2)、然后把与\src\caffe对应的所有文件及文件夹添加进工程源文件中(test文件夹可以不加)
3.3.2 配置属性
(1)、右键项目名>生成依赖项->生成自定义:勾选CUDA 8.0
2)、VC++目录->包含目录:
./include
./3rdparty
$(CUDA_PATH_V8_0)\include
./3rdparty/include
./3rdparty/include/openblas
./3rdparty/include/hdf5
./3rdparty/include/lmdb
./3rdparty/include/leveldb
./3rdparty/include/gflag
./3rdparty/include/glog
./3rdparty/include/google/protobuf
./src
如图:
3)、VC++目录->库目录:
.\3rdparty\lib
$(CUDA_PATH_V8_0)\lib\$(PlatformName)
.\src\caffe\proto
F:\installed soft\boost_1_59_0\lib64-msvc-12.0
如图:
4)、链接器->输入->附加依赖项:
cuda.lib
cudnn.lib
cudart.lib
curand.lib
gflags.lib
cublas.lib
libglog.lib
libprotoc.lib
libprotobuf.lib
libopenblas.dll.a
libgflags.lib
lmdb.lib
leveldb.lib
libhdf5.lib
libhdf5_hl.lib
如图:
5)、C/C++->预处理器->预处理器定义:
USE_LMDB
USE_OPENCV
USE_LEVELDB
_CRT_SECURE_NO_WARNINGS
_SCL_SECURE_NO_WARNINGS
(注意:caffe代码默认是不使用LEVELDB的,如果加了USE_LEVELDB的话3rdparty里的leveldbd.lib与LevelDb.lib需要进行更换,因为他们是依赖boost.1.56的,需要把其更换为NugetPackages\LevelDB-vc120.1.2.0.0\build\native\lib\x64\v120里的库文件,它们是静态库)错误如下:
如图:
6)、CUDAC/C++ -> Common -> Target Machine Platform:64-bit
如图:
7)、CUDAC/C++ ->Device -> Code Generation:
compute_20,sm_20
这个一般默认产生的。
8)、把F:\VSWorkSpace\caffe\3rdparty\bin加入到系统环境变量path中!!!
9)、接下来把源文件中所有的.cu文件,右键点击属性,在常规中的项类型中把“不参与生成”改成“CUDA C/C++”,在对每一个.cu文件进行单独编译。
这里我没有找到简便方法,(工作量比较大)就是说直接配置.cu文件的属性-常规-项类型,则所有的.cu文件都可以变成“CUDA C/C++”
如图:
如果上面这个步骤没有做,会出现下面图中的问题,因为默认的是.cu文件是“不参与生成”:如下:
error LNK2019: 无法解析的外部符号 "void __cdecl caffe::caffe_gpu_axpy<double>(int,double,double const *,double *)" (??$caffe_gpu_axpy@N@caffe@@YAXHNPEBNPEAN@Z),该符号在函数 "public: void __cdecl caffe::Blob<double>::Update(void)" (?Update@?$Blob@N@caffe@@QEAAXXZ) 中被引用 H:\VCproject\caffe_classification\classification\classification\blob.obj classification
error LNK2001: 无法解析的外部符号 "void __cdecl caffe::caffe_gpu_axpy<double>(int,double,double const *,double *)" (??$caffe_gpu_axpy@N@caffe@@YAXHNPEBNPEAN@Z) H:\VCproject\caffe_classification\classification\classification\sgd_solver.obj classification
error LNK2019: 无法解析的外部符号 "void __cdecl caffe::caffe_gpu_asum<double>(int,double const *,double *)" (??$caffe_gpu_asum@N@caffe@@YAXHPEBNPEAN@Z),该符号在函数 "public: double __cdecl caffe::Blob<double>::asum_data(void)const " (?asum_data@?$Blob@N@caffe@@QEBANXZ) 中被引用 H:\VCproject\caffe_classification\classification\classification\blob.obj classification
如图:
然后就可以编译成功。太perfect了。
加入cu文件的改进方法:
对应文件右键,然后按J键进行添加到项目中,则工程会自动识别并编译。可以快好多。