编译windows版caffe记录
配置:
win10 x64,vs2013 x64,cuda 10.1,cudnn 7.5
参考教程:https://blog.csdn.net/nk_wavelet/article/details/78935511
1.下载源代码
https://github.com/Microsoft/caffe
2、修改配置文件
根据自己的环境修改如下部分:
这里我安装的是cuda10.1,所以将cudaversion改为10.1,
因为我用的GTX1060显卡,算力为6.1,所以修改cudaarchiteecture为compute_61,sm_61。
接下来修改的是python 的安装路径,如果不改,会报以下错误:
error C1083: 无法打开包括文件: “pyconfig.h”: No such file or directory (..\..\src\caffe\layer_factory.cpp)
3、打开工程文件,在libcaffe上点右键生成
可能遇到的错误:
1、“error : too few arguments in function call” 的错误,errorMSB3721: 命令“”C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\bin\nvcc.
解决办法:尝试修改cudnn.hpp如下:
注释掉的是原来的,下面加了#if ...到#endif的这段是添加的内容。
2、error MSB4062: 未能从程序集 C:\WENTEST\NugetPackages \gflags.2.1.2.1\.. 解决方法
类似的还有opencv2.4.10报错,对于opencv,按照如下方法升级即可
在更新里面应该可以找到opencv2.4.11的更新包,点更新即可,我这里没显示是因为我已经更新过了。
对于gflags错误,可以先将NuGet包里面的glog卸载,gflags也会跟着被卸载,然后在左边第二项——联机中搜索glog,然后点安装就可以了。
*********如果按照这个方法继续出错,最后的解决办法:********************
将opencv从NUGET卸载掉,然后再VC++目录中手动加入include路径和lib路径,重新编译,还是报错,但是这次不是报opencv,是报glog或者gflags,故再将glog和gflags从NUGET卸载掉,如opencv一样,在VC++目录中手动配置glog和gflags的include和lib路径,编译成功。
3、error MSB3073
这个方法的解决同样用了进入libcaffe的属性——》生成事件——》预先生成事件——》在生成中使用——》否,生成事件——》后期生成事件——》在生成中使用——》否,重新编译,的方法解决。
4、可能会出现runtime libary不匹配的问题
解决办法:将libcaffe设置为MD,caffe也设置为MD,因为第三方库都是MD模式下生成的,否则就会出现运行时库不匹配的问题。
5、在编译过程中可能会出现out of memory的问题,这个不用急,关掉多余的程序,多试几次就可以成功,反正都是玄学!
----------------------------------------------------------------------------编译结束-----------------------------------------------------------------------------------
最后编译成功就会产生caffe.exe等文件,整个Release文件夹下的所有文件如下所示:
现在试着运行一下caffe,在Realease文件夹下打开cmd,然后输入caffe,报错了:
这里提示没有libgflags.dll,果然在release文件夹下没有这个文件,但是有gflags.dll,依赖包管理工具的gflags文件夹里只有gflags.dll,没有libgflags.dll
试着将Realease文件夹下的gflags.dll复制一份,并重命名为libgflags.dll
然后按照前面的方法运行caffe,成功!
接下来测试一下编译好的caffe中能不能使用GPU来训练网络,经过测试mnist的例子,可以使用GPU来加速训练,测试结果如下全程无错!
下面是使用GPU失败的情况:
这时就不能使用GPU进行加速训练!需要重新编译caffe!
————————————————————————————————————————————————
编译pycaffe python接口
按照教程 https://blog.csdn.net/xierhacker/article/details/51834563即可,但是会报PythonPreBuild.cmd的错误,提示protoc.....的文件错误,检查了一下,发现是在下面和这个文件夹中
按照网上说的做法是,如果报这个错,将属性中的 生成事件->预生成事件->在生成中使用,设置为否。
但是我仔细看了一下这个pythonPreBuild.cmd文件,发现其内容如下:
标红色框的地方就是会报错的地方,打开%PROTO_COMPILER_DIR%这个路径,其内容如下:
因为其路径实际上是指向protoc.exe这个程序,用于将caffe.proto文件编译生成caffe.pb.h和caffe.pb.cc的。
而整个pythonPreBuild.cmd的作用就是:在release文件夹下生成pycaffe/caffe/prpto文件夹,并创建__init__.py,然后使用protoc.exe编译caffe.proto文件。可见在编译时这个步骤不可或缺,因此不能简单的将预生成事件设置为否(我就是在这个地方坑了很久很久,第一次编译报了pythonPreBuild.cmd这个错误,吓得赶紧将预生成事件设置为否,甚至连后期生成事件也设置为否了,这就导致后面这个pycaffe/caffe文件夹下没东西,只有一个proto文件夹,还是第一次报错的时候生成的,所以这个cmd不能跳过)。
为了能让预生成事件顺利进行,修改如下,因为前面报的protoc错误是通过protoc的路劲去找protoc,当然找不到,因为少了后缀.exe,所以加上.exe即可,
或者直接将次路径修改为绝对路径,但是要是换台电脑或者protoc文件换了路劲,就得重新修改这个地方了。
修改完在pycaffe右键点生成,就会在pycaffe/下生成caffe文件夹,和几个py格式文件(这几个文件是通过后编译事件的cmd操作的)
而在caffe文件夹下,也会生成最重要的_caffe.pyd文件,这个就是python要调用的东西,此外还存在很多其他文件,也是通过后编译事件的cmd操作的,其实就是从其他文件夹复制过来的。将这个caffe文件夹复制到python的第三方包管理目录下:
然后在终端中打开python,试着import caffe
没报错就是成功了。