CNTK从入门到深入研究(7) - 搭建CNTK开发环境

前言

本系列文章前面部分是对CNTK的基本使用做一些介绍,从本篇文章开始,我们将共同的去研究CNTK的内部实现和一些针对于特殊项目的定制化修改(自定义DataReader等)。

本篇文章所涉及的CNTK开发环境,指的是CNTK代码的实现,而非具使用CNTK进行体深度学习的生产程序开发环境。

做一个广告,笔者认为,机器学习领域中工具的使用比工具的实现更加重要,笔者有计划去针对其他项目做一些使用上的介绍,例如微软提供的Machine Learning Studio以及“牛津计划”等,敬请期待笔者的其他系列文章。

获取CNTK的源代码

作为微软的开源项目,微软已经将CNTK的代码放到Github上,下面是地址,

https://github.com/Microsoft/CNTK/

当然可以直接clone下来微软的代码

git clone https://github.com/Microsoft/cntk

但是笔者个人建议大家不要直接拉代码而是先fork到自己的账户下后clone自己的CNTK版本库。
CNTK从入门到深入研究(7) - 搭建CNTK开发环境_第1张图片

笔者建议fork到自己账户下在clone的原因是,CNTK作为一个开源项目,大家是可以共同贡献的代码的。难免在使用中遇到些小bug,顺手修了的同时提交给微软一个pull request。是否突然感觉自己参与了开源社区的建设而感觉略微良好呢?

准备工作

CNTK依赖于如下几项内容, 所以需要用户先将其部署好后才可以执行CNTK工具包的编译。CNTK其实包括2个版本,一个是“onlyCPU”的版本,另外一个是使用“GPU”的版本。两者编译工作先前的环境准备不是很相同。

同时作为机器学习领域的微软开源项目,支持多平台将大大丰富其发展空间,CNTK目前支持Windows及Linux,但是笔者目前只有Windows环境,只能以Windows环境举例。下面是所需要的列表:

  • Visual Studio 2013 with Update 5 (笔者目前在Update 4环境下,目前也没遇到奇怪的问题)>
  • Boost (建议是1.59.0,但是之后的版本也可)
  • ACML或者是MKL (如果是ACML要求5.3.1以上版本,或者使用MKL,笔者环境使用ACML虽然是Intel的CPU)
  • MS-MPI v7或者以上
  • NVidia CUDA 7.0(笔者的开发环境为7.5,如果是7.5则还需要修改一些文件内容)
  • NVidia CUB 1.4.1
  • NVidia cuDNN 4.0(rc或者prod版本都可以目前)
  • (可选)OpenCV(CNTK中ImageReader使用的)
  • (可选)zlib和libzip(也是ImageReader使用的,ImageReader支持直接从一个zip文件自动解压加载图片)

之前有讲过,CNTK分两个版本,onlyCPU版本和GPU版本。如果只需要编译onlyCPU版本,那些庞大的Nvidia相关的库则可以不用部署。这些Nvida相关的库中,CUDA和CUB都可以随意下载,但是对于cuDNN这个库,正规的获取方式需要申请NVidia Accelerated-Computing的开发账户(申请是免费的,但是需要等几天时间审批下来),当然也应该有其他渠道获取。

Visual Studio 2013

Visual Studio 2013 这个就不细说如何获取了。建议更新Update到5。

Boost

Boost库CNTK官方给出的指导版本是1.59.0,可以自己下载源码编译,也可以直接下载编译好的。(编译boost库真的需要时间和空间,真的建议直接下载编译好的版本)

http://sourceforge.net/projects/boost/files/boost-binaries/1.59.0/boost_1_59_0-msvc-12.0-64.exe/download

Boost库安装后需要设定两个环境变量,BOOST_INCLUDE_PATH和BOOST_LIB_PATH分别用于指定boost库的include目录和lib目录。

BOOST_INCLUDE_PATH=c:\local\boost_1_59_0
BOOST_LIB_PATH=c:\local\boost_1_59_0\lib64-msvc-12.0

ACML/MKL

ACML是AMD的数学库,MKL是Intel的数学库,两者CNTK都支持,选择一个即可,默认CNTK支持的是ACML,如果使用MKL则需要在编译的时候在Math工程中定义USE_MKL这个宏。

使用ACML

ACML需要使用5.3.1以上,切记,一定要下载下载ifort64的windows版本,地址如下:

http://developer.amd.com/tools-and-sdks/archive/amd-core-math-library-acml/acml-downloads-resources/

安装ACML后,需要手动设定环境变量ACML_PATH用于指定ACML的安装位置:

ACML_PATH=C:\AMD\acml5.3.1\ifort64_mp

同时如果是Intel CPU并支持FMA3,则建议设置环境变量ACML_FMA=0去避免一些问题。

ACML_FMA=0

使用MKL

MKL可以通过如下地址获取,再提醒一下使用MKL需要为Math工程定义USE_MKL宏:

https://software.intel.com/en-us/intel-mkl

MS-MPI

MS-MPI是一个好东西,他其实是微软HPC高性能计算的一部分,CNTK中通过它来实现多设备多进程的并行计算,借此来体现出CNTK的速度快等优点。详细的介绍请移步下面的站点:

https://msdn.microsoft.com/en-us/library/bb524831(v=vs.85).aspx

目前CNTK中需要使用的MS-MPI v7下载地址如下:

https://www.microsoft.com/en-us/download/details.aspx?id=49926

CUDA

CUDA Toolkit

CNTK中需要使用CUDA来调用GPU对计算进行加速,所以需要部署CUDA,微软给出的指导说明是使用7.0版本的,但是笔者目前使用的是7.5暂时没有遇到什么问题,预计官方也会在未来一段时间升级上去。CUDA请通过如下地址进行下载。

