1. 程式人生 > >Win7配置theano+cuda8+cudnn實現gpu加速及遇到問題的解決方法

Win7配置theano+cuda8+cudnn實現gpu加速及遇到問題的解決方法

之前一直使用python2.7,但是最新的tensorflow官方教程(1.0版本)在Windows上只支援python3和CUDA8,所以解除安裝python2.7並重新安裝python3.6並配置theano和tensorflow,實現GPU加速。

Tensorflow、theano和Keras都是支援Python介面的。Keras和Tensorflow還有theano的關係如下:

Keras是對Tensorflow或者Theano的再次封裝,也就是以Tensorflow或Theano為後端,預設的後端是tensorflow,如果你想使用theano為後端,可以更改為theano。

Tesorflow

與theano是可以使用Nvidia GPU進行加速的。如果你的GPU支援CUDA,速度往往會快個10~20倍。

可以看到,gtx1060的計算能力媲美目前最厲害的gtx1080了,並且價錢只有他的1/3,於是就跟導師申請了一塊gtx1060。

1、電腦配置

我的實驗室電腦具體配置如下:

Win7,i7,記憶體16G,顯示卡GTX1060... 

以下在上述配置下實現GPU加速。

2、安裝Anaconda

中下載相應版本的anaconda安裝包.我電腦是64位的,故下載的64位的Python 3.6 version,直接安裝即可.我是安裝在C:\Anaconda3目錄下。

   安裝好Anaconda後,在cmd.exe(命令提示符)中輸入python命令檢視安裝結果。


可以看到,python3已結安裝好。

注意,最新版的tensorflow在Windows下面只支援python3和Cuda8。

3、安裝Theano

直接在cmd.exe中輸入命令:pip install theano,安裝成功後會在 C:\Anaconda\Lib\site-packages中出現於theano相關的兩個目錄。

Anaconda版本底下沒有MinGW包,這時可以:CMD輸入 condainstall mingw libpython, MinGW會自動裝到Anaconda下(C:\Anaconda3\MinGW)。

