再寫博文,回顧在Windows7上安裝TensorFlow-GPU的一路坑

分類:Linux 時間:2017-01-25

離完成上一篇文章有近1年了。2016年發生了太多的事情,從而沒能堅持哪怕是每月一篇這樣的頻率。終於在2017年的1月份抽出幾天搞出了一些東西。一路坑洼,趕緊記錄下來。

2016年初就開始看深度學習的東西,主攻TensorFlow。但是一路項目再加上換了公司,每次都是搞兩天就停一陣子,然後再拾起來重頭搞兩天,再被打斷。而且換了公司後沒有了隨意能調用的計算資源,CPU版的TensorFlow直到11月份才安裝完,並跑了一些例子。因為一般虛擬機都不支持GPU,所以GPU版就完全沒有機會實踐。直到TensorFlow出了Windows版,而且發現新換的電腦居然是NVIDIA的GeForce 940M顯卡,立刻決定在筆記本上實驗安裝一把TensorFlow-GPU版本。

但因為手賤,就那麽一抖,居然把整個過程搞了近4天才真正地讓MNIST的例子跑在GPU上。

不再發騷了,直接上過程,並介紹碰到的這個大大大大坑!!


下面的過程不是一步一步的手把手教程,而是一個簡略的敘述,所以如果你想重復實現,最好先了解一些TensorFlow的基礎知識。

安裝環境:

  • Windows 7 64bit
  • GPU: GeForce 940M
  • python: 3.5.2
  • CUDA: 8

