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.3或CUDA9.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_BASE 和 USER_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 ,对其内容做以下修改:
-
修改 CpuOnlyBuild 项为 false ;
-
修改 UseCuDNN 项为 true ;
-
修改 UseNCCL 项为 true ;
-
修改 UseMKL 项为false ;
-
修改 CudaVersion 项为 8.0 或 9.0 ;
[说明]该项取决于本机安装的CUDA版本,编译时VS会自动寻找对应版本的CUDA动态库。
-
修改 PythonSupport 项为 true ;
-
修改 MatlabSupport 项为 false ;
-
修改 MXNetSupport 项为 false ;
[说明]
由于作者的需求所限,本文编译过程中没有开启对Matlab和MXNet的支持,因此也无法针对这两项给出有效的编译建议,在此深表抱歉。
-
修改 CudaArchitecture 项为显卡对应算力,具体可查询:https://developer.nvidia.com/zh-cn/cuda-gpus#collapse4,如:
<CudaArchitecture>compute_50,sm_50;</CudaArchitecture>
-
修改 CuDnnPath 项为CUDA安装目录,注意版本号与安装的CUDA版本对应。如:
<CuDnnPath>C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0</CuDnnPath>
-
修改 PythonDir 项为Python2.7安装目录(需根据实际位置修改,如使用Anaconda环境),如:
<PythonDir>C:\Program Files\Python27</PythonDir>
使用Virtual Studio 2015打开工程,进行以下动作:
-
为Nuget包管理器换源
打开【工具】->【NuGet包管理器】->【程序包管理器设置】,在左侧列表中选择【NuGet包管理器】->【程序包源】,添加新的项目指向https://api.nuget.org/v3/index.json,并取消其它源的选择。
-
更改编译配置
右键右侧【解决方案资源管理器】中的libcaffe项,选择【属性】,在配置界面左侧【配置属性】->【C/C++】中“将警告视为错误”项设置为“否(/WX-)”。同样的方法修改pycaffe项和test_all项的对应配置。
-
更换解决方案的编译配置为 Release + X64 。在主窗口上方直接选择即可。
-
执行【生成】->【生成解决方案】以编译全部项目,或在解决方案资源管理器中生成指定的项目即可。
[排错记录]
若使用原工程提供的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版本的以下第三方库:
- boost
- boost_chrono-vc140
- boost_date_time-vc140
- boost_filesystem-vc140
- boost_python-vc140
- boost_system-vc140
- 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.dll 、 nccl.dll 、 nccl.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上训练并验证网络训练过程。
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@燕卫博————