https://developer.nvidia.com/cuda-toolkit-70

默认安装完成CUDA后,安装包会自动设置环境变量,可以自行检查下是否有如下两条环境变量存在,如果没有请手动添加。

CUDA_PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0
CUDA_PATH_V7_0=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0

NVidia CUB 1.4.1

NVidia CUB这个一定要使用1.4.1版本,笔者尝试使用1.5.x版本但是没有成功过。有关CUB的相关资料可以通过如下链接获取:

http://nvlabs.github.io/cub/

NVidia CUB 1.4.1可以通过如下地址下载:

https://github.com/NVlabs/cub/archive/1.4.1.zip

下载后解压至一个地方然后设置环境变量CUB_PATH来指向CUB库。

CUB_PATH=c:\cub-1.4.1

NVidia CUDA Deep Neural Network library

cuDNN是NVidia特殊为深度神经网络所实现的一套算法库,目前主流的深度学习的工具包都或多或少的使用cuDNN来对学习以及训练过程进行加速。如需获取cuDNN,需要注册Nvida Accelerated-Computing的开发账户。cuDNN的官方主页如下:

https://developer.nvidia.com/cuDNN

CNTK的wiki上也给出了一个rc版本的下载地址,可以直接下载:

http://developer.download.nvidia.com/compute/redist/cudnn/v4/cudnn-7.0-win-x64-v4.0-rc.zip

解压后如同CUB一样,需要设定一个环境变量CUDNN_PATH用于指明cuDNN的路径。

CUDNN_PATH=C:\NVIDIA\cudnn-4.0\cuda

编译CNTK

在完成上述准备工作后,即可打开工程文件编译CNTK。
CNTK的编译有两种onlyCPU以及GPU(GPU就是普通的Debug或者Release的),根据情况,可以在Visual Studio中选择后,工程商点击鼠标右键后Build Project即可。
完整的build过程应该不会出现任何错误。笔者Rebuild了一下工程结果如下:

编译完成后可在C:\Users\liuxz\Git\CNTK\x64\Debug或者里找到执行程序。可以将该目录添加至PATH以便执行。

如果需要从Visual Studio中调试或者Ctrl+F5 执行的话,可以设置CNTK为启动工程,并属性->Debugging->配置运行的命令(Command Arguments)即可,可以参考如下格式。

configFile=$(SolutionDir)Examples\Other\Simple2d\Config\Simple.cntk RootDir=$(SolutionDir)Examples\Other\Simple2d currentDirectory=$(SolutionDir)Examples\Other\Simple2d

上面的内容是一行,有点长,针对于CNTK中提供的其他Sample,可自行修改路径并执行即可,建议第一次运行的时候使用Ctrl+F5 因为如果在Debug模式下训练网络,花费的时间真的十分的久。下图为执行结果。
CNTK从入门到深入研究(7) - 搭建CNTK开发环境_第2张图片

至此,CNTK开发环境搭建完成。

已知的问题及解决方案

使用CUDA 7.5

CNTK工程中,默认配置使用的都是CUDA 7.0版本,如果有一些需要使用CUDA 7.5,则需要手动修改配置文件。需要修改的地方有3点,都是在各个工程的.vcxproj文件中,可以使用类似NodePad++去做这种批量替换。

  1. cublas64_70.dll;cusparse64_70.dll;curand64_70.dll;cudart64_70.dll; 这几个dll的名称替换为cublas64_75.dll;cusparse64_75.dll;curand64_75.dll;cudart64_75.dll;
  2. 替换CUDA 7.0.targetsCUDA 7.5.targets

最后的修改情况可以参考下图:
CNTK从入门到深入研究(7) - 搭建CNTK开发环境_第3张图片

使用的是cuDNN v4.0 prod版本

有些可能使用的是v4.0 prod版本,如果是之前fork过的CNTK工程可能有编译报错的情况,主要因为cuDNN v4.0从rc到prod的改变中,修改了一个函数的原型,增加了几个参数。可以自行pull一下最新的CNTK工程,目前已经能够兼容rc以及prod两者。下面内容是节选的一段有关cuDNN升级的资料和原因。

UPDATES SINCE RELEASE CANDIDATE 
The API of cudnnBatchNormalizationBackward has been changed to include an additional set of scaling parameters (alphaParamsDiff and betaParamsDiff) applied to the dBnScaleResult and dBnBiasResult outputs of the function.
The prior restriction of batch size 512 in all Batch Normalization routines has been removed.
Numerical stability and performance of cudnnBatchNormalizationBackward in some cases has been improved.
Performance of cudnnConvolutionBackwardFilter when using Algo 1 has been improved for some cases. This code path now also requires a workspace.

运行时报错api-ms-win-core-path-l1-1-0.dll缺失

CNTK在2016-3-24前的几个版本中,由于混入了一些Win8特有的代码,会导致Win7下提示报错。这种情况下请pull下最新的CNTK工程,确保Source/Common/File.cpp 已经更新到Re commit because master is too old 这个commit。具体的修正情况可以参考下面的链接:

https://github.com/Microsoft/CNTK/pull/237

总结

本文作为CNTK从入门到深入研究的过度,讲解了如何部署CNTK开发环境等内容,读者应该可以正常的编译CNTK并研究其实现方法。笔者将继续的去研究CNTK的实现方法,有计划先从自定义的DataReader入手,希望能够为国内研究深度学习的学生或专家学者提供一些便利。

你可能感兴趣的:(机器学习,编译,环境搭建,深度学习,CNTK)