Windows7下安装Caffe(GPU):另一个失败版本

这个笔记和那个失败的版本可能部分一样。

一. 安装CUDA7.5
1. 最新版本是8.0,之前用不适合caffe-windows,所以改用7.5。7.5又似乎不好找,我在这里下载的: http://www.techspot.com/downloads/4995-nvidia-cuda-toolkit.html
2. 安装:

出现这个问题。。不懂。。我还是继续了
后来大概弄懂了:
首先,CUDA不是驱动,这里的“This graphics driver"让我以为CUDA是显卡驱动,坑爹,其实应该是CUDA里面自带了驱动程序,这个驱动程序不适合我的显卡(GTX 1060),因此上面说如果建议我保留自己的显卡驱动,也就是继续安装时不要安装CUDA带来的显卡驱动。
于是选择自定义安装,继续:

发现确实电脑自己的版本还更新,就把显卡驱动勾去掉,再继续安装,一路默认下去。但是这里图中两个没勾选的组件是绑定的,没办法,GPU Deployment Kit也只能不安装了,不知道有没有影响。

3. 添加环境变量:
安装完毕后,可以看到系统中多了 CUDA_PATH CUDA_PATH_V7_5 两个环境变量,接下来,还要在系统中添加以下几个环境变量:
CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5.  
CUDA_LIB_PATH = %CUDA_PATH%\lib\x64 
CUDA_BIN_PATH = %CUDA_PATH%\bin 
CUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%\bin\x64 
CUDA_SDK_LIB_PATH = %CUDA_SDK_PATH%\common\lib\x64

然后,在系统变量 PATH  的末尾添加:
;%CUDA_LIB_PATH%;%CUDA_BIN_PATH%;%CUDA_SDK_LIB_PATH%;%CUDA_SDK_BIN_PATH%;

4. 重启电脑

二. VS2013与CUDA关联(不知道这步是有什么用,CUDA里面的Sample用VS打开都可以直接运行,都不用关联,这步只是举个使用CUDA的例子??)
1. 新建win32控制台程序-空项目
2. 右键 源文件,新建CUDA源文件:

3. 右键项目->生成依赖项->生成自定义,勾选CUDA7.5***选项:

4. 右键项目->属性->配置属性->VC++目录,添加以下两个包含目录:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include 
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5\common\inc
再添加两个库目录:
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\lib\x64 
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5\common\lib\x64

5. 右键项目->属性->配置属性->链接器->常规->附加库目录,添加
$(CUDA_PATH_V7_5)\lib\$(Platform)

6. 右键项目->属性->配置属性->链接器->输入->附加依赖项, 添加
cublas.lib
cublas_device.lib
cuda.lib
cudadevrt.lib
cudart.lib
cudart_static.lib
cufft.lib
cufftw.lib
curand.lib
cusparse.lib
nppc.lib
nppi.lib
npps.lib
nvblas.lib
nvcuvenc.lib
nvcuvid.lib
OpenCL.lib
注意:这里后来把nvcuvenc.lib删掉了,否则一直出错。

7. 右键之前创建的源文件,点击属性,选择项类型 CUDA C/C++:

8. 打开配置管理器(运行按钮旁边下拉框),选择新建X64平台

9. 测试代码:
/** * addition: C = A + B. * * This sample is a very basic sample that implements element by element * vector addition. It is the same as the sample illustrating Chapter 2 * of the programming guide with some additions like error checking. */
#include <stdio.h>
#include <iostream> // For the CUDA runtime routines (prefixed with "cuda_")
#include <cuda_runtime.h>
/** * CUDA Kernel Device code * * Computes the vector addition of A and B into C. The 3 vectors have the same * number of elements numElements. */
__global__ void Add(int a, int b, int *c) {
*c = a + b;
}
int main() {
int c;
int *devc;
cudaError_t err = cudaSuccess;
err = cudaMalloc((void **)&devc, sizeof(int));
if (err != cudaSuccess) {
fprintf(stderr, "Failed to allocate device vector A (error code %s)!\n", cudaGetErrorString(err));
exit(EXIT_FAILURE);
}
Add << <1, 1 >> >(2, 7, devc);
err = cudaMemcpy(&c, devc, sizeof(int), cudaMemcpyDeviceToHost);
if (err != cudaSuccess) {
fprintf(stderr, "Failed to allocate device vector A (error code %s)!\n", cudaGetErrorString(err));
exit(EXIT_FAILURE);
}
printf("2+7=%d\n", c);
cudaFree(devc);
system("pause");
return 0;
}
运行成功:


