1. 本文给出的方法的最低要求为win7 64位系统和vs2010,其他需要装的软件/第三方库都在
正文中给出了链接。当然,这些软件/函数库都是正版的和免费的。
2. 对于已经装有Intel(R) C++ Studio XE 2013的系统,推荐basaltZhang的帖子。
3. 本文采用的cuda-convnet为含有dropout功能的改进版,应该与原版兼容。
原版cuda-convnet:https://code.google.com/p/cuda-convnet/
改进版cuda-convnet:https://github.com/dnouri/cuda-convnet
4. 本文所述的方法在两种型号的GPU上都通过了测试:GeForce 610M和GTX 690。
由此结果可知,计算性能高于GeForce 610M的GPU都可用本方法。
5. 本文写了半年以后,改进版cuda-convnet的内容已经更新,而原版的代码保持不变。
所以,需要针对改进版更新后的代码对本文进行修改。以下内容中,凡是没有任何
标注的,为两个版本的通用步骤。被中划线覆盖的内容只在编译原版代码的时候需要。
本文的更新日期为:2014.07.14.
编译过程:(编译过程在Wyvernbai的帖子所述的方法的基础上进行了少许改动)
0. 准备工作
安装Visual Studio2010, Python2.7, CUDA5.5 SDK,后两个可以从官网下载安装文件。
安装numpy,可以从官网上下载源码自己编译,也可以从这里上下载别人编译好的版本。
下载cuda-convnet的VS2010工程:cuda-convnet-vs-proj.zip。
下载已经编译好了的openBLAS and pthread-x64库:LIBS.zip。
感谢一个叫Oriol Vinyals的同学提供cuda-convnet的VS2010工程。
感谢一个叫Wyvernbai的网友提供LIBS库。
感谢伟大的GFW没有把以上这些网址给墙掉。
1. 解压cuda-convnet-vs-proj.zip,用记事本/写字板打开pyconvnet.vcxproj.
将其中的CUDA 4.0 改成CUDA 5.5,总共有两处地方要修改。
当然,如果您的CUDA SDK版本为5.0,那就把这里的数字改成5.0就行了。
2. 解压cuda-convnet的源码:cuda-convnet-master.zip,将其中的include和src文件夹拷贝到工程文件夹中。
3. 双击convnet.sln打开工程,将工程设置为x64 release模式。
4. 对于所有c++文件,将cutil_inline.h替换成helper_cuda.h;将cutilCheckMsg替换成getLastCudaError。
5. 在include/cudaconv2/conv_util.cuh和include/nvmatrix/nvmatrix.cuh中加入#include <helper_image.h>。
在include/neuron.cuh中加入#include <Python.h>。
在src/convnet.cu中加入 #define cutGetMaxGflopsDeviceId() gpuGetMaxGflopsDeviceId()。
在include/nvmatrix/nvmatrix.cuh中加入#include <pthread.h>。
6. 解压LIBS.zip,将解压后的文件拷贝到工程文件夹中。
7. Property -> Configuration Properties -> C/C++ -> General -> Additional Include Directories
加入包含目录路径。保留以下部分,其他的删掉:
然后加入如下部分:
8. Property -> Configuration Properties ->Linker -> General -> Additional Library Directories
加入库目录。最终如下所示:
9. Property -> Configuration Properties ->Linker -> Input-> Additional Dependencies
加入附加依赖项。保持原有的不变,在其中加入python27.lib libopenblas.lib。
10. Property -> Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions中删除USE_MKL
Property -> Configuration Properties -> CUDA C/C++ -> Host -> Preprocessor Definitions
中删除USE_MKL
11. Property -> Configuration Properties -> General -> Target Name 改为 convnet_ (仅新版)
12. build整个工程。如果编译成功,就OK了。
测试过程(测试过程遵循cuda-convnet官方主页的说明文档步骤)
0. 下载数据集:cifar-10-py-colmajor.tar.gz 。
1. 在工程文件夹中新建一个data文件夹,将cifar-10-py-colmajor.tar.gz 解压后拷贝到data中。
2. 在工程文件夹中新建一个tmp文件夹。
3. 将cuda-convnet-master中除了include和scr之外的所有文件都拷贝到工程文件夹中。
4. 下载 Dependency Walker,将工程文件夹中的pyconvnet.pyd(新版名称为convnet_.pyd)在Dependency
Walker中打开,检查缺少的dll文件。实际上,按照上面的步骤几乎肯定缺少两个dll文件:libopenblas.dll
和pthreadVC2_x64.dll,这两个文件都在LIBS文件夹中。将它们拷贝到工程文件夹即可。可能还会缺少其他
的dll,比如,我的机器就缺少 libgfortran-3.dll,需要从网上下载。
5. 在cmd中运行命令:
python convnet.py --data-path=.\data\cifar-10-py-colmajor --save-path=.\tmp --test-range=6 --train-range=1-5 --layer-def=./example-layers/layers-19pct.cfg --layer-params=./example-layers/layer-params-19pct.cfg --data-provider=cifar --test-freq=13
运行成功会出现如下信息:
常见错误:
1. 测试阶段,错误提示为:
import pyconvnet
ImportError: DLL load failed: 找不到指定的模块。
解决方法:这种错误是缺少dll引起的,用Dependency Walker进行全面检查。
2. 测试阶段,错误提示为:
Error at C:/cuda-convnet-vs-proj/src/nvmatrix.cu:276
解决方法:这种错误是由于系统无法调用GPU,请运行CUDA SDK的例程,确认GPU是否可用。
注:如果用户是通过远程桌面连接到Window 7,那么他是无法调用GPU的,
这时,可以通过VNC或者向日葵远程控制软件来远程登录Win 7系统。