本篇文章介绍如何安装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.0\VC\bin

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:\msys64\mingw64\bin
D:\msys64\mingw64\lib


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 Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0

安装好后将底下路径也加入系统的环境变量path ,这样在命令视窗才找得到nvcc。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\libnvvp


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.3Qt5\python-3.5.2.amd64\lib\site-packages\keras\backend\tensorflow_backend.py", line 1, in 
    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.3Qt5\settings\.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.3Qt5\settings
并非C:\Users\使用者名称xxxx
这点请注意,所以接下来对于theano的设定档.theanorc.txt
也应放置于D:\WinPython-64bit-3.5.2.3Qt5\settings 目录下


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.3Qt5\python-3.5.2.amd64\libs
--compiler_bindir=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

可能Error 1:
接着试着在winpython环境里打上python
>>import theano
如果有跑出一大串行号及C++ code 就表示有error发生,如果发生底下error
{
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\lazylinker_ext\mod.cpp:1:0: sorry, unimplemented: 64-bit mode not compiled in
 #include 
 ^
...
}
可以试着下面解法:
开启在你winpython 目录下的D:\WinPython-64bit-3.5.2.3Qt5\scripts\env.bat
修改底下path 设定红色部分,也就是加入G++ x64的环境设定
实际上Vs2015/Nvcc 的路径也都可以直接改在如下
这样你的winpython环境也都是认得到。


#=====env.bat=============
if %ERRORLEVEL% NEQ 0 set PATH=D:\msys64\mingw64\lib;D:\msys64\mingw64\bin;%WINPYDIR%\Lib\site-packages\PyQt5;%WINPYDIR%\Lib\site-packages\PyQt4;%WINPYDIR%\;%WINPYDIR%\DLLs;%WINPYDIR%\Scripts;%WINPYDIR%\..\tools;%WINPYDIR%\..\tools\mingw32\bin;%WINPYDIR%\..\tools\R\bin\x64;%WINPYDIR%\..\tools\Julia\bin;%PATH%;

#}


可能Error 2:
如果出现以下error
{
 64_Family_6_Model_94_Stepping_3_GenuineIntel-3.5.2-64\lazylinker_ext\mod.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.0\VC\INCLUDE\crtdefs.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 Kits\10\Include\10.0.14393.0\ucrt
LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.14393.0\um\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\x64

可能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 Kits\10\Lib\10.0.14393.0\um\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.14393.0\ucrt\x64

注意:有更改到系统环境变量都须重新登入或是重开机才会生效


最后再执行一次
在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


[2017/01/14更新] Tensorflow 已可安装在Windows 上并可使用GPU运算加速

如果上述步骤都安装成功,那么额外再安装Tensorflow 只要按照官网以下的指令即可安装
Tensorflow 成功,并使用GPU运算

pip install --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-0.12.1-cp35-cp35m-win_amd64.whl


[2017/01/15更新] 如果遇到以下错误
"can not opened CUDA library cupti64_80.dll locally"
试着将以下路径加入系统环境变量PATH
 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\extras\CUPTI\libx64

因此Keras 也可以改成Tensorflow 当backend。下图即是用keras 的范例用Tensorflow当backend
来验证安装是否成功。从下图也可以看出可以成功的使用GPU CUDA

[2017/03/23更新]
更新至Tensorflow R1.0 ,只须执行下列指令
pip3 install --upgrade tensorflow-gpu

必须下载及更新Numpy+mlk,否则上述指令会让Numpy会失去MLK。
http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy  
更新Kears2.0 :
先用pip uninstall keras  卸载旧的keras
再到底下网址直接下载Keras-2.0.2.tar.gz (md5)
https://pypi.python.org/pypi/Keras

解压缩档案后:
在解压缩的资料夹里执行:
python setup.py install

测试Tensorflow 及keras version。

(本文已经授作者阿星授权,阿星原文:http://arbu00.blogspot.jp/2017/01/1-windowstheano-keras-gpu.html?m=1)