三. 安装配置Caffe
1. 下载Caffe和第三方包
2015/02/25 微软制作了一个caffe的windows版:
第三方:
解压后放在Caffe里的3rdparty文件夹里

2. 将3rdparty/bin添加到环境变量PATH中

3. 运行./src/caffe/proto/extract_proto.bat批处理文件来生成caffe.pb.h和caffe.pb.cc两个C++文件,和caffe_pb2.py这个python使用的文件。(这步不知道是干嘛的)

4. 打开./buildVS2013/MainBuilder.sln,打开之后切换编译模式至Release X64模式,如果现实加载失败,可能是CUDA版本不一致,用记事本将各个文件夹下的.vcxproj文件里的CUDA版本号换成自己的版本号。

5. 修改matcaffe、pycaffe工程相关属性 
打开matcaffe工程属性页,添加matlab的 include路径和lib路径:
E:\IDE\MATLAB\R2016b\extern\include
E:\IDE\MATLAB\R2016b\extern\lib\win64

链接器->常规 中添加附加目录:
E:\IDE\MATLAB\R2016b\extern\lib\win64\microsoft

python类似

6. 点击生成进行编译
warning不算,还是出现各种错误,再看看吧。。。(妈的,我已经完全按教程来了啊)


四. 解决问题吧
0. 一开始以为没有cudnn,于是去下载

下载的压缩包中是Nvidia编译好的lib和dll以及.h头文件,约39MB,解压缩到本地目录即可。

妈的下载下来也不知道放哪,怎么用。
艹, 放弃这个教程了,看其他教程caffe文件夹内容都跟这个不一样,也不知道什么区别
麻蛋,草。

后来绕了一圈还是回来解决问题:
判断应该是第三方库没有加载进来的问题,第三方库添加到工程里的方法我一直没有完全搞懂,每次都是按照教程来,先来自己理一理:
1. 首先这里说的调用第三方库,指的是调用dll动态链接库,还有静态链接库可以调用吧,具体怎么样,区别是什么妈的又忘了。。总之这里是dll,3rdParty里面的第三方库也是dll。
2. 然后dll的调用有动态调用和静态调用两种方法。
3. 动态调用只需要dll文件即可,在代码里直接load,用相关代码导入即可。
4. 然后这里应该是用 静态调用的方法。
5. 静态调用需要.h头文件,.lib静态库文件和.dll动态库文件,把他们包含进来就好了。(.h就是声明第三方库里的函数了,.lib好像是用来告诉程序函数具体在哪里,从而去.dll里调用。)

6. 再研究下具体是怎么包含进来这些文件的,右键caffe工程的->属性(这里先看caffe工程,和其他工程是什么关系之后再看吧。。)

左边栏就有好多不知所以然的东西,比如VC++目录,C/C++,链接器这些东西,点进去看看吧。 VC++目录:看到里面有可执行文件目录,包含目录,库目录。找我理解,分别把dll文件,h头文件,lib静态库文件所在的目录添加到这三个设置里,就可以了吧。。
点击可执行文件目录,下面有说明,与环境变量PATH相对应,之前唯一一个和3rdparty目录相关的操作就是把该目录添加到系统环境变量PATH里,在这里就体现作用了。点击可执行文件目录的编辑,发现里面确实有$PATH这个宏

然后发现了个问题:

