因為之後要弄深度學習方面的東西,是以這幾天把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)