Windows版PyCaffe-GPU编译流程

0. 声明

当前版本R1.0(预发布)。

作者联系方式:E-mail: WindForest@yeah.net

首先将本文使用到的各工具版本列出如下:

编译/目标操作系统Windows 10 20H2 x64
本文使用的VS版本Virtual Studio 2015 (VC14)
本文操作步骤支持的CUDA版本CUDA8.0/CUDA9.0
本文配合使用的cuDNN版本cuDNN7.1.3(对应于CUDA8.0)或cuDNN7.6.0(对应于CUDA9.0)
Python版本Python 2.7.16
Caffe源https://github.com/happynear/caffe-windows/
本机CPU信息Intel® Core™ i7-5500U CPU @ 2.40GHz
本机GPU信息NVIDIA GeForce 940M算力5.0

[建议]

所有的程序或环境最好使用其默认目录,以避免不必要地在环境配置上浪费时间。如果你的电脑C盘没有足够的空间,不如换一块大容量的SSD。

1. VS和CUDA的版本选择

Caffe框架以源码提供,因此首先需要安装 Virtual Studio 2015(VC14) ,按照网上一些资料所述,VS2013(VC12)也可以编译Caffe1.x,但是考虑到目标项目提供的示例程序是基于VC14创建的,这里选择VS2015版本。

若需编译Caffe的GPU版本,则CUDA和cuDNN也需要安装。高版本CUDA/cuDNN中有一些API变动,因此考虑到后文中的Caffe编译适配,经查阅相关资料及实际测试,在本机上CUDA8.0/cuDNN7.1.3CUDA9.0/cuDNN7.6.0等版本组合是可行的。

[说明]

由于默认的NCCL是按照CUDA9.0版本进行编译的,因此当选择CUDA9.0时无需后文“编译NCCL动态库”的操作。

[说明]

笔者的机器已经比较老了,在较新的机器上,GPU支持的CUDA版本也不尽相同,在一些资料中,CUDA10.0以上编译本文使用的Caffe源可能会出现一些问题。因此如果不是受限于需求,建议使用支持高版本CUDA的神经网络计算框架。

VS的安装应该在CUDA之前,以便于CUDA安装过程中增加对VS的支持。而后将cuDNN解压,将其中的文件复制到CUDA安装目录的同名文件夹下,并将CUDA安装目录中的 .\lib\x64 目录添加进系统环境变量。

2. Python环境配置

下载Python2.7,安装时顺便添加python的PATH路径。Python2.7已经被弃用,选择它的原因依旧是出于兼容性考虑,且后文使用的Caffe源中三方库是基于Python2.7编译的。

下载pip安装脚本,在管理员权限下的命令提示符(或Windows PowerShell)中切换到该文件所在路径下执行:-方法来源-

python .\get-pip.py
pip install numpy
pip install protobuf
pip install scikit-image
pip install scipy
pip install pandas

[说明]

若安装pip后在命令提示符下找不到pip命令,请确认pip的安装目录,并将其添加到系统的PATH环境变量。

[说明]

如需指定pip及三方库安装位置,如安装到Python自身目录下,可参考Python库的安装位置

修改Python安装路径下 .\Lib\site.py 文件中 USER_BASEUSER_SITE 指向的位置,如:

USER_SITE = "C:\Program Files\Python27\Lib\site-packages"
USER_BASE = "C:\Program Files\Python27\Scripts"

而后在命令行使用:

python -m site

重新设置安装位置即可。先前安装的库可以被删除。

3. Caffe的适配和编译

