caffe windows10 vs2013怎么配置

caffe windows10 vs2013怎么配置,第1张

1.配置环境

我在自己的笔记本配置的caffe,配置的环境为:Windows 7 64位 + cuda6.5 + Opencv2.49 +VS2013。假设在配置caffe之前,你已经准备好这些。

本文中将给出一些编译好的依赖库,如果你也是用的Windows 7 64位+VS2013,可以直接使用。

2.准备依赖库

在Windows下配置caffe,一个很主要的问题就是依赖库的编译。不像在Ubuntu下那么方便,在Windows下,依赖库都需要使用vs2013进行编译才能使用。下面我将介绍caffe需要的依赖库(如果你也是win7 64位+VS2013,可以直接使用我提供的依赖库)。

2.1 boost

boost可以下载源码进行编译,也可以直接下载安装文件。我使用的是后者,方便、快捷。

我使用的是:boost_1.56_0-msvc-12.0-64.exe

注意下载适合你的配置环境的boost版本即可。

下载完毕,双击运行安装文件即可。

2.2 Glog+Gflag+Protobuf+LevelDB+HDF5+LMDB+Openblas

这一部分的很多都是谷歌的开源库,不容易下载(你懂的)。所以我使用的是Neil Z. SHAO‘s Blog

提供的编译好的。

下载完,解压得到3rdparty文件夹。在下一段将会用到。

3.建立caffe工程

准备好了caffe需要的依赖库和环境之后,下面就可以建立caffe的vs项目,进行编译了。

3.1 下载caffe源码

可以从caffe的github主页下载源码。

下载地址:Caffe’s GitHub

解压文件,假设caffe源码所在目录为CAFFE_ROOT。

3.2 准备项目需要的依赖库和系统环境变量

经过上一阶段的准备,caffe项目所需的依赖库都已经准备好。

1.首先设置系统环境变量(以我的为例):

CUDA_PATH_V6_5 安装好cuda6.5之后,会自动添加环境变量CUDA_PATH_V6_5

OPENCV_2_49 D:/Tools/opencv2.49/build/

BOOST_1_56 D:/Tools/boost_1_56_0

2.将3rdparty文件夹放到CAFFE_ROOT

3.3 用vs建立caffe项目

1.用VS2013在CAFFE_ROOT下建立 win32 console application,选择空项目。

将项目的平台由32位改为64位

2.修改项目属性

项目——属性——C/C++——常规——附加包含目录

添加:

../include

../src;

../3rdparty/include

../3rdparty

../3rdparty/include

../3rdparty/include/openblas

../3rdparty/include/hdf5

../3rdparty/include/lmdb

../3rdparty/include/leveldb

../3rdparty/include/gflag

../3rdparty/include/glog

../3rdparty/include/google/protobuf

项目——属相——VC++目录——包含目录

添加:

$(CUDA_PATH_V6_5)\include

$(OPENCV_2_49)\include

$(OPENCV_2_49)\include\opencv

$(OPENCV_2_49)\include\opencv2

$(BOOST_1_56)

项目——属性——链接器——常规——附加库目录

添加:

$(CUDA_PATH_V6_5)\lib\$(PlatformName)

$(OPENCV_2_49)\x64\vc12\lib

$(BOOST_1_56)\lib64-msvc-12.0

..\3rdparty\lib

项目——属性——链接器——输入——附加依赖项

debug添加:

opencv_ml249d.lib

opencv_calib3d249d.lib

opencv_contrib249d.lib

opencv_core249d.lib

opencv_features2d249d.lib

opencv_flann249d.lib

opencv_gpu249d.lib

opencv_highgui249d.lib

opencv_imgproc249d.lib

opencv_legacy249d.lib

opencv_objdetect249d.lib

opencv_ts249d.lib

opencv_video249d.lib

opencv_nonfree249d.lib

opencv_ocl249d.lib

opencv_photo249d.lib

opencv_stitching249d.lib

opencv_superres249d.lib

opencv_videostab249d.lib

cudart.lib

cuda.lib

nppi.lib

cufft.lib

cublas.lib

curand.lib

gflagsd.lib

libglog.lib

libopenblas.dll.a

libprotobufd.lib