然後在 C:\Users\**\ 目錄(**指使用者名稱

)下新建.theanorc.txt檔案(注意檔名最前面有”.”,在檔案中配置如下:

[global]

openmp = False

[blas]

ldflags =

[gcc]

cxxflags = -IC:\Anaconda3\MinGW          #這裡是你安裝Mingw的位置

測試theano是否安裝好:只需開啟控制檯,然後輸入:python回車,再輸入import theano回車,若沒有其他錯誤資訊輸出這表明theano配置正確。如下圖


注意:我這裡由於已經配置好了CUDA,所以輸入import theano回車後有資訊輸出,在沒有配置CUDA之前,輸入import theano回車後是沒有資訊輸出的。

至此,大家就可以利用theano框架來編寫深度學習的程式碼,在CPU上面執行

4、C++環境安裝

C++環境的安裝,建議直接安裝一套微軟的Visual Studio環境,建議Visual Studio 2010或更高版本。我安裝的是Visual Studio 2013,能夠支援CUDA程式設計。不過MicrosoftVisual Studio 2013,這一版本的VS體積太過於龐大了,完全安裝後將近有10G+。如果大家不從事其他語言開發,可以考慮在安裝VS的時候只選擇C++,其他語言如VB,C#,F#都可以不用安裝(已試過,沒有任何問題,因為CUDA只需C++的支援),這樣就能夠減少硬碟的使用量。

在安裝VS2013時,會提示你安裝IE10,按照他提示的連結下載最新的IE11安裝即可再次安裝VS2013。

5、安裝cuda_8.0

選擇自己對應的版本下載Cuda8.0,然後一路安裝即可。

6、設定環境變數

安裝完畢後,在計算機上點右鍵,開啟屬性->高階系統設定->環境變數,可以看到系統中多了CUDA_PATH和CUDA_PATH_V8_0兩個環境變數,接下來,還要在系統中新增以下幾個環境變數: 
  CUDA_SDK_PATH = C:\ProgramData\NVIDIA Corporation\CUDASamples\v8.0 
  CUDA_LIB_PATH = %CUDA_PATH%\lib\x64 
  CUDA_BIN_PATH = %CUDA_PATH%\bin 
  CUDA_SDK_BIN_PATH = %CUDA_SDK_PATH%\bin\win64 
CUDA_SDK_LIB_PATH =%CUDA_SDK_PATH%\common\lib\x64 
我的安裝路徑是預設的,所以新增的路徑分別是下面這樣的: 
CUDA_PATH 
C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v8.0 
CUDA_PATH_V8_0 
C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v8.0 
CUDA_SDK_PATH 
C:\ProgramData\NVIDIA Corporation\CUDASamples\v8.0 
CUDA_LIB_PATH 
C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v8.0\lib\x64 
CUDA_BIN_PATH 
C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v8.0\bin 
CUDA_SDK_BIN_PATH 
C:\ProgramData\NVIDIA Corporation\CUDASamples\v8.0\bin\win64 
CUDA_SDK_LIB_PATH 
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v8.0\common\lib\x64 
然後,在系統變數 PATH 的末尾新增: 
 ;%CUDA_LIB_PATH%;%CUDA_BIN_PATH%;%CUDA_SDK_LIB_PATH%;%CUDA_SDK_BIN_PATH%; 
;C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v8.0\lib\x64;C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v8.0\bin;C:\ProgramData\NVIDIA Corporation\CUDASamples\v8.0\common\lib\x64;C:\ProgramData\NVIDIA Corporation\CUDASamples\v8.0\bin\win64; 
重新啟動計算機。 
至此,cuda的安裝就搞定了。

檢查是否安裝正確。在安裝結束後,你會發現在系統環境裡面新添加了兩個環境變數:CUDA_PATH_V8_0和CUDA_PATH。

現在,開啟cmd控制檯命令列,輸入命令nvcc –V回車(注意是大寫V喲)就可以參考版本資訊,如果安裝正確則出現圖4所示的結果。


7、監測cuda安裝成功與否

這個步驟用到兩個東西,都是cuda為我們準備好的:deviceQuery.exe 和 bandwithTest.exe 
首先啟動cmd DOS命令視窗,預設進來的是c:\users\Admistrator>路徑,輸入 cd .. 兩次,來到c:目錄下 。找到安裝的cuda資料夾。 我電腦上該檔案的路徑:C:\Program Files\NVIDIA GPUComputing Toolkit\CUDA\v8.0\extras\demo_suite。直接執行bandwidthTest.exe :


Rsult=PASS及說明,都通過了。如果Rsult=Fail 那不好意思,重新安裝吧。

不要在環境變數新增PYTHONPATH變數,否則容易在import theano後出現configparser找不到或沒有這個元件這個問題(在我這裡是這樣的);

8、安裝cudnn

到網上搜索cudnn下載下來(官網下載要註冊才行)。將下載來的檔案解壓,解壓出cuda資料夾,裡面包含3個資料夾。將設三個資料夾替換掉系統裡面的對應檔案,進行覆蓋替換即可。C:\ProgramFiles\NVIDIA GPU Computing Toolkit\CUDA\v8.0

覆蓋掉後面匯入theano時會就不會出現CuDNN not available提示了。
最後是這樣的Using gpu device 0: GeForce GTX 1060 3GB (CNMeMis enabled with initial size: 80.0% of memory, cuDNN 5110)



發現有警告,解決方法參考後面問題處理。

9、測試GPU加速

執行以下測試程式碼:

# -*- coding: utf-8 -*-
"""
Created on Mon Mar 13 09:31:19 2017

@author: RL.King
"""

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 = 10000
 
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 ('My lab computer used the cpu')
else:
    print ('My lab computer with high efficiency used the gpu')

下面三個測試分別是cpu執行,安裝Cuda進行GPU加速執行,安裝cuDNN執行的結果:

使用上述測試程式碼,以上結果分別是測試程式碼在cpu執行,cuda加速和cudnn加速結果,發現gpu上執行提升45.6倍!!!

10、出現的問題以及解決方法

1、不要在環境變數新增PYTHONPATH變數,否則容易在import theano後出現configparser找不到或沒有這個元件這個問題(在我這裡是這樣的)。

2以下報錯:


由於我是解除安裝了之前的python2再安裝python3,所以把原來的環境變數中Anaconda的相關刪除即可。

3、以下報錯:


測試theano。開啟命令列,輸入python,在輸入importtheano,如果出現UnicodeDecodeError:'utf-8' codec can't decode byte 0xd5 in position 11: invalid continuation byte這種編碼問題,這是因為掉用nvcc返回的字串是使用的cwindows預設的預設編碼,按照提示路徑,直接找到theano中對應的報錯檔案,把原始碼出錯的地方改為 *.decode("GBK")就可以。比如我的是在theano\compact下的__init__.py出現的編碼問題,則修改為:



4、以下報錯


這裡提示警告,我的cuDNN版本過高,目前安裝的theano只支援到5版本的,而我是5.1版本的,要麼升級theano要麼降級cuDNN.

這裡選擇安裝cuDNN5,後來發現還是會有警告,雖然不影響實際使用,可以通過升級theano版本得到解決:
可以看到,更新之後還存在警告,提示cuda後端不可用了,要使用gpuarray後端。
可以看到,theano和cuda支援並不好,在我寢室的cuda7.5就未出現這樣的警告。
5、
排除上面的問題後,發現執行EEG程式會報錯:
…puDn ConvDesc{border_mode='half', subsample=(1, 1), conv mode='conv', precision='float32'}(MakeVector{dtype='int64'}.0, MakeVector{dtype='int64'}.0)…
這裡根本Google不到解決方案,感覺還是因為theano和cudnn版本的問題,發現安裝cudnn4後問題得到解決!