之前添加环境变量时,是添加到系统变量的Path里的,而用户变量里有个PATH,VS这里看是说$PATH,所以可能是得放到用户变量里的大写PATH里?试试吧。(其实一开始我就是放到PATH里的,毕竟教程里的是大写,我是乖乖按步骤来的,可是出错了,我才试着放到系统变量里的,以为毕竟系统看起来更牛逼)。
于是就在PATH里也添加了3rdparty\bin目录(原来的没删除),再次编译。。。。然后还是一样,要重启电脑?那重启下看看吧。。首先我重启VS(只是简单地关了再打开也不知道算不算重启VS,你懂得,后台一大堆乱七八糟的东西),总之不行,那重启电脑吧。吃个饭再来,重启好了,编译,还是一样。
过。
再看看包含目录,引用目录,也没看到3rdparty有关的的目录。
C/C++:看到里面有附加包含目录,也不知道和前面看到的有什么区别,就是这么莫名其妙

下面说:指定一个或多个要添加到包含路径中的目录,所以和VC++目录这一栏里的包含目录是一样功能的咯,那有啥区别呢。。(在这里说明一下区别会死么。。)
点编辑可以看到里面已经设置好了,有3rdparty/include,那这里就是设置让项目包含第三方库的.h文件的地方了。但是C/C++这一栏就没发现设置lib和dll目录的地方了。。(dll应该是在上面说的PATH那里设置了的)
链接器->常规:看到里面有附加库目录

允许用户重写环境库路径(/LIBPATH:folder),不知道啥意思,去系统环境变量那看看,没看到LIBPATH。这里有3rdparty/lib,所以静态库目录的添加应该是在这里。
链接器->输入:有个附加依赖项

有各种lib文件。只能猜测,估计作用是这样:
dll静态调用需要在代码中用 #pragma comment(lib, "E:\\test.lib")   这样的代码添加lib静态库文件,如果分号里的文件没有绝对路径,只是一个文件名.lib,那么程序回到前面设置好的附加库目录里去找该lib文件。在整个工程里搜索pragma字眼都没搜到:

所以估计是在这里附加依赖项里编辑好需要调用的lib文件,程序编译后自动添加这些lib静态文件吧。(TMD每次都只能猜,从高中开始,很多知识都是靠猜,教材什么的从来没能讲清楚过,特别是本科的一些课程教材,真是悲哀啊)
看到这,.h文件,.lib文件,.dll文件都有关联进来了。(设置就不能都放一起么。。这里一个那里一个。。区别也不说)
那编译出错:无法解析的外部符号是怎么回事呢。。这里有点参考
在工程里搜索ShowUsageWithFlagsRestrict这个函数,也就是编译里出错所无法解析的,转到定义,发现定义在gflags.h头文件里:

再去lib目录和bin目录下也能找到gflags.lib和gflags.dll,附加依赖项里也有gflags.lib。
不知道为什么,再去搜索,发现原笔记作者的笔记:
按照方法:
--下载新的第三方库: http://pan.baidu.com/s/1nvH7whz
--解压后,替换 3rdparty 文件夹中的 bin、lib、include文件夹;
--打开各工程属性页,在 链接器-》输入-》附加依赖项 中添加 “ libgflags.lib ” 即可。
???怎么又来个libgflags.lib,新的第三方动态库里没有这个lib啊,莫名其妙。然后发现旧的版本里反而有这个文件。
先不添加libgflags.lib,只更新动态链接库,编译出错:

再添加libgflags.lib试试,而且第二个工程caffelib属性里没有链接器这个选项。。。。好吧不管了,设置好后编译:呵呵,无法打开输入文件,那就是确实没有这个文件啊。。

好吧,那不是用新的文件夹替换旧的文件夹吧,是新的文件覆盖旧的文件,旧的有新的没有的要照样保留吧,那要说清楚啊。。也要说清楚libgflags.lib是以前忘了加进去或者什么的嘛。。。无语。。当然也不一定可以,试试吧。。把旧的再拿回来,和新的合并,一样的保留最新。
再次编译:

TM的还是出现这种错误,老子不玩了。。
再把第三方库换回旧版本,编译也出现上面的错误,好吧。。
那整个重来遍,从解压caffe开始重来,直接用新的第三方库(和旧的合并),并添加libgflags.lib,另外,这里发现然C/C++->附加包含目录里面设置了个默认的matlab头文件地址,之前我们是把matlab这个路径设置在VC++->包含路径里的,好吧,为了不出错,这里也设置一下。。python也做一样处理。。然后编译:
呵呵,错误还是这样:

我还能说什么呢。

这个版本 OVER

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值