libprotoc.lib

leveldbd.lib

lmdbd.lib

libhdf5_D.lib

libhdf5_hl_D.lib

Shlwapi.lib

gflags.lib

libprotobuf.lib

leveldb.lib

lmdb.lib

libhdf5.lib

libhdf5_hl.lib

release添加:

opencv_ml249.lib

opencv_calib3d249.lib

opencv_contrib249.lib

opencv_core249.lib

opencv_features2d249.lib

opencv_flann249.lib

opencv_gpu249.lib

opencv_highgui249.lib

opencv_imgproc249.lib

opencv_legacy249.lib

opencv_objdetect249.lib

opencv_ts249.lib

opencv_video249.lib

opencv_nonfree249.lib

opencv_ocl249.lib

opencv_photo249.lib

opencv_stitching249.lib

opencv_superres249.lib

opencv_videostab249.lib

cudart.lib

cuda.lib

nppi.lib

cufft.lib

cublas.lib

curand.lib

gflags.lib

libglog.lib

libopenblas.dll.a

libprotobuf.lib

libprotoc.lib

leveldb.lib

lmdb.lib

libhdf5.lib

libhdf5_hl.lib

Shlwapi.lib

3.4 编译caffe

配置好caffe项目的属性之后,下面就可以一步一步的编译caffe了。

3.4.1 编译./src中的文件

首先,将../src文件夹中的*.cpp文件添加到工程中。

依次编译每一个*.cpp文件。

1.编译blob.cpp

直接编译时会报错,缺少文件”caffe\proto\caffe.pb.h”

这个时候需要将proto.exe放到../3rdparty/bin文件夹

将GernaratePB.bat放在../scripts文件夹

运行bat脚本文件即可生成caffe.pb.h

然后就可以成功编译。

2.编译common.cpp

直接编译这个文件,会出现关于getid和fopen_s的错误。可通过如下步骤修改:

在代码前面添加:#include <process.h>

修改项目属性:项目——属性——C/C++——预处理器——预处理器定义

添加:_CRT_SECURE_NO_WARNINGS

在代码中getid的位置进行如下修改:

#ifdef _MSC_VER

pid = getid()

#else

pid = _getid()

#endf

修改完毕之后,可以成功编译。

3.编译net.cpp

直接编译这个文件,会出现关于mkstep、close、mkdtemp的错误。需要进行如下修改:

在io.hpp头文件中添加:#include “mkstep.h”

在io.hpp头文件中,在close()的位置进行如下修改:

#ifdef _MSC_VER

close(fd)

#else

_close(fd)

#endif

在mkdtemp的位置进行如下修改:

#ifndef _MSC_VER

char* mkdtemp_result = mkdtemp(temp_dirname_cstr)

#else

errno_t mkdtemp_result = _mktemp_s(temp_dirname_cstr, sizeof(temp_dirname_cstr))

#endif

修改完毕,可以成功编译。

4.编译solver.cpp

直接编译会出现关于snprintf的错误,需要进行如下修改:

#ifdef _MSC_VER

#define snprinf sprintf_s

#endif

修改完毕,可以成功编译。

5.其他剩余的cpp文件也依次编译

3.4.2 编译./src/layers中的文件

将./src/layers中的所有的cpp和cu文件都添加到项目中。

右键点击cu文件,修改属性。

在bnll_layer.cu文件,进行如下修改:

float kBNLL_THRESHOLD = 50 ——>#define kBNLL_THRESHOLD 50.0

依次编译所有的文件。

3.4.3 编译./src/util中的文件

将./src/util中所有的文件添加到项目

1.在io.cpp中

修改ReadProtoFromBinaryFile函数

O_RDONLY ——>O_RDONLY | O_BINARY

在代码中进行如下修改:

#ifdef _MSC_VER

#define open _open

#endif

将close()改为_close()

2.在math_functions.cpp中

做如下修改:

#define __builtin_popcount __popcnt

#define __builtin_popcountl __popcnt

3.在db.cpp中

作如下修改:

#ifdef _MSC_VER

#include <direct.h>

#endif

修改CHECK_EQ

#ifdef _MSC_VER

CHECK_EQ(_mkdir(source.c_str()),0)<<”mkdir”<<source<<”failed”