我的安裝過程:

  1. 首先下載Anaconda3的Win7 64bit版,安裝Python3.5版本。因為目前TensorFlow對Windows只支持Python3.5。可以直接下載Anaconda的安裝包安裝即可,一般不會有問題。
  2. Anaconda安裝完成後,直接在Windows的命令窗口裏敲Python就應該能看到版本是否是3.5。
  3. 用conda安裝jupyter:conda install jupyter
  4. 創建一個jupyter notebook的目錄,然後cd到此目錄後啟動jupyter notebook:jupyter notebook
  5. 然後用conda命令安裝pip:conda install pip。
  6. 用conda命令創建tensorflow運行環境:conda create -n tensorflow-gpu。這一步的目的是建立一個單獨的python運行環境,方便同時安裝CPU版和GPU版本,不會互相影響。
  7. 啟動此運行環境:activate tensorflow-gpu
  8. 用pip安裝tensorflow:pip install tensorflow-gpu
  9. 啟動python命令行編輯器,然後import tensorflow as tf,報錯說沒有cuda庫。
  10. 按照tensoflow的git網頁上指定的CUDA地址下載CUDA8和cudnn的庫。其中想下載cudnn的庫,需要去註冊一下會員。略微麻煩了點。不過都順利下載。
  11. 安裝CUDA8,直接執行cuda_8.0.44_windows.exe文件,一路默認的點下去。半小時後安裝完畢。
  12. 然後CUDA安裝程序會安裝一個什麽NVIDIA Experience的程序,然後這個程序會自動啟動,並詢問是否要升級顯卡的驅動程序。我腦子一暈,想當然的認為最新的肯定是最好啦,就手賤點了升級。然後一路綠燈的升級完畢。
  13. 接著解壓縮cudnn的庫文件cudnn-8.0-Windows7-x64-v5.1.zip。把其中的文件夾放到一個地方,比如E:\CUDA。然後可以有兩種方法把cudnn庫設置成tensorflow可以用。
    1. 把此目錄路徑放到Windows的系統PATH參數裏面;
    2. 把目錄裏面的內容放到CUDA的安裝目錄(我的是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0)下面相對應的目錄裏面,bin的放到bin,lib的放到lib,include的放到include。
  14. 一切就緒,還是在命令行的tensorflow-gpu的運行環境裏,啟動啟動python命令行編輯器,然後import tensorflow as tf。發現5行successfully load的東西,說明找到了cuda的庫。
  15. 定義一個session,如 s=tf.Session() 然後回車,詭異的事情出現了!!
    1. Windows彈出了一個警告框,說什麽“此硬件設備不可拔出或是不能移動......";
    2. Python命令行裏面的錯誤提示是:......can not cuInit: CUDA_NO_DEVICE_ERROR......
  16. 完全無頭緒的兩個提示,立刻開始一頓狂搜百度。結果發現居然沒有人碰到這樣的問題。馬上翻墻出去上Google,再搜,得到的信息極其稀少。首先是安裝在Windows上的就很少,而碰到這個問題的就更少。唯一一個一樣的是stackoverflow上某人提到了設備不能拔出和移動,還是英語,一開始就沒留意。而且他最後問題是解決了,解決方法是windows裏面把顯卡卸載了再安裝就好了。基本沒有參考價值。
  17. 接著繼續搜,B+G滿世界的海搜。的一個初始的想法是CUDA安裝沒裝好,就把第11步反復搞,結果還是一樣。
  18. 搞了一天,發現沒進展,開始懷疑是顯卡的問題,於是把顯卡給刪了,再裝。然後重復14步,沒問題,15步又出錯,但是這次報的錯不再是什麽硬件不能拔,而是Python程序出錯。眼淚立刻下來了,雖然還是錯,但終於開始接近問題的本質了。開始懷疑是顯卡驅動程序的問題。立刻查看,NVIDIA的控制面板裏給出了驅動信息,是版本368.81。然後安裝了一個GPU-z,看看顯卡的情況。驅動版本也是一樣的,但是提示顯示CUDA不支持。。。。。。
  19. 於是去Geforce的官網找驅動,然後找了最新的2016年12月的版本,下載安裝。然後第15步的錯誤再現!!根據18步的情況,判斷新的驅動版本可能不行。
  20. 於是去Geforece官網找舊版本,奇葩的是,Geforece最舊的版本只到2016年8月份的372.54版。下載372.54,安裝還是15步的問題。
  21. 只好滿世界的找舊版本驅動,大海撈針一般。前後下了7-8個版本。終於在安裝了一個很舊的版本後353.62(2015年出的驅動),情況開始發生逆轉了!!
  22. 安裝完此舊版,運行一個session後,tensorflow居然顯示找到了顯卡,且能打印出顯卡的信息啦。那個心花怒放啊!!以為苦日子終於熬到頭了。
  23. 然而,真正開始跑MNIST例子的時候,一堆警告出現:...... cuda version is insufficient for cuda runtime environment....。居然出了新的問題。不過還好,之前搜索驅動程序的時候見到過別人貼的這個問題,解決方案是顯卡的驅動版本要足夠高。
  24. 於是從353.62版本開始,一個一個的試更高的版本,355.98,359.06,361.91,365.81全都試過了,不是版本過低就是高版本後python程序出錯。前前後後搞了2天多,還是不行。這時候開始冷靜下來整理思路了:
    1. 問題已經基本鎖定在顯卡的驅動程序的版本上;
    2. 別人為什麽沒有出現過什麽問題,從而造成B+G上幾乎沒有出現15裏面的情況的帖子?
    3. 別人沒碰到,說明自然安裝就能解決掉。
    4. 那麽就有可能是CUDA庫會有自己支持的一個版本的驅動程序。
  25. 等分析到這裏,思路就清晰了,CUDA的版本是確定的,就是要找到和這個CUDA支持的驅動程序版本。於是仔細的又看了一下CUDA的安裝組件,果然發現,在安裝CUDA的過程中,安裝包自身就包括了一個369.30版的顯卡驅動。那麽這個版本就應該是和CUDA8相互支持匹配的驅動程序。
  26. 發現了這個問題後,就立刻卸載掉已經安裝的高於369.30驅動程序,然後按照第11步從新裝一遍CUDA,選擇自定義安裝,選擇369.30的驅動。
  27. 裝完重啟,再次運行,終於只有successfully,沒有其他的警告啦。GPU-Z也顯示GPU load在80%左右。CPU的用量很低。
到此為止,終於解決了Windows7上安裝運行TensorFlow GPU版本,成功運行了簡單版和卷積版的MNIST。

問題分析:

  1. 根源其實很簡單,就是CUDA8有自己完全兼容匹配的Geforece顯卡的驅動程序。我的GeForece 940M對應的就是369.30版
  2. 用CUDA安裝程序默認就會把這個版本的驅動程序裝上。但這裏有兩個坑:
    1. CUDA安裝默認是全裝,神馬Experience、Insights都裝,裝完了就立刻檢測你機器的顯卡驅動是否是最新的,發現不是最新的,就建議你升級。如果如我一般手賤了一下,後面就悲劇了。
    2. 如果你已經自己升級過驅動版本高於369.30,CUDA安裝不會降級,這個時候也會悲劇。
  3. 如果機器的驅動版本低於369.30,CUDA就會安裝升級。這種情況應該是最常見的,因此一般安裝完成後TensorFlow-GPU就能完美的識別GPU並用來進行計算。我猜測這也就是為啥網上幾乎沒有出現我碰到的問題的帖子。因為默認都是OK的。
雖然過程很痛苦也漫長,但是這麽一折騰還是學到了很多東西,NVIDIA的網站也看了不少。對GPU也有了一些了解。得失都有。下面就開始TensorFlow GPU的學習了。
Tags: Windows7 notebook GeForce 筆記本 NVIDIA

文章來源:


ads
ads

相關文章
ads

相關文章

ad