下载Caffe-Windows-MS工程,首先按照自述文件中提供的链接下载工程所需第三方库并解压到 .\windows\threadparty 目录下,该目录不需加入到环境变量中。而后将 .\windows\CommonSettings.props.example 文件复制到其所在目录并重命名为 CommonSettings.props ,对其内容做以下修改:

  1. 修改 CpuOnlyBuild 项为 false

  2. 修改 UseCuDNN 项为 true

  3. 修改 UseNCCL 项为 true

  4. 修改 UseMKL 项为false

  5. 修改 CudaVersion 项为 8.09.0

    [说明]该项取决于本机安装的CUDA版本,编译时VS会自动寻找对应版本的CUDA动态库。

  6. 修改 PythonSupport 项为 true

  7. 修改 MatlabSupport 项为 false

  8. 修改 MXNetSupport 项为 false

    [说明]

    由于作者的需求所限,本文编译过程中没有开启对Matlab和MXNet的支持,因此也无法针对这两项给出有效的编译建议,在此深表抱歉。

  9. 修改 CudaArchitecture 项为显卡对应算力,具体可查询:https://developer.nvidia.com/zh-cn/cuda-gpus#collapse4,如:

    <CudaArchitecture>compute_50,sm_50;</CudaArchitecture>
    
  10. 修改 CuDnnPath 项为CUDA安装目录,注意版本号与安装的CUDA版本对应。如:

    <CuDnnPath>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0</CuDnnPath>
    
  11. 修改 PythonDir 项为Python2.7安装目录(需根据实际位置修改,如使用Anaconda环境),如:

    <PythonDir>C:\Program Files\Python27</PythonDir>
    

使用Virtual Studio 2015打开工程,进行以下动作:

  1. 为Nuget包管理器换源

    打开【工具】->【NuGet包管理器】->【程序包管理器设置】,在左侧列表中选择【NuGet包管理器】->【程序包源】,添加新的项目指向https://api.nuget.org/v3/index.json,并取消其它源的选择。

  2. 更改编译配置

    右键右侧【解决方案资源管理器】中的libcaffe项,选择【属性】,在配置界面左侧【配置属性】->【C/C++】中“将警告视为错误”项设置为“否(/WX-)”。同样的方法修改pycaffe项和test_all项的对应配置。

  3. 更换解决方案的编译配置为 Release + X64 。在主窗口上方直接选择即可。

  4. 执行【生成】->【生成解决方案】以编译全部项目,或在解决方案资源管理器中生成指定的项目即可。

[排错记录]

若使用原工程提供的boost1.65编译出现C2694错误,则表示VS2015对该C++特性不支持,需要降低boost版本。按照网上某贴所述,可使用boost1.61.0版本,但当前NuGet源中对项目所需的boost_python-vc140的支持已经不再包含1.61.0版本,因此选用boost1.62.0版本。

按照 .\windows\thirdparty\Boost\lib64-msvc-14.0 中文件名指示,在【工具】->【NuGet包管理器】->【管理解决方案的NuGet程序包】中的“浏览”选项卡,分别搜索并为全部项目安装1.62.0版本的以下第三方库:

  1. boost
  2. boost_chrono-vc140
  3. boost_date_time-vc140
  4. boost_filesystem-vc140
  5. boost_python-vc140
  6. boost_system-vc140
  7. boost_thread-vc140

或在【工具】->【NuGet包管理器】->【程序包管理器控制台】中执行以下命令安装上述软件包:

Install-Package boost_chrono-vc140 -Version 1.62
Install-Package boost_date_time-vc140 -Version 1.62
Install-Package boost_filesystem-vc140 -Version 1.62
Install-Package boost_python-vc140 -Version 1.62
Install-Package boost_system-vc140 -Version 1.62
Install-Package boost_thread-vc140 -Version 1.62

boost1.62.0会被自动安装。而后打开工程目录中 .\windows\CommonSettings.props 文件,修改其中对BoostIncludeFolder和BoostLibraryFolder的设置为:

    <BoostIncludeFolder>$(SolutionDir)packages\boost.1.62.0.0\lib\native\include</BoostIncludeFolder>
    <BoostLibraryFolder>$(SolutionDir)packages\boost_thread-vc140.1.62.0.0\lib\native\address-model-64\lib;$(SolutionDir)packages\boost_filesystem-vc140.1.62.0.0\lib\native\address-model-64\lib;$(SolutionDir)packages\boost_chrono-vc140.1.62.0.0\lib\native\address-model-64\lib;$(SolutionDir)packages\boost_system-vc140.1.62.0.0\lib\native\address-model-64\lib;$(SolutionDir)packages\boost_date_time-vc140.1.62.0.0\lib\native\address-model-64\lib;$(SolutionDir)packages\boost_python-vc140.1.62.0.0\lib\native\address-model-64\lib</BoostLibraryFolder>

保存并重新生成解决方案即可。

[排错记录]

在使用CUDA9.0编译时,可能需根据编译输出修改nvcc.hpp文件,屏蔽以下宏定义:

// A bug in version 7.0 of CUDA prevents use of variadic templates in some occasions
// https://svn.boost.org/trac/boost/ticket/11897
// This is fixed in 7.5. As the following version macro was introduced in 7.5 an existance
// check is enough to detect versions < 7.5
//#if !defined(__CUDACC_VER__) || (__CUDACC_VER__ < 70500)
//#   define BOOST_NO_CXX11_VARIADIC_TEMPLATES
//#endif

4. 编译NCCL动态库

使用CUDA8.0编译后运行caffe.exe,提示找不到cudart64_90.dll,根据此链接提供的解决方法,重新编译NCCL库使之适配当前使用的CUDA版本。

下载NCCL工程,修改 .\windows\nccl.vcxproj 文件中两处 CUDA 9.0.targets 改为使用的CUDA版本,如本次的 CUDA 8.0.targets

该文件在CUDA安装时自动安装到VS目录下,默认位置为:

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations

而后打开 .\windows\nccl.sln 并编译解决方案。

.\windows\x64\Release 目录下的 cudart64_80.dllnccl.dllnccl.pdb 替换掉Caffe工程 .\windows\thirdparty\NCCL\bin.\windows\thirdparty\bins 目录下的同名文件;将 nccl.lib 替换掉Caffe工程 .\windows\thirdparty\NCCL\lib 目录下的同名文件。

.\Build\x64\Release\caffe.exe 拷贝到 .\windows\thirdparty\bins 目录下,使用命令提示符打开此目录运行caffe.exe,若出现以下提示:

G:\caffe-windows\windows\thirdparty\bins>caffe.exe
caffe.exe: command line brew
usage: caffe <command> <args>

commands:
  train           train or finetune a model
  test            score a model
  device_query    show GPU diagnostic information
  time            benchmark model execution time

  No modules matched: use -help

说明动态库依赖正常。

5. Caffe的测试

使用caffe自带的mnist测试Caffe框架和GPU的工作情况,caffe+mnist的基本操作网上有的是,这里只是重复一遍。

http://yann.lecun.com/exdb/mnist/网站下载mnist数据到caffe源码目录下的 mnist 文件夹(仅做示范),并解压这些文件。

[说明]train-images-idx3-ubyte.gz、train-labels-idx1-ubyte.gz、t10k-images-idx3-ubyte.gz、t10k-labels-idx1-ubyte.gz四个文件全部都要下载。

将以下代码保存为 mnist_create.bat 文件:

windows\thirdparty\bins\convert_mnist_data.exe mnist\train-images.idx3-ubyte mnist\train-labels.idx1-ubyte examples\mnist\mnist_train_lmdb   
echo.   
windows\thirdparty\bins\convert_mnist_data.exe mnist\t10k-images.idx3-ubyte  mnist\t10k-labels.idx1-ubyte examples\mnist\mnist_test_lmdb  
pause

将以下代码保存为 mnist_train.bat 文件:

windows\thirdparty\bins\caffe.exe  train --solver=examples\mnist\lenet_solver_adam.prototxt
pause

将以下代码保存为 mnist_test.bat 文件:

windows\thirdparty\bins\caffe.exe test --model=examples\mnist\lenet_train_test.prototxt --weights=examples\mnist\lenet_iter_10000.caffemodel -iterations 100
pause

.\Build\x64\Release\caffe.exe 拷贝到 .\windows\thirdparty\bins 目录下。而后依次执行上述三个文件,即可在GPU上训练并验证网络训练过程。

mnist示例训练过程

mnist示例训练过程

mnist验证过程

mnist示例验证过程

6. Pycaffe安装

在先前的编译中,已经开启了对Python的支持和接口,将Caffe工程目录的 .\Build\x64\Release\pycaffe\caffe 目录及其中文件拷贝到Python安装目录下的 .\Lib\site-packages 目录下;将工程目录的 .\windows\thirdparty\bins 目录下的文件也拷贝到目标目录 .\Lib\site-packages\caffe 下即可。

在命令提示符或Windows PowerShell下进入python,执行import caffe操作,若成功则Caffe基本环境安装完成。

在Windows下使用pycaffe进行mnist训练以进一步验证安装,具体操作和代码可参考:caffe的python接口学习(4):mnist实例—手写数字识别

此时的Caffe仅仅是最基本的框架,若目标网络中有特殊的网络层,还需要手动添加到Caffe再执行编译,不过,那已经超出本文的范畴了。

————2021-2-13@燕卫博————

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值