#else

CHECK_EQ(mkdir(source.c_str(),0744),0)<<”mkidr”<<source<<”failed”

#endif

4.依次编译其他文件

3.4.4 编译./src/proto中的文件

参照上一步,将proto中的文件都添加到项目。

修改属性:

项目——属性——C/C++——预处理器——预处理器定义

添加:_SCL_SECURE_NO_WARNINGS

编译所有文件。

3.4.5 编译./tools中的文件

本文件夹下有多个cpp文件,通过它们的名字就可以知道相应的功能。添加不同的cpp文件到项目中,然后生成项目,就可以得到不同功能的exe文件。

将caffe.cpp添加到工程,生成项目,得到caffe.exe文件,可用于训练模型

将computer_image_mean.cpp添加到工程,生成项目,得到的exe文件可用于将训练样本转换为caffe使用的leveldb/lmdb数据集。

依次类推。

自此,caffe在Windows下的编译已经完毕,接下来就可以使用它来训练自己的模型了。

PRE-INSTALLATION ACTIONS 安装前准备

1.1.Verify You Have a CUDA-Capable GPU

在终端中输入: $ lspci | grep -i nvidia ,会显示自己的NVIDIA GPU版本信息

去CUDA的官网http://developer.nvidia.com/cuda-gpus查看自己的GPU版本是否在CUDA的支持列表中

1.2.Verify You Have a Supported Version of Linux 检查自己的linux版本是否支持,我安装的是ubuntu14.04版本的,这个就没有问题

