這兩天在服務器上裝tensorflow,真是讓人頭大。
說一下背景,實驗室是公用的centos服務器,管理員給了我一個賬號,當然是沒有root權限的,到時候數據軟件啥的,如無必要,都要裝到自己的目錄下。在這種服務器上裝軟件,好處是人家管理員把該裝的一些基本的東西都裝好了,省去了很多步驟。當然,壞處就是,像我這種對linux不熟悉的,敲每個指令都戰戰兢兢,生怕一不小心就搞了某個公用的變量、配置、驅動、依賴之類的(實際上linux權限管理是比較方便的,一般不需要擔心這個)。整個過程甚是曲折。
利用我的mac的終端登錄服務器,用ssh [username]@[xx.xx.xx.xx] -p [port]命令,需要輸入的是用戶名,ip地址和端口編號,之后會讓人輸入密碼,輸完密碼就登錄了。登錄后我首先檢查了一些基本組件的版本。
python版本2.7,這是系統自帶的,直接用就行。
cuda和cudnn,這個實際上決定了tensorflow要裝哪個版本的,我一開始的想法是用服務器上安好的cuda和cudnn,於是就用下面兩個指令查看了下版本。
cat /usr/local/cuda/version.txt
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
查詢得到cuda版本8.0,cudnn版本6.0,在網上查一下對應表,得知對應的tensorflow版本應該是1.3或1.4
知道了這些信息我就准備裝tensorflow了,安裝方法非常多,官網上就提供了五種,最常用的是pip,anaconda和virtualenv,一開始,我是按照官網上anaconda的步驟進行安裝。
首先需要下載安裝anaconda,我是在本地電腦上下載了anaconda的安裝包(https://www.anaconda.com/download/#macos),然后遠程傳輸到服務器上執行,傳輸文件很簡單,調用下面命令即可:
scp [本地文件完整路徑] [username]@[xx.xx.xx.xx]:[服務器端路徑]
執行安裝文件后,它會有一系列詢問與選項,中間會詢問安裝路徑,不用默認路徑的話,就輸入自己的絕對路徑就行,我沒有用默認路徑,后面還有一個關鍵的是系統會詢問是否加入環境變量(.bashrc),我選擇的yes,如果這一步選擇no,就必須后面自己配置。安裝完后,執行conda -V命令可以顯示anaconda版本信息,顯示了就說明安裝成功了。然后在終端輸入python,進入python環境,下面第一行中間有 |Anaconda, Inc.|的字樣,說明進入ananconda環境也成功了,如果沒成功,執行一下source .bashrc
安裝完anaconda后,我是先按照官網上的步驟進行安裝的,大致可以概括為安裝anaconda--創建conda環境並激活--使用pip安裝,具體的linux命令見網址(https://www.tensorflow.org/install/install_linux#InstallingAnaconda)。這個方法的好處是整個安裝和將來運行都在你建好的那個conda環境中,不會與其他版本的python和tensorflow沖突,這里需要注意的是,如果服務器沒有開vpn,那么官網的下載鏈接是用不了的,需要替換成清華的鏡像(https://mirrors.tuna.tsinghua.edu.cn),在這個網站上選擇tensorflow后,按照你的系統環境、python版本、gpu還是cpu、tensorflow版本進行選擇后,它會提供給你需要輸到終端里的鏈接網址。
用官網上的方法安裝完后,就是無限的坑了,我試了下import tensorflow會報錯,就是官網常見問題(https://www.tensorflow.org/install/install_linux#common_installation_problems)的第一個,可能稍有不同,比如我在試不同版本時,就先后出現了:
libcudart.so.8.0: cannot open shared object file: No such file or directory
libcublas.so.8.0: cannot open shared object file: No such file or directory
感覺這兩種錯誤是類似的,都是有關cuda的,都可以參考(https://stackoverflow.com/questions/36159194/tensorflow-libcudart-so-7-5-cannot-open-shared-object-file-no-such-file-or-di)上的解決方案,我也百度了博客上的方案,比如輸入以下命令
export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda
source ~/.bashrc
最終我也不知道解沒解決這個問題,應該是解決了,因為系統開始報另外一個錯誤了😂,那就是:
ImportError: /lib64/libc.so.6: version `GLIBC_2.14' not found
具體報錯的是GLIBC哪個版本忘了,反正都是這個形式,繼續百度,發現是linux系統的GLIBC這個庫沒有所需要的新版本,然而,根據網上的說法和一個同學的指導,千萬不要貿然去升級GLIBC,因為這是linux一個很底層的庫,與centos版本密切相關,隨便升級了,很可能shell都會崩潰。那唯一的辦法,就是改變tensorflow版本,看能不能找到可以用的。於是我就從1.4版本一級一級地往下試,中間如果要卸掉某個版本的tensorflow,直接用命令pip uninstall tensorflow-gpu即可,當然uninstall后面的名字要正確,可以用pip list查看安裝列表。
結果試驗過程出現了可以說令我束手無策的局面:
隨着版本的降低,glibc的問題消失了,前面說的關於cuda的錯誤又出現了,而且不是環境變量配置的問題,是低版本的tensorflow,需要使用cuda7.5,而服務器上的cuda8.0,無論怎么配置都是無用的,但是我如果升級tensorflow,cuda的版本是匹配了,glibc又不行了,這是一個無法解決的矛盾。
不得已請教了師兄,師兄建議直接用anaconda裝,結果發現,之前都白忙活了,anaconda一鍵解決!!
沒錯你沒有看錯,使用anaconda安裝而不用pip,一鍵解決!
第可能有人會問,之前不是就用的anaconda么?不,其實之前按照官網的步驟,anaconda只起到了搭建虛擬環境的作用,具體安裝的命令還是用的pip,而所謂用anaconda安裝,是直接調用conda install指令,具體步驟為:
首先搜索可使用conda安裝的源:
anaconda search -t conda tensorflow
調用這個命令后,終端會輸出所有可用的源
如圖所示,從中選擇一個源,輸入:
anaconda show [name]
name就是上面列出的name那一列的名字,之后系統會給出要安裝這個源的tensorflow所用的指令,比如我選擇HCC/tensorflow-gpu,帶入上面的指令輸入,它會告訴我用:
conda install --channel https://conda.anaconda.org/HCC tensorflow-gpu
這個指令安裝,需要注意的是如果直接用這個指令,它會安裝所能安裝的最新版,我一開始不知道這個,就直接調用了它給出的指令,安裝了1.9版的tensorflow
按說安1.9版沒有問題,因為anaconda安裝最智能的一點就體現在這里,安裝前它會自動分析你的環境,然后自動給你安裝缺失的或版本不對的依賴,比如cuda,我也不知道它到底安在哪,但是應該是不會影響服務器的其他用戶,它就把cuda9.0給我裝上了,當然還有cudnn7.1。
裝完之后,我進入python環境,輸入import tensorflow竟然沒有報錯!!我以為安裝成功了,結果繼續往下一試就出問題了,運行sess=tf.Session時,檢查完gpu,出現了如下報錯信息:
cuda driver version is insufficient for cuda runtime version
沒錯,cuda版本太高,gpu驅動用不了了!這就沒辦法了,gpu驅動這東西,我是不能動了,動了的話,所有服務器上正在運行的程序要出大亂子,那么辦法就是,安裝低版本的tensorflow,從而使用低版本的cuda,從而可以適應服務器的驅動。
要安裝指定版本的tensorflow,需要把前面安裝的指令修改為:
conda install --channel https://conda.anaconda.org/HCC tensorflow-gpu=1.4
加一個版本信息就好了,比如我這里加的是1.4版本,這時,anaconda會自動給分析出來,在已經裝了tensorflow1.9的情況下,安裝tensorflow1.4,有哪些需要安裝,哪些需要卸載,哪些需要更新,哪些需要降級,就是這么方便。
於是終於安裝成功了,使用例子程序,成功打印了“hello”