第一步其實並不是安裝安裝 NVIDIA cuda, 而是先要選擇好操作系統,這個很重要因爲現在tensorflow官網只對ubuntu, maxOS, windows的錯誤進行維護,其他系統的錯誤就要靠自己囖。
說操作系統重要還有一點就是cuda會依賴不同的操作系統的自帶驅動包,然後要根據你的顯卡核心版本去下載不同版本的cuda的安裝包,不同的tensorflow版本又只能支持對應版本的cuda驅動,如果錯了一點可能又要刪除重新弄,建議如果是新機器還是用最新的穩定版的系統爲好。下面的步驟是針對ubuntu16.0.4和centOS 7的,而且親測有效(花了兩三天時間才裝好的)
==========================================真正的開始===========================================
安裝 NVIDIA cuda
文檔:
總目錄:https://developer.nvidia.com/cuda-toolkit-archive
最新版本:https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#runfile-nouveau
自選版本:https://docs.nvidia.com/cuda/archive/9.0/cuda-installation-guide-linux/index.html
1. 選擇 runfile下載 cuda_9.0.176_384.81_linux-run, 在發帖之前tensorflow到了1.9版本,但是官方的安裝包都只支持cuda9.0,更高版本的cuda需要自行修改源碼去支持了,所以這裏選擇了9.0的包。在下載之前官網文檔上還有一個Pre-installation Actions 的步驟,這個步驟裏面的每一小步也是很重要的所以大家一定要看清楚,這些步驟會叫你怎麼選擇cuda版本,怎麼查看系統是否支持等信息,所以每一步都要看喔~!
2. 下載完成之後 運行 "sudo sh cuda_9.0.176_384.81_linux-run" ,然後看到一大堆文檔不斷的空格鍵
3. Do you accept the previously read EULA?
accept/decline/quit: accept(沒什麼好說的了直接敲accept)
4. Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 396.26?
(y)es/(n)o/(q)uit: n (這裏是說安裝顯卡驅動,但是不建議用cuda自帶的顯卡驅動包,因爲這很大可能跟你的顯卡的版本對不上,一旦對不不上後面的安裝可能出錯,即使不出錯在時間使用的時候也會報莫名其妙的錯誤,所以還是自己到這裏https://www.geforce.com/drivers 去下載顯卡驅動安裝。可以先裝顯卡驅動也可以裝完cuda再裝。)
5. Do you want to install the OpenGL libraries?
(y)es/(n)o/(q)uit [ default is yes ]: n (這是nvidia自己的opencv 沒有用的,要用就用直接的opencv官網安裝也很簡單,所以這n)
6. Do you want to run nvidia-xconfig?
This will update the system X configuration file so that the NVIDIA X driver
is used. The pre-existing X configuration file will be backed up.
This option should not be used on systems that require a custom
X configuration, such as systems with multiple GPU vendors.
(y)es/(n)o/(q)uit [ default is no ]: n (沒什麼用處所以n)
7. Install the CUDA 9.2 Toolkit?
(y)es/(n)o/(q)uit: y (豬腳在這裏只能是y了)
8. Enter Toolkit Location
[ default is /usr/local/cuda-9.2 ]: (直接回車)
之後就是一堆很醜陋的命令行模擬界面的提示信息,一直Ok就可以
最後成功安裝
=========== = Summary = ===========
Driver: Disable
Toolkit: Installed in /usr/local/cuda-9.0
Samples Installed in /home/luzhanbo/data/source/cuda_samples
Please make sure that
- PATH includes /usr/local/cuda-9.0/bin
- LD_LIBRARY_PATH includes /usr/local/cuda-9.0/lib64, or, add /usr/local/cuda-9.0/lib64 to /etc/ld.so.conf and run ldconfig as root
========================================完美分割線=============================================
你以爲這樣子就好了麼,騷年你還是太年輕了,安裝後纔是踩坑的時候。下面是遇到過的坑希望能幫到大家 ~~!
1. 運行tensorflow發現還是會提示缺很多的包,因爲cuda的包並沒有加入到環境變量裏面,所以找不到按下面的把cuda的安裝路徑下面的lib64和bin都放到環境路徑就可以
vim /etc/proflie
#set nvidia cuda env
export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64 ${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
2. 沒有 /dev/nvidia* 這個文件, 把這裏的https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#runfile-verifications script寫在一個運行文件裏面運行一次就可以
3. tensorflow每一個build的版本都只能對應某些CUDA的版本,因爲tensor在調用的時候會根據版本號去調用api,本人就試過安卓9.2版本的CUDA+tensorflow1.6,結果調用出錯因爲1.6版本的tensorflow依賴的是一個包libcublas.so.9.0,而9.2版本的CUDA裝的是9.2的libcublas.so 這就尷尬了。
4. 運行tensorflow,報錯找不到libcudnn的包 去nvidia下載 https://developer.nvidia.com/rdp/cudnn-archive(估計是nvidia特意留坑要你去註冊)找到 cudnn-9.0-linux-x64-v7.tgz 這個對應cuda9.0的cudnn包,解壓後有一個cuda目錄然後 sudo cp lib* /usr/local/cuda/lib64/, 然後 sudo cp cudnn.h /usr/local/cuda/include/ 分別拷貝到cuda對應的文件夾就可以,如果是用安裝包的那就 cd cudnn-6.5-linux-R1 或者 locate cudnn 找到對應的lib目錄在cp就可以。
5. cp /lib/udev/rules.d/40-vm-hotadd.rules /etc/udev/rules.d
6.顯卡驅動和顯卡版本不兼容的問題,上面安裝的步驟裏面已經提過,一旦不兼容用的時候回報很多莫名其妙的錯
2018-06-01 17:09:23.275631: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:189] libcuda reported version is: 384.81.0
2018-06-01 17:09:23.275660: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:193] kernel reported version is: 384.130.0
2018-06-01 17:09:23.275668: E tensorflow/stream_executor/cuda/cuda_diagnostics.cc:303] kernel version 384.130.0 does not match DSO version 384.81.0 -- cannot find working devices in this configuration 錯誤
kernel 是內核版本, libcuda 是cuda版本 下載驅動,不要用apt-get自動更新顯卡驅動!不要用apt-get自動更新顯卡驅動!不要用apt-get自動更新顯卡驅動! https://www.geforce.com/drivers 自己下對於的驅動吧~!
7. centOS執行以下命令,查找編譯gcc時生成的最新動態庫:
find / -name "libstdc++.so*"
LD_PRELOAD=/usr/local/glibc-2.14/lib/libc-2.14.so ln -s /lib64/lib64/libc-2.17.so /lib64/libc.so.6