在终端中输入: $ uname -m &&cat /etc/*release

终端显示结果如下所示:

1.3. Verify the System Has gcc Installed

在终端中输入: $ gcc --version

1.4. Verify the System has the Correct Kernel Headers and Development Packages Installed

在终端中输入: $ uname –r 可以查看自己的kernel版本信息

在终端中输入:$ sudo apt-get install linux-headers-$(uname -r)

可以安装对应kernel版本的kernel header和package development

这四个小步骤我都比较顺利,安装好ubuntu后这些都装好了,如果在某一步中有问题,可以参照官方文档进行解决。

runfile安装cuda 下载链接https://developer.nvidia.com/cuda-downloads

2.1.禁用 nouveau

终端中运行:$ lsmod | grep nouveau,如果有输出则代表nouveau正在加载。

Ubuntu的nouveau禁用方法:

在/etc/modprobe.d中创建文件blacklist-nouveau.conf,在文件中输入以下两行内容:

blacklist nouveau

options nouveau modeset=0

在终端中输入:$ sudo update-initramfs –u

设置完毕可以再次运行

$ lsmod | grep nouveau 检查是否禁用成功

如果运行后没有任何输出,则代表禁用成功(如果还有输出,表示没有禁用成功,不过也不要担心,可以重启电脑,再次运行该命令一般情况下会显示禁用成功)。

2.2.重启电脑,到达登录界面时,alt+ctrl+f1,进入text mode,登录账户

2.3.在text mode中输入

$ sudo service lightdm stop 关闭图形化界面

2.4.切换到cuda安装文件的路径

运行$ sudo sh cuda_7.5.18_linux.run

一般下载好cuda安装包后直接放在home目录下,就可以按照上面的代码运行了,建议这么做。

遇到提示是否安装openGL ,选择no(如果你的电脑跟我一样是双显,且主显是非NVIDIA的GPU需要选择no,否则可以选择yes)。其他都选择yes或者默认安装成功后,会显示installed,否则会显示failed。

2.5. 输入 $ sudo service lightdm start 重新启动图形化界面。

Alt + ctrl +F7,返回到图形化登录界面,输入密码登录。

如果能够成功登录,则表示不会遇到循环登录的问题,基本说明CUDA的安装成功了。

2.6. 重启电脑。检查Device Node Verification。

检查路径~/dev下 有无存在名为nvidia*(以nvidia开头)的多个文件(device files)

如果没有的话,可以参考官方文档里的指导步骤,进行添加。

添加过程:

a)在home下创建一个文档,命名位modprobe,不要后缀,文档的内容如下:

#!/bin/bash

/sbin/modprobe nvidia

if [ "$?" -eq 0 ]then

# Count the number of NVIDIA controllers found.

NVDEVS=`lspci | grep -i NVIDIA`

N3D=`echo "$NVDEVS" | grep "3D controller" | wc -l`

NVGA=`echo "$NVDEVS" | grep "VGA compatible controller" | wc -l`

N=`expr $N3D + $NVGA - 1`

for i in `seq 0 $N`do

mknod -m 666 /dev/nvidia$i c 195 $i

done

mknod -m 666 /dev/nvidiactl c 195 255

else

exit 1

fi

/sbin/modprobe nvidia-uvm

if [ "$?" -eq 0 ]then

# Find out the major device number used by the nvidia-uvm driver

D=`grep nvidia-uvm /proc/devices | awk '{print $1}'`

mknod -m 666 /dev/nvidia-uvm c $D 0

else

exit 1

fi

b)将该文件复制到/etc/init.d目录下

终端输入: $ sudo chmod 755 /etc/init.d/modprobe

d)执行如下命令将脚本放到启动脚本中去。

终端输入: $ cd /etc/init.d

$ sudo update-rc.d modprobe defaults 95

注意:数字95其实可以随便设置的。

e)关机然后重新启动,去~/dev下面查看,不出意外此时应该有nvidia*系类文件了。

对于2.6的说明:很有必要说一下不管怎么搞我的nvidia*文件总是出现不了,所以我放弃,不过好像并没有太大的影响。这一点根据情况大家自己试试吧。

2.7. 设置环境变量。

终端中输入 $ sudo gedit /etc/profile

在打开的文件末尾,添加以下两行:

export PATH=/usr/local/cuda-7.5/bin/:$PATH

export LD_LIBRARY_PATH=/usr/local/cuda7.5/lib64/:$LD_LIBRARY_PATH

2.8. 重启电脑,检查上述的环境变量是否设置成功。

终端中输入 : $ env

在输出的环境变量中检查有无上述 设置的变量,如果有则代表设置成功。

3. 检查cuda是否安装成功。

3.1.检查 NVIDIA Driver是否安装成功

终端输入 :$ cat /proc/driver/nvidia/version 会输出NVIDIA Driver的版本号

3.2检查 CUDA Toolkit是否安装成功

终端输入 : $ nvcc –V 会输出CUDA的版本信息

3.3尝试编译cuda提供的例子

切换到例子存放的路径,默认路径是 ~/NVIDIA_CUDA-7.5_Samples

终端输入:$ make

注意:这里的make *** 作是将Samples文件夹下所有的demo都编译了一遍,所以比较耗时,如果仅仅想测试某个例子,可以进入相应的文件夹去编译即可。

如果出现错误的话,则会立即报错停止,否则会开始进入编译阶段。

注意:我第一次运行的时候就报错了,错误是缺少一些依赖库,一般情况下也就是这个问题,按照如下方式安装就好,其实也没必要都安装,不过安装上也不会报错:

$ sudo apt-get install freeglut3-dev

$ sudo apt-get install build-essential

$ sudo apt-get install libx11-dev

$ sudo apt-get install libxmu-dev

$ sudo apt-get install libxi-dev

$ sudo apt-get install ibgl1-mesa-glx

$ sudo apt-get install llibglu1-mesa

$ sudo apt-get install libglu1-mesa-dev

安装好后,在终端输入: $ make

成功后,NVIDIA_CUDA-7.5_Samples文件夹下会出现一个bin文件夹。运行编译生成的二进制文件。

编译后的二进制文件 默认存放在~/NVIDIA_CUDA-7.5_Samples/bin中。

有时候,我们需要在比较大的项目中调用CUDA,这就涉及到MFC+CUDA的环境配置问题,以矩阵相乘为例,在MFC中调用CUDA程序。我们参考罗振东iylzd@163.com(国防科学技术大学计算机学院)的方法。

环境: Windows 7 SP1

Microsoft Visual Studio 2010

CUDA 5.0

步骤:

1.首先建立一个空的名叫Matrix Multiplication_KahanMFC的“FCM应用程序”项目:

点击“确定”,这时d出如下窗口

我们需要对默认项目进行一些修改,点击“下一步”,我们设置一个空的MFC项目,选择“单个文档”和“MFC标准”:

点击“完成”。

2.创建CUDA的调用接口函数及其头文件

(1)头文件

“添加”-->“新建项”-->“Visual C++”-->“头文件(.h)”-->“名称”-->“CUDA_Transfer.h” -->“添加”,如下图:

在CUDA_Transfer.h中添加如下代码:

//CUDA_Transfer.h

#include

#include "math.h"

using namespace std

int run_cuda(float* GPU, float* CPU)

如下图所示:

(2)函数

按照和增加头文件相似的方法,添加函数。“添加”-->“新建项”-->“Visual C++”-->“C++文件(.cpp)” -->“名称”-->“CUDA_Transfer.cpp” -->“添加”,如下图:

在CUDA_Transfer.cpp中添加如下代码:

//CUDA_Transfer.cpp

#include "CUDA_Transfer.h"

#include "stdafx.h"

extern "C" int runtest(float* GPU, float* CPU)

int run_cuda(float* GPU, float* CPU)

{

runtest(GPU,CPU)

return 0

}

如下图所示:

需要注意的是在MFC的文件中是不能包含(include).cu文件的,会报错,所以我们使用extern "C"的方式来实现函数的调用。

3. 创建存放cuda 代码的筛选器,名为CUDA

“添加”-->“新建筛选器”,重命名为CUDA

4. 在筛选器CUDA中创建一个CUDA源代码文件,kernel.cu。

我们直接把已经写好的矩阵相乘的程序kernel.cu复制到项目目录下,添加到CUDA筛选器中去。

添加”-->“现有项”-->“kernel.cu”-->“添加”:

把kernel.cu的int main()函数改为extern "C" int runtest(float* GPU, float* CPU),两个参数用来获得GPU和CPU计算所使用的时间,单位为毫秒。

5. 右击项目-->“生成自定义”:

在d出的窗口中勾选CUDA 5.0(.target,.props)。如果使用其他版本的CUDA,就勾选对应的版本:

点击“确定”。

6. 修改 kernel.cu的编译链接设置

在解决方案资源管理器中右击kernel.cu文件-->“属性”,在d出窗口中-->“常规”-->“项类型”的下拉列表中选择

点击“应用”后,“常规”下方会出现一个“CUDA C/C++”的设置,没有特殊需求,不需要修改,点击“确定”。

7.修改工程设置。

工程设置需要修改“链接器”-->“输入”-->“附加依赖项”和“生成事件”-->“预先生成事件”-->“命令行”。需要设置的参数比较多,我们采用比较简单的方法。

我们新建一个空的CUDA项目,在这个空CUDA项目的项目属性中找到“链接器”-->“输入”-->“附加依赖项”,把“附加依赖项”中所包含的项复制到我们的MFC项目中:

按照同样的方法,设置“生成事件”-->“预先生成事件”-->“命令行”:

设置完成后,点击“确定”。

8.修改MFC文件,完成调用。

我们需要在MFC中调用CUDA程序,显示出GPU和CPU计算两个1024*1024矩阵相乘所消耗的时间。

在Matrix Multiplication_KahanMFCView.cpp中包含(include)"CUDA_Transfer.h"

文件;在CMatrixMultiplication_KahanMFCView::OnDraw(CDC* pDC)中添加如下代码:

float GPU

float CPU

run_cuda(&GPU, &CPU)

CString strGPU,strCPU

strGPU.Format(_T("GPU:%f \n"),GPU)

strCPU.Format(_T("CPU:%f \n"),CPU)

pDC->TextOut(0,0,strGPU)

pDC->TextOut(0,30,strCPU)

如图所示:

然后重新生成解决方案,运行。

计算要花费一些时间,需要等待,测试的时候可以把矩阵大小改小一些。因为把程序加到了OnDraw中,所以每当刷新窗口时候(例如调整窗口大小时),都会调用。由于计算耗时比较长,窗口看起来会像无响应一样,等计算完成就好了。

运行的结果如下:

在矩阵比较大的情况下,GPU的加速效果明显,GPU耗时只需要620ms,而CPU需要23438ms,要花费将近40倍的时间。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11680462.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存