因为之后要弄深度学习方面的东西,所以这几天把theano的开发环境搭建了下,原本以为很简单,但实际安装的时候,由于自己电脑之前装过一些东西产生了干扰,几乎把网上所有的教程参考了一遍,足足折腾了三天才真正完整地安装好,实现了GPU加速。
安装环境
- 64位win7系统,显卡:GT 720;
- Visual Studio 2013 ;
- 因为用的师兄传下来的电脑,已经安装了CUDA,所以此处不会讲到CUDA的安装,具体安装可以参考其他博客。
1.安装Anaconda
因为Anaconda中集成了很多python的库,一些常用的库基本都在里面,所以通过安装Anaconda来搭建theano的环境是最方便的,而且网上关于这个的资料也是最多的。
我选择的Anaconda版本是Windows64位python2.7,Anaconda2-4.1.1-Windows-x86_64.exe。下载之后直接安装即可,建议下载之前最好把以前装过的python卸载了,不然后面装其他东西的时候会产生干扰!路径可以自己选择,我的路径是D:\Anaconda2。Anaconda安装完成后会自动添加环境变量。(如果你在安装过程中除了改路径其他都是默认安装的话)
下载地址:https://www.continuum.io/downloads
2.安装mingw
这里有巨坑!
- 安装完Anaconda之后,打开cmd,直接输入Anaconda的安装命令
conda install mingw libpython
- 安装成功之后,Anaconda文件夹下就会出现MinGW文件夹。然后需要手动添加环境变量,在path下添加“D:\Anaconda2\MinGW\bin;D:\Anaconda2\MinGW\x86_64-w64-mingw32\lib;”这两个路径。
这一步一般不会出错,但是很坑的一个就是,如果你之前装过mingw,而且还配置了环境变量的话,会和这Anaconda下安装的MinGW产生冲突,导致在安装theano的时候看似安装成功了,一import theano就出现各种奇怪的字符,或者说不能import theano中的gof,然而明明在theano下又能找到gof文件,陷入这种崩溃的局面,我当初就是被这个问题坑的不行。
3.安装theano
- 通过cmd直接输入
pip install theano
这是最简单的方法,看到有教程说是可以自己单独下载再解压,那种麻烦不说,而且据说会产生各种问题。
安装成功之后,需要添加theano的环境变量,新建一个“PYTHONPATH”的变量,路径设置为“D:\Anaconda2\Lib\site-packages\theano;”
需要说明的是,这些环境变量都要根据实际文件夹所在位置来写,在设置之前最好先看看是否存在这个文件夹。
4.设置.theanorc.txt 文件
在你打开cmd命令行窗口的时候会显示一个路径(通常为“C:\Users\Administrator”),在这个路径下新建一个.theanorc.txt 文件,在其中输入:
[global]
device = gpu
floatX = float32
openmp=False
[blas]
ldflags =
[gcc]
cxxflags = -ID:\Anaconda2\MinGW
[nvcc]
fastmath = True
flags = -LD:\Anaconda2\libs
compiler_bindir = D:/zj/zj-study/vs2013/program/VC/bin
[lib]
cnmem=1
由于CPU模式网上很多教程都已经讲过了,我这里直接贴出我的GPU模式下的.theanorc.txt 。
这里需要注意的是最后一个“[lib] cnmem=1”,如果不加这一条,在测试的时候,输入import theano 会显示:Using gpu device 0: GeForce GT 720(CNMeM is disabled,CuDNN not available),而加了这一条之后会显示:Using gpu device 0: GeForce GT 720 (CNMeM is enabled with initial size: 95.0% of memory, CuDNN not available)
然后重启电脑。
5.测试
首先在cmd命令行输入
python
import theano
如果安装成功的话,会显示Using gpu device 0: GeForce GT 720 (CNMeM is enabled with initial size: 95.0% of memory, CuDNN not available),没有其他的报错什么的。
打开Spyder,这是Anaconda集成的一个IDE(直接在开始菜单栏那可能点了没有反应,不行的话得去Spyder的路径下打开:D:\Anaconda2\Scripts)。
在里面运行以下代码:
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')
如果输出结果显示是GPU,那么OK,已经实现了GPU加速了,但是我在这显示的是CPU,因为我的电脑上虽然装了CUDA,却并没有装cudnn,在官网上下载cudnn的包,将生成的bin,include,lib下的文件分别拷贝到CUDA对应的文件下,这时再运行上面这个程序应该就会显示是GPU了。
另外还有一个关于blas加速的测试:
import numpy
id(numpy.dot) == id(numpy.core.multiarray.dot)
如果结果为False,表示成功依赖了BLAS加速,如果是TRUE则表示用的是python自己的实现,并没有加速。
我重装了很多次,每一次输出结果都是true,身边的同学安装后测试的时候显示的也是true,后面发现这好像有一个专门的模块,
应该是没有添加这个模块的缘故,可能按照网上的方法安装下来的theano环境blas测试应该都是true。
参考
http://blog.csdn.net/churximi/article/details/51627849
https://groups.google.com/forum/#!topic/theano-users/qWeDhMVQy0I
http://www.cnblogs.com/hanahimi/p/4127026.html
另外还有很多,这里就不一一列举了。
这里贴一张最后的结果图
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISO1kDO1QzM5EjNycDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)