今天开始,Lady向各位介绍一个朋友阿星(Ashing)以及他的机器学习读书笔记!
阿星也是我们手撕深度学习算法微信群的热心群友!接下来,Lady我也会陆续分享这个微信群里大家讨论的话题。
本篇文章介绍如何安装Theano 及Keras, Tensorflow深度学习的框架在windows环境上,并快速的使用Keras的内建范例来执行人工神经网络的训练。
之前也有实作Tensorflow 及caffe在VM ubuntu16.04环境安装的经验,甚至安装在NVIDIA的Jetson TX1 的惨痛经验XD(虽然后来也是有安装成功)。各深度学习的框架各有它的优缺点,有许多文章已做过类似的分析,在此我不会对这部分着墨太多,只会叙述自己之前安装的一些经验来提供大家参考,特别如果是要在windows环境上使用,并且具有NVIDIA CUDA支援GPU加速运算的功能。
虽然也很多人认为应该直接使用Linux环境会比较适合做深度学习框架的使用及学习,原因是使用Linux的人或网络资源比较多,而且Linux对于计算机硬件效能有优化。但对于Linux环境不熟的人,使用windows环境仍然有它方便性存在,而对于Python程序语言来说,其程序码在Linux环境或windows环境做切换是很容易的,当然Theano ,Keras,Tensorflow也可以安装在Linux环境上使用。接下来开始正式介绍如何在一般常见的笔电上建构这个环境,在一般的笔电上也可以使用GPU加速训练人工神经网络的快感。
<图一>为Keras 的lstm_benchmark.py 范例输出结果
首先我使用的笔电硬件是:
Intel CPU i7-6700HQ 存储器DDR3 8GB. NVIDIA 950M 另一台笔电硬件是: Intel CPU i5 5200U 存储器DDR3 8GB. NVIDIA 940M 使用GPU加速及CUDA ,NVIDIA 的显卡仍然是必备,但是实际上测试最一般般常见 的940M ,950M显卡也可以使用,并且实测上其执行效能仍然快过单单使用CPU快很多 ,底下安装好后我们会使用Theano提供的程序来做测试及比较。 接下来是软件环境的建构,大部分步骤其实是没有先后顺序之分的,例如先安装python 或是VS2015 ,只有少数步骤有先后顺序上的建议。底下是我的安装步骤。 1.安装Python 环境: 选择Anaconda或是Winpython都可以,实际上我都试过,而最后我是在Winpython上安装成功,这并不代表Anacona不行,只是刚好在Winpython上装成功就没再花心思在Anaconda上做Debug。重点是要使用x64 python 勿使用x86版本,原因是CUDA 的CUBLAS.lib只适用于x64版本,如果使用x86版本会遇到CUBLAS.lib 的相关error. Winpython下载路径:https://winpython.github.io/ 在此我是选择安装:WinPython-64bit-3.5.2.3Qt5.exe 3.5.2版带有Qt5的,因为平时也有用到Qt5,所以就一起安装这并不影响后续安装。 2.安装VS2015 update 3: 现在VS2015已有免费的社群版,然而我安装的另外从网络上下载的VS2015 pro update3 英文版。这边建议要安装英文版勿安装中文版,原因是先前遇过vs2015在编译CUDA时候遇到Unicode编码的问题,所以就干脆安装英文版。而如果直接安装社群版,MS会根据你的OS 环境语系自动选择则中文版。在windows环境里,VS2015会是用来编译CUDA的工具。 我安装的Windows环境是Windows 10,并且它自己已经明目张胆,大摇大摆,无视你的存在的更新到10.0.14393.0了(XD)。 安装后须将底下路径加入系统的环境变量path ,这样在命令视窗才找得到cl.exe。 C:Program Files (x86)Microsoft Visual Studio 14.0VCbin 3.安装GCC: 在windows 要安装GCC 可以使用MSYS2,有关MSYS2的安装请看底下连结: 写得非常清楚了,也不难安装,在此选择x86_x64版本可以安装的指定的D:或预设C:下。 https://shaochien.gitbooks.io/how-to-use-gcc-to-develop-c-cpp-on-windows/content/shell-select-and-install-gcc.html 安装后须将底下路径加入系统的环境变量path ,这样在命令视窗才找得到gcc或g 。 D:msys64mingw64bin D:msys64mingw64lib 4.安装CUDA 及CuDNN: CUDA 下载网址:https://developer.nvidia.com/cuda-downloads 选择CUDA 8.0 for Win 10 x64版本 CuDNN 下载网址:https://developer.nvidia.com/cudnn
请选择对应到CUDA 8.0的版本。 需注册(免费)才能下载CuDNN,非必要但是CuDNN并不难安装,只需要解压缩CuDNN档案 然后将里面bin/lib/include/的档案都copy到CUDA安装后对应的bin/lib/include/资料夹即可。 CUDA 0 安装成功预设路径应如同底下(请勿自行更改路径) C:Program FilesNVIDIA GPU Computing ToolkitCUDAv8.0 安装好后将底下路径也加入系统的环境变量path ,这样在命令视窗才找得到nvcc。 C:Program FilesNVIDIA GPU Computing ToolkitCUDAv8.0bin C:Program FilesNVIDIA GPU Computing ToolkitCUDAv8.0libnvvp 5.安装Theano 及Keras: 实际上当安装好Winpython时已经同时包含Theano 及Keras了。可以不用再安装。 预设Theano 版本是0.8.2,Keras 是1.1.1。 如果需update theano,或 keras到最新版1.2.0 可以执行以下指令 pip install --upgrade Theano pip install --upgrade keras 注意:一但你执行上述指令它会自动 Uninstalling numpy-1.11.2 mkl: 原因是pip自动搜寻到更新的 numpy-1.11.3-cp35-none-win_amd64.whl版本 但是这numpy版本并不带mkl涵式库,但这对Theano ,keras是必要的。 所以可以到底下连结重新下载新的numpy-1.12.0rc2 mkl-cp35-cp35m-win_amd64.whl
http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
然后在你的winpython的环境下执行底下重新安装即可 pip install numpy-1.12.0rc2 mkl-cp35-cp35m-win_amd64.whl 请注意选择你所需要的版本。numpy-1.12.0rc2是目前最新的。 cp35 for python 3.5.2版 win_amd64 for x64 6.更改.theanorc.txt 及keras.json: A.更改keras.json: 以上安装好之后,你可以先试着在winpython环境里打上python >>import keras 应该会出现以下error, { File "D:WinPython-64bit-3.5.2.3Qt5python-3.5.2.amd64libsite-packageskerasbackendtensorflow_backend.py", line 1, in <module> import tensorflow as tf ImportError: No module named 'tensorflow' ... } 原因是Keras可以用tensorflow 或theano 当backend,预设是tensorflow 这时我需将它改成使用theano 当backend。请到你winpython安装目录下的setting里 经过上述的执行应该会产生一个keras.json档在 D:WinPython-64bit-3.5.2.3Qt5settings.keras 请将底下原本tensorflow改成theano,即可完成转换backend到theano。 ##=======keras.json档 { "epsilon": 1e-07, "image_dim_ordering": "tf", "floatx": "float32", - "backend": "Tensorflow" "backend": "theano" } P.S *.1 -号为移除该行, 号为增加该行,-, 号都不该出现在实际档案里。 *.2 我的winpython 预设安装路径为D:WinPython-64bit-3.5.2.3Qt5 *.3 对于winpython 环境而言的/Home目录是预设在 D:WinPython-64bit-3.5.2.3Qt5settings 并非C:Users使用者名称xxxx 这点请注意,所以接下来对于theano的设定档.theanorc.txt 也应放置于D:WinPython-64bit-3.5.2.3Qt5settings 目录下 B.更改.theanorc.txt: 请参考底下.theanorc.txt更改 device = gpu #指的是预设切换到使用GPU floatX = float32 #for GPU 都是float32 ,for CPU 可以有float64 ##===.theanorc.txt档for GPU [global] openmp=False device = gpu optimizer_including=cudnn floatX = float32 allow_input_downcast=True [lib] cnmem = 0.8 [blas] ldflags= [gcc] cxxflags = -D_hypot=hypot [nvcc] fastmath = True --flags=-LD:WinPython-64bit-3.5.2.3Qt5python-3.5.2.amd64libs --compiler_bindir=C:Program Files (x86)Microsoft Visual Studio 14.0VCbin 可能Error 1: 接着试着在winpython环境里打上python >>import theano 如果有跑出一大串行号及C code 就表示有error发生,如果发生底下error { C:UsersshingAppDataLocalTheanocompiledir_Windows-10-10.0.10586-SP0-Intel64_Family_6_Model_94_Stepping_3_GenuineIntel-3.5.2-64lazylinker_extmod.cpp:1:0: sorry, unimplemented: 64-bit mode not compiled in #include <Python.h> ^ ... } 可以试着下面解法: 开启在你winpython 目录下的D:WinPython-64bit-3.5.2.3Qt5scriptsenv.bat 修改底下path 设定红色部分,也就是加入G x64的环境设定 实际上Vs2015/Nvcc 的路径也都可以直接改在如下 这样你的winpython环境也都是认得到。 #=====env.bat============= if %ERRORLEVEL% NEQ 0 set PATH=D:msys64mingw64lib;D:msys64mingw64bin;%WINPYDIR%Libsite-packagesPyQt5;%WINPYDIR%Libsite-packagesPyQt4;%WINPYDIR%;%WINPYDIR%DLLs;%WINPYDIR%Scripts;%WINPYDIR%..tools;%WINPYDIR%..toolsmingw32bin;%WINPYDIR%..toolsRbinx64;%WINPYDIR%..toolsJuliabin;%PATH%;
#}
可能Error 2: 如果出现以下error { 64_Family_6_Model_94_Stepping_3_GenuineIntel-3.5.2-64lazylinker_extmod.cpp:1: D:/msys64/mingw64/include/c /6.2.0/cmath:1133:11: error: '::hypot' has not been declared using ::hypot; } ^~~~~ 请检查.theanorc.txt里有无底下宣告 [gcc] cxxflags = -D_hypot=hypot 可能Error 3: 接着试着在winpython环境里再打上python >>import theano 如果出现以下error { C:Program Files (x86)Microsoft Visual Studio 14.0VCINCLUDEcrtdefs.h(10): fatal error C1083: Cannot open include file: 'corecrt.h': No such file or directory } 必须新增底下到系统的环境变量里,原因是他会用到Windows Kits里的函式,不只VS2015 所也必须宣告进去。 INCLUDE=C:Program Files (x86)Windows Kits10Include10.0.14393.0ucrt LIB=C:Program Files (x86)Windows Kits10Lib10.0.14393.0umx64;C:Program Files (x86)Windows Kits10Lib10.0.10240.0ucrtx64 可能Error 4: 接着如果出现以下error { mod.cu(803): warning C4311: 'type cast': pointer truncation from 'CudaNdarray *' to 'long' mod.cu(3374): warning C4312: 'type cast': conversion from 'long' to 'float *' of greater size LINK : fatal error LNK1104: cannot open file 'uuid.lib' } 增加底下到系统的环境变量path里。 C:Program Files (x86)Windows Kits10Lib10.0.14393.0umx64 C:Program Files (x86)Windows Kits10Lib10.0.14393.0ucrtx64 注意:有更改到系统环境变量都须重新登入或是重开机才会生效 最后再执行一次 在winpython环境里再打上python >>import theano 如果最后出现底下DEBUG字符串,恭喜!代表安装Theano run with GPU成功了 { DEBUG: nvcc STDOUT mod.cu Creating library C:/Users/shing/AppData/Local/Theano/compiledir_Windows-10-10.0.10586-SP0-Intel64_Family_6_Model_94_Stepping_3_GenuineIntel-3.5.2-64/tmp1qux40n6/md9b7b5ef5d727b2e8e3d2cc34bb9d0eb.lib and object C:/Users/shing/AppData/Local/Theano/compiledir_Windows-10-10.0.10586-SP0-Intel64_Family_6_Model_94_Stepping_3_GenuineIntel-3.5.2-64/tmp1qux40n6/md9b7b5ef5d727b2e8e3d2cc34bb9d0eb.exp
}
接着再打上python >>> import keras Using Theano backend. 以上也代表Keras也可以正常的工作,并且可以Base on Theano run with GPU。 接下来我们可以跑一些sample code来实际测试效能。 Theano实际测试: 首先我们在Theano的官网上可以发现有两个测试GPU的sample code:
http://deeplearning.net/software/theano/tutorial/using_gpu.html 我们就来实际跑看看使用CPU及GPU的差别。 如果在winpython想切回使用CPU跑,可以将.theanorc.txt 换成底下 ##===.theanorc.txt for CPU [global] openmp=True device = cpu floatX = float64 allow_input_downcast=True [gcc] cxxflags = -D_hypot=hypot
第一个程序theano1.py a.使用Intel CPU i7-6700HQ ,约2.488sec
b.使用GPU 950M 约0.4176 sec ,快了大约6倍。使用940M约0.9秒
第二个程序theano_gpu.py a.使用Intel CPU i7-6700HQ ,约3.019 sec
b.使用GPU 950M 只需0.012 sec ,快了大约250倍。使用940M约0.015秒。
第二支程序与第一支程序的差异在于,第一个程序是函数将直接其结果作为NumPy ndarray返回,为了方便,该函数已从设备复制到主机。而第二个程序是将输入从主机复制到GPU,并且优化exp()function的执行。 f = function([], sandbox.cuda.basic_ops.gpu_from_host(T.exp(x))) Keras实际测试: 首先我们先download keras 的examples. 直接使用git clone 的方式在命令视窗下执行,前提是已经有安装了git tool. git clone https://github.com/fchollet/keras.git 切到keras的examples 目录 cd keras/examples/ 该目录下有很多已建好的范例可以直接使用,并且都是python 的程序 Keras优点是其模块本身都可以使用Python程序语法自由组建,与caffe不同 使用caffe必须使用它定义类似Json的文档去建构网络架构。这会让你感觉不象是在写 python的程序。 首先直接先执行底下MLP网络范例试看看 python mnist_mlp.py 执行后一开始会出现很多底下DEBUG信息,这并不是错误,暂时可以不用管它,他会继续跑。 [2017/01/14更新] 用以下指令更新Theano 就不会出现DEBUG 信息了 pip install --upgrade --no-deps git git://github.com/Theano/Theano.git
执行过程及结果如下:60000笔训练资料及10000笔测试资料,Epoch 20,得到accuracy 0.9843 这个使用950M跑的过程不到10分钟,之前用纯CPU跑约1个多小时应该有。
接下来再来跑一个大一点的范例试看看
python lstm_benchmark.py 一开始都会自动先下载data,这范例的data量很明显比刚刚大多了,到此可以先去喝杯咖啡~
经过多久没仔细计算,底下是跑出来的结果
如果有兴趣安装Pycuda ,也只要执行以下指令即可安装成功及使用,因为 CUDA在之前都已经安装成功了 pip install pycuda