第1课:Theano与CUDA的windows安装

Theano是深度学习的一个框架
linux安装很简单,windows安装稍微复杂点,
同时考虑到一般用户都没有linux服务器,即使有,也未必能用GPU,这里以windows安装为例来说明大体的安装流程

安装条件:
1. win7 (32和64都可以,下载安装包时一定要选择对应的)
2. vs2010(不一定非要是vs2010,应该是配置GPU编程时需要用到vs的编译器)
3. Anaconda(Anaconda是python的科学计算版本,之所以选择它是因为它内置了python,以及numpy、scipy两个必要库以及一些其他库,比起自己安装要省事)

安装流程:
1.安装Anaconda,因为是图形界面安装,这里不多说,安装目录我用 D:\Anaconda 
2.安装MinGw
[1]. 打开CMD(注意是windows命令提示符)
[2]. 输入conda install mingw libpython,然后回车,会出现安装进度,稍等片刻即可安装完毕。此时就有D:\Anaconda\MinGw目录了
3.配置环境变量
[1]. 添加环境变量。打开控制面板,在搜索栏输入"environ"再点编辑账户的环境变量,编辑用户变量中的path变量(如果没有就新建一个),在后边追加D:\Anaconda;D:\Anaconda\Scripts; 不要漏掉分号,此处因为我的Anaconda的安装目录是D:\Anaconda,此处需要根据自己的安装目录填写。
[2]. 在用户变量中新建变量pythonpath,变量值为D:\Anaconda\Lib\site-packages\theano; 此处指明安装的theano的目录是哪
4.进入cmd,用"fsutil file createnew theanorc.txt 0"创建文本,文本内容如下:
[global]
openmp=False
[blas]
ldflags= 
[gcc] 
cxxflags = -ID:\Anaconda\MinGW
5.安装Theano
cmd进入命令行,不用进入python直接输入
pip install theano安装即可,如果没有pip命令,可以用conda install pip安装
在cmd中,输入python 进入到python环境下,然后先输入import theano回车
继续输入theano.test(),没有error就说明安装成功了
验证BLAS是否安装成功。由于numpy是依赖BLAS的,如果BLAS没有安装成功,虽然numpy亦可以安装,但是无法使用BLAS的加速。验证numpy是否真的成功依赖BLAS编译,用以下代码试验: 
>>> import numpy 
>>> id(numpy.dot) == id(numpy.core.multiarray.dot) 
False 
结果为False表示成功依赖了BLAS加速,如果是Ture则表示用的是python自己的实现并没有加速

安装好之后接下来我们讲CUDA的安装
为什么需要CUDA?因为用CPU来处理图像之类的弱爆了,想用GPU加速就要装CUDA

安装流程:
1.先检查自己的显卡是否支持CUDA,不支持就别费劲了
查看自己显卡的方式:选中计算机--> 右键属性 --> 设备管理器 --> 显示适配器:NVIDIA GeForce 900
显卡如果不是NVIDIA的,就没戏了,即使是,还要到网站上查查自己的型号是否支持
检查网址:https://developer.nvidia.com/cuda-gpus,注意选择笔记本还是台式机,大部分坑爹的一体机其实是算笔记本的

2.下载VS2010,不推荐用VS2015,很多东西还没做到兼容,可能是太新了,以后会好点吧
安装VS2010

3.下载CUDA
https://developer.nvidia.com/cuda-downloads
这里是CUDA的下载地址,注意选择正确的版本
安装CUDA,图形界面,没什么好说的,默认路径安装就好,只有一点,注意安装的时候选择自定义安装,里面的模块全部选上

4.验证是否安装成功
进入C:\Program Files\NVIDIA Corporation\Installer2\CUDASamples_7.0.{D4F8CD18-6F4B-4742-843C-B4262B4AACB3}\bin\win64\Release
看到一个deviceQuery程序,双击能正常执行就证明成功了,如果没有,很有可能你的机器不支持GPU

python判断是否使用GPU代码
from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time

vlen = 10 * 30 * 768  # 10 x #cores x # threads per core
iters = 1000

rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print (f.maker.fgraph.toposort())
t0 = time.time()
for i in range(iters):
    r = f()
t1 = time.time()
print ('Looping %d times took' % iters, t1 - t0, 'seconds')
print ('Result is', r)
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
    print ('Used the cpu')
else:
    print ('Used the gpu')