1. 程式人生 > >我的AI之路(5)--如何選擇和正確安裝跟Tensorflow版本對應的CUDA和cuDNN版本

我的AI之路(5)--如何選擇和正確安裝跟Tensorflow版本對應的CUDA和cuDNN版本

   這個問題曾讓我折騰了一天半,真是個大坑啊敲打,反覆把Tensorflow和CUDA裝了卸,卸了又裝,然後測試,遇到一個又一個錯誤,週六晚上弄到凌晨三點可憐,週日上午繼續幹,終於在週日中午搞定,現在對這個問題弄得比較透徹了得意

   每安裝某一個Tensorflow版本時該安裝什麼對應版本的cuda和cudnn呢?Tensorflow沒有提供明確的提示,我買的多本關於tensorflow的書裡都只說作者安裝的什麼版本,根本沒說Tensorflow版本和使用的CUDA、cuDNN版本的對應關係,網上也沒找到這樣的文章,所以像我這樣喜歡嚐鮮偷笑總是安裝最新版Tensorflow 1.8 而不是書上說的版本的就得自己琢磨解決GPU版tensorflow安裝後使用時出現的錯誤了。

    在解決tensorflow報錯問題的過程中我注意到https://github.com/tensorflow/tensorflow/releases提供了Tensorflow個版本的releases notes,在裡面搜尋cuda,可以看到在Tensorflow 1.6版裡有個大的改動:

Release 1.6.0

Breaking Changes

  • Prebuilt binaries are now built against CUDA 9.0 and cuDNN 7.
  • Prebuilt binaries will use AVX instructions. This may break TF on older CPUs

這表明Tensorflow1.6開始使用CUDA9.0+cuDNN7。

    另外還有一個快捷辦法,通過檢視tensorflow的原始碼build_info.py知道其使用的CUDA和cuDNN版本(我在import tensorflow出錯後,根據出錯資訊,閱讀琢磨出錯的.py程式碼檔案,跟呼叫關係找到的這個定義版本資訊的檔案,以前的老版本tensorflow似乎沒有這個檔案,版本資訊都是寫死在初始化的.py原始碼裡,需要搜尋初始化程式碼找到檢查cuda版本地方):

   假設tensorflow安裝在D:\Anaconda3\envs\tensorflow環境裡,那麼開啟D:\Anaconda3\envs\tensorflow\Lib\site-packages\tensorflow\python\platform\build_info.py

這個檔案,可以看到使用的CUDA 9.0和cuDNN 7:

    msvcp_dll_name = 'msvcp140.dll'
    cudart_dll_name = 'cudart64_90.dll'
    cuda_version_number = '9.0'
    nvcuda_dll_name = 'nvcuda.dll'
    cudnn_dll_name = 'cudnn64_7.dll'
    cudnn_version_number = '7'

   這裡的msvcp140.dll應該在C:\Windows\System32\下面,是通過安裝vc 2005 redistribute提供的,nvcuda.dll也是在C:\Windows\System32\下面,cudart64_90.dll則是安裝CUDA 9.0時產生的cudnn64_7.dll是安裝cuDNN 7時產生的,任何一個檔案缺失或沒加入搜尋路徑都有可能引起tensorflow在import時報ImportError錯。

最新的Tensorflow 1.9.0 剛剛釋出了Tensorflow 1.9仍然使用的CUDA9.0,所以安裝CUDA9.0一兩年內都是妥妥的正確選擇!

   CUDA在https://developer.nvidia.com/cuda-downloads這裡下載,開啟頁面後不要在這個頁面裡下載,因為這個頁面下載的是CUDA9.2,版本太高了跟tensorflow1.8不匹配,而是應該後點擊Legacy Releases按鈕進入archive頁面https://developer.nvidia.com/cuda-toolkit-archive,然後點選CUDA Tookit 9.0進入CUDA 9.0的下載頁面https://developer.nvidia.com/cuda-90-download-archive,根據自己機器環境選擇作業系統和版本及位數點選相應按鈕做選擇,注意最後一項Install Type最好選擇本地可執行檔案,比如Windows版的exe(local)或Linux版的runfile(local),這樣在網速差的環境下對成功安裝更有保障。對於Windows 64位安裝環境,這裡需要下載三個安裝檔案,一個主檔案:cuda_9.0.176_win10.exe和兩個patch檔案:cuda_9.0.176.1_windows.exe,cuda_9.0.176.2_windows.exe。

   cuDNN在https://developer.nvidia.com/cudnn這裡下載,這裡需要先註冊賬號然後登入才能進去下載,反正NVIDIA網站做的很不友好,註冊後登入還得驗證郵件轉來轉去的暈頭轉向,網站找個什麼東西也是很不直觀,不是一般的繞,用過NVIDIA網站的恐怕都想吐槽偷笑,登入(註冊後好像仍然要使用join進去,而不是login,否則老是迴圈要你驗證郵件有效性,暈死閉嘴)進去後,下載對應於cuda9.0的cudnn7.1.4檔案(從https://developer.nvidia.com/rdp/cudnn-download這裡下載cudnn最新版7.1.4,不要進Archived cuDNN Releases),對於Windows 64位安裝環境,下載cudnn7.1.4 for cuda9.0即cudnn-9.0-windows10-x64-v7.1.zip。

     安裝CUDA時,最好使用自定義安裝,把Visual Studio Integration的勾選去掉,否則你機器上安裝的Visual Studio版本不對或者沒有安裝時,下一步會報錯導致你安裝不下去(下面兩張圖是試著安裝CUDA 9.1版時的截圖,出錯提示是一樣的,所以不影響作為示例):

    這時可以退回去把Visual Studio Integration勾選去掉再安裝:    

    安裝CUDA 9.0的預設路徑是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\,安裝CUDA9.0完後,把cudnn-9.0-windows10-x64-v7.1.zip解壓後,把bin,include,lib裡面的檔案(共三個)分別拷貝到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\下的bin,include,lib目錄下即可。

      然後測試tensorflow,可以看到我本子的GeForce 940MX GPU被tensorflow新增建立為TensorFlow device,並 可以成功列印輸出常量c的值,表明安裝成功了得意

     我最初不知道Tensorflow1.8和CUDA 9.0對應依賴關係,我的本子的GPU是很古老的Geforce 940MX快哭了,對它沒信心,怕安裝了CUDA9.0根本不能用哭,又查看了我的本子上的NVIDIA控制面板裡的系統資訊窗口裡的元件資訊,本子上當時安裝的NVCUDA版本是8.0.0(這個版本資訊其實是CUDA driver版本,而不是要安裝的CUDA runtime的版本,把兩者搞混了,誤導了思考方向抓狂):

    另外由受書本和網上的有些文章誤導跌入坑裡,相信應該是安裝CUDA8尷尬,於是先安裝的CUDA8.0.44+cuDNN 7,結果安裝GPU版Tensorflow後Import tensorflow時報錯找不到檔案cudart64_90.dll,把CUDA 8的cudart64_80.dll強制改名為cudart64_90.dll後,Import tensorflow又會報另外的錯ImportError: DLL load falied: 找不到指定的模組,不知道是哪個模組找不到,於是我琢磨出錯程式碼,在‪D:\Anaconda3\Lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py里加了句列印把

   mname = '.'.join((pkg, '_pywrap_tensorflow_internal')).lstrip('.')

 這裡的mname打印出來,可以看到這個模組是tensorflow.python._pywrap_tensorflow_internal,可是在D:\Anaconda3\Lib\site-packages\tensorflow\python\下面有_pywrap_tensorflow_internal.pyd這個檔案啊,怎麼回事呢?怎麼就不認識這個pyd檔案呢?於是把tensorflow-gpu 1.8和CUDA 8+cuDNN7/CUDA 8+cuDNN6裝了卸卸了裝弄了多遍折騰到凌晨幾點還是沒搞定,今天早上繼續,後來突然想到可能是因為Tensorflow1.8就得安裝CUDA9.0,否則初始化程式碼檢查CUDA版本失敗導致_pywrap_tensorflow_internal這個模組載入不了,後來下載CUDA 9.0+cuDNN7.1,安裝好後,果然tensorflow可以用了!

     關於安裝錯誤的CUDA版本導致的幾個錯誤,截圖如下:

(1)找不到cudart64_90.dll:

(2) ImportError: DLL loaded failed: 找不到指定模組。找不到_pywrap_tensorflow_internal模組:

另外,如果執行tensorflow時報錯說:CUDA driver  version is insufficient for CUDA runtime version : 

   這說明你機器上安裝的CUDA driver版本比剛安裝的CUDA tookit版本低(原因應是安裝時沒有勾選display driver之類的),解決辦法是安裝CUDA tookit時所用元件全部勾選(除了Visual Studio Integration),如果還不行,假如你的GPU卡是GeForce序列的,到https://www.geforce.com/drivers按你的機器的GPU卡的型別搜尋對應的最新的driver,下載並安裝即可,其他序列的去NVIDIA中國網頁https://www.nvidia.cn/Download/index.aspx?lang=cn上按卡型別搜尋最新的driver安裝程式。

    通過搜尋GUP卡的驅動,知道了很古老的GPU卡NVIDIA仍在提供最新的driver更新,這樣就保障了我的GeForce 940MX這樣的古懂卡在升級driver到最新後,也可以自由使用最新的CUDA 9.x版本,只要Tensorflow或Caffe支援!這點真是太好了!以前擔心我的GPU卡太老導致玩不了比較新的GPU版tensorflow,現在暫時不用擔心了!得意