華為雲linux服務器部署TensorFlow-gpu全攻略


  最近在玩谷歌新開源的自然語言模型bert,最開始是在google的免費GPU上面來弄的(這個部分其實也是可以寫一個教程的,中間坑也挺多)。但谷歌比較坑人,小數據集還行,大點的數據集訓練耗費時間長,再加上網絡不穩定總掉線,訓練一個上萬的數據集斷斷續續的用了一天時間。改用在本地的linux服務器上來訓練bert,但是沒有NVIDIA顯卡,只好用cpu來跑了,速度超慢,跑一個7萬的模型需要50個小時。跑出來的結果很奇葩loss很大,估計參數設置有問題,想換個參數重新跑,太耗費時間了,看來只好搞個GPU來加速計算了。於是這兩天開始研究怎么在華為雲上面部署GPU,接下來就是入坑了。

  首先說一下華為雲,我想要在上面租個服務器,就是帶Tesla P100顯卡,這樣計算就快不少。(注意,GPU版的服務器即便關機也照樣收費,一晚上收了100多。。。)但是公司已經有挺多的雲服務器,只不過是沒有NVIDIA顯卡而已,老板讓我先在沒有顯卡的服務器上先搭環境,然后做個私有鏡像,然后再申請p100雲服務器,加載鏡像的時候就加載我制作的這個私有鏡像就行了。接下來我就按照這個思路來弄。首先找一些centos下安裝TensorFlow-gpu的教程(這個教程我后面詳細貼出來),然后就安裝anaconda3、cuda、TensorFlow等這些依賴工具,然后在本地跑一個bert的小demo。倒是跑出來了,但是程序中有報錯:

tensorflow failed call to cuInit: CUDA_ERROR_UNKNOWN

開始我也沒管,反正跑出結果了,說明TensorFlow-gpu能運行,報這個錯可能是沒有NVIDIA顯卡的原因,等我申請帶有GPU的服務器,在那上面跑估計就行了。然后將當前部署好的可以運行bert的linux環境生成了一個鏡像,華為雲官網上說生成鏡像需要挺多配置啥的,我都沒有配,直接生成了。接着我租了一個華為雲p100服務器,加載鏡像的時候加載的是我生成的私有鏡像。進去之后我直接在上面開始跑bert了,但是還是有:

tensorflow failed call to cuInit: CUDA_ERROR_UNKNOWN這個錯誤

上網查了一會,發現是NVIDIA顯卡沒有驅動的問題,原來那個鏡像里面根本沒NVIDIA顯卡我驅動個毛線啊,華為雲官網說安裝了cuda后會自動安裝NVIDIA驅動,好吧,我在p100服務器上開始安裝驅動,各種安裝,各種不好使,使用nvidia-smi這個命令就可以看到本機的gpu情況,但是一直顯示的都是這個命令是無效的,說明nvidia顯卡驅動我始終沒有安裝好。最后沒有辦法我把這個p100服務器刪除了,然后重新申請了一個,加載鏡像我直接加載的一個干凈的centos7的公共鏡像,我打算從頭在p100上安裝所有的依賴包。啰嗦了半天終於要進入正題了:

  華為雲p100服務器是專門給GPU加速計算用的,所以肯定是預先安裝了NVIDIA和GCC的,如果你不打算在華為雲,而打算在自己本地機子上來部署一個TensorFlow-gpu。首先應該確認一些基本的安裝條件是否具備,這里我們依據centos7.3來實驗;

1、使用GPU得有nvidia顯卡,所以得先看一下本機的顯卡,分別輸入a命令和b命令:

a、lspci | grep -i nvidia

b、lspci | grep -i vga

  如果結果顯示有nvidia字樣還帶有型號啥的,說明你機器上有nvidia顯卡,可能能夠使用GPU(這里用可能二字是因為計算是nvidia顯卡也不一定是能用GPU加速計算,對於TensorFlow而言,應該是算力達到一定程度才可以),若果要是輸入剛才命令啥也沒有顯示,而顯示:

00:02.0 VGA compatible controller: Cirrus Logic GD 5446

說明機器上沒有nvidia顯卡,只有一個普通顯卡,即便你安裝cuda也沒用,不能加速計算。

2、確認Linux版本是否支持cuda:

[littlebei@localhost ~]$ uname -m && cat /etc/*release

若有信息輸出,說明是支持的。

3、檢查gcc是否安裝

[littlebei@localhost ~]$ gcc --version

若沒有安裝,可以使用一下命令安裝

[littlebei@localhost ~]$ sudo yum install gcc gcc-c++

這里需要注意,TensorFlow-gpu需要gcc版本是5以下的,下面是一個詳細的版本對應情況:

Version: CPU/GPU: Python Version: Compiler: Build Tools: cuDNN: CUDA:

tensorflow-1.8.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.10.0 N/A N/A

tensorflow_gpu-1.8.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.9.0 7 9

tensorflow-1.7.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.10.0 N/A N/A

tensorflow_gpu-1.7.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.9.0 7 9

tensorflow-1.6.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.9.0 N/A N/A

tensorflow_gpu-1.6.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.9.0 7 9

tensorflow-1.5.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.8.0 N/A N/A

tensorflow_gpu-1.5.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.8.0 7 9

tensorflow-1.4.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.5.4 N/A N/A

tensorflow_gpu-1.4.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.5.4 6 8

tensorflow-1.3.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.5 N/A N/A

tensorflow_gpu-1.3.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.5 6 8

tensorflow-1.2.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.5 N/A N/A

tensorflow_gpu-1.2.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.5 5.1 8

tensorflow-1.1.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.2 N/A N/A

tensorflow_gpu-1.1.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.2 5.1 8

tensorflow-1.0.0 CPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.2 N/A N/A

tensorflow_gpu-1.0.0 GPU 2.7, 3.3-3.6 GCC 4.8 Bazel 0.4.2 5.1 8

4、上面檢查都沒有問題下面開始安裝一些TensorFlow的依賴工具

  首先安裝python,目前linux默認自帶的python都是2.7版本的,很多時候都用着不方便,甚至報錯,所以我們先裝一個python3.6版本的,這里使用anaconda3來安裝,因為裝完之后一些常用的機器學習工具都一起給你裝了,省的后續自己還得裝,裝anaconda時候需要注意的是最新版本里面帶的python是3.7,很多軟件可能還沒有支持,為了穩定,我們裝帶有python3.6的anaconda3。 在linux執行 wget http://repo.continuum.io/archive/Anaconda3-5.1.0-Linux-x86_64.sh,會直接下載安裝包,下載完成后執行 bash Anaconda3-5.1.0-Linux-x86_64.sh 會安裝anaconda,對應的python是3.6.4的版本,需要注意的是在安裝過程中需要兩次輸入yes,尤其是第二次相當於將anaconda加入到系統環境變量中,然后安裝完成后直接ctrl+D退出后重新登錄linux。輸入命令 python 就可以看到是最新版本的python了,原來的系統自帶的python被切換成了python3.6.4。(這里多說一句,有些同學可能在安裝過程中沒有輸入yes,不小心直接回車默認安裝了,結果重啟后輸入python還是顯示2.7版本 ,說明anaconda沒有加入到系統環境變量中,解決辦法參見https://zhuanlan.zhihu.com/p/24664358)。

5、接下來是cuda的安裝,這塊就比較磨嘰了,首先華為雲上說當用戶安裝cuda后,如果當前的系統有nvidia顯卡,會自動安裝顯卡驅動的,而不必手動進行安裝的。所以我直接安裝cuda就好了,首先我們需要確定安裝哪些版本,見下表:

表1 CUDA工具包下載地址

實例

類型

操作系統

CUDA版本

下載路徑

索引項

Operating

System

Architecture

Distribution

Version

Installer

Type

P2v

(V100)

CentOS 7.4 64bit

9.2

https://developer.nvidia.com/cuda-92-download-archive

Linux

x86_64

CentOS

7

rpm(local)

Ubuntu 16.04 64bit

Linux

x86_64

Ubuntu

16.04

deb(local)

Windows Server 2016 Standard 64bit

Windows

x86_64

-

Server 2016

exe(local)

Windows Server 2012 R2 Standard 64bit

Windows

x86_64

-

Server 2012 R2

exe(local)

P1

(P100)

CentOS 7.3 64bit

9

https://developer.nvidia.com/cuda-90-download-archive

Linux

x86_64

CentOS

7

rpm(local)

Ubuntu 16.04 64bit

Linux

x86_64

Ubuntu

16.04

deb(local)

Windows Server 2012 R2 Standard 64bit

Windows

x86_64

-

Server 2012 R2

exe(local)

Pi1

(P4)

CentOS 7.3 64bit

9

https://developer.nvidia.com/cuda-90-download-archive

Linux

x86_64

CentOS

7

rpm(local)

Ubuntu 16.04 64bit

Linux

x86_64

Ubuntu

16.04

deb(local)

這里我是p1型號的服務器,所以點擊進入第二個網址:

進入nvidia官網后如下選擇:

那個深綠色的就是我選擇的cuda工具包的型號,然后點擊download,不過由於我擔心國外資源下載速度慢,所以我使用的是華為雲服務器下載的,注意服務器需要配有公網彈性ip,這樣就可以直接從華為雲鏡像下載了,基本一分鍾就下載完了,具體步驟就是首先鼠標放到download上,右鍵復制下載地址,然后在華為雲服務器上用wget [復制的鏈接地址]下載即可:

下載完成后需要按照官網下面的提示步驟進行安裝,即按照順序執行下面三個命令:

1、sudo rpm -i cuda-repo-rhel7-9-0-local-9.0.176-1.x86_64-rpm(這里需要注意的是,官網下面的命令是最后是.rpm,如果按照那個執行會找不到文件,按照我的命令執行即可)

2、sudo yum clean all

3、sudo yum install cuda

執行完之后就安裝完成了cuda 執行nvcc –V 檢查CUDA,可以看到安裝cuda的版本;

多說一句,我執行這三條命令都是遇到詢問安裝都yes了,網上有的人說不能那樣,會安裝不好驅動,反正說啥都有,我就按照這個步驟裝的,也沒出問題。

6、安裝cuda后還需要安裝cudnn這個軟件,官網下載和CUDA對應的版本(https://developer.nvidia.com/rdp/cudnn-download ),需要注冊。然后解壓文件,一次執行以下命令(我下載的版本是cudnn-9.0-linux-x64-v7.5.0.56.tgz)

tar -xvzf cudnn-9.0-linux-x64-v7.5.0.56.tgz

cd cuda

sudo cp include/cudnn.h /usr/local/cuda/include

sudo cp lib64/libcudnn.* /usr/local/cuda/lib64

CUDNN安裝完成。

查看cudnn版本的方法:

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

 

PS:這里下載cundnn一定要對應好版本,下面這個是版本對應關系:

Download cuDNN v7.1.2 (Mar 21, 2018), for CUDA 9.1

Download cuDNN v7.1.2 (Mar 21, 2018), for CUDA 9.0

Download cuDNN v7.1.2 (Mar 21, 2018), for CUDA 8.0

Download cuDNN v7.1.1 (Feb 28, 2018), for CUDA 9.1

Download cuDNN v7.1.1 (Feb 28, 2018), for CUDA 9.0

Download cuDNN v7.1.1 (Feb 28, 2018), for CUDA 8.0

Download cuDNN v7.0.5 (Dec 11, 2017), for CUDA 9.1

Download cuDNN v7.0.5 (Dec 5, 2017), for CUDA 9.0

Download cuDNN v7.0.5 (Dec 5, 2017), for CUDA 8.0

Download cuDNN v7.0.4 (Nov 13, 2017), for CUDA 9.0

Download cuDNN v7.0.4 (Nov 13, 2017), for CUDA 8.0

Download cuDNN v6.0 (April 27, 2017), for CUDA 8.0

Download cuDNN v6.0 (April 27, 2017), for CUDA 7.5

Download cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0

Download cuDNN v5.1 (Jan 20, 2017), for CUDA 7.5

Download cuDNN v5 (May 27, 2016), for CUDA 8.0

Download cuDNN v5 (May 12, 2016), for CUDA 7.5

Download cuDNN v4 (Feb 10, 2016), for CUDA 7.0 and later.

Download cuDNN v3 (September 8, 2015), for CUDA 7.0 and later.

Download cuDNN v2 (March 17,2015), for CUDA 6.5 and later.

Download cuDNN v1 (cuDNN 6.5 R1)

7、基本環境終於安裝完了,剩下最后一步了,安裝TensorFlow-gpu

正常是可以直接pip install tensorflow-gpu,安裝完全沒有毛病,但是測試的時候會出現問題:

ImportError: libcublas.so.10.0: cannot open shared object file

這是因為這種安裝方式默認安裝都是TensorFlow最新版本,即安裝的是TensorFlow1.13,這個版本是無法和cuda9.0兼容的,然后我在國外一網站看到如下解釋:

地址:https://github.com/tensorflow/tensorflow/issues/26182

Latest TensorFlow supports cuda 8-10. cudnn 6-7.

Each TensorFlow binary has to work with the version of cuda and cudnn it was built with. If they don't match, you have to change either the TensorFlow binary or the Nvidia softwares.

Official tensorflow-gpu binaries (the one downloaded by pip or conda) are built with cuda 9.0, cudnn 7 since TF 1.5, and cuda 10.0, cudnn 7 since TF 1.13. These are written in the release notes. You have to use the matching version of cuda if using the official binaries.

If you don't like to change your Nvidia software, you can:

(1) Use a different version of TensorFlow

(2) Use non-official binaries built by others. e.g.: https://github.com/mind/wheels/releases, https://github.com/hadim/docker-tensorflow-builder#builds,

https://github.com/inoryy/tensorflow-optimized-wheels

(3) Build the binaries by yourself from source with your version of Nvidia software.

說明最新版本的TensorFlow需要時cuda10和cudnn7,而上文我安裝的是cuda9.0,所以TensorFlow-gpu應該是TF1.13以下的版本,如果你不小心pip安裝了,可以最新安裝的這個TensorFlow卸載:

pip uninstall tensorflow-gpu

基本幾十秒就卸載完成了

然后再重新安裝一個低版本的TensorFlow,這里我安裝的是TensorFlow1.9.0

所以直接再執行:pip install tensorflow-gpu==1.9.0

安裝完成后再測試就無報錯了,至此整個的安裝過程就結束了

8、最后我們檢測GPU是否使用

在python中輸入

from tensorflow.python.client import device_lib

print(device_lib.list_local_devices())

輸出為

即可。

最后測試TensorFlow-gpu

import tensorflow as tf

hello = tf.constant('Hello, TensorFlow!')

sess = tf.Session()

print(sess.run(hello))

輸出:類似紅色框中信息,即可

最后當我們開始真正跑模型時候可以輸入nvidia -smi,可以查看GPU的運行狀態,包括溫度,GPU使用率等等信息;

具體可以參考https://blog.csdn.net/Bruce_0712/article/details/63683787 CUDA之nvidia-smi命令詳解

最后附上本文寫作過程中參考的博客:

1、https://blog.csdn.net/u010420283/article/details/82874588 服務器從零搭建GPU版本的TensorFlow環境

2、https://blog.csdn.net/Oh_My_Fish/article/details/78861867 TensorFlow-gpu 在 CentOS 7 下的完全安裝手冊

3、https://www.huaweicloud.com/product/gpu.html 華為雲購買P1服務器

4、https://support.huaweicloud.com/usermanual-ecs/zh-cn_topic_0141194659.html 購買p1注意事項

5、https://blog.csdn.net/gaoxurong123456/article/details/79041168 安裝與卸載tensorflow-gpu

6、https://blog.csdn.net/gsch_12/article/details/79368990 載入tensorflow出現錯誤,ImportError: libcublas.so.9.0

7、https://blog.csdn.net/qysh123/article/details/79977891 安裝tensorflow報ImportError: libcublas.so.9.0: cannot open shared object file的解決方法

8、https://github.com/tensorflow/tensorflow/issues/26182 ImportError: libcublas.so.10.0: cannot open shared object file: No such file or directory

9、https://blog.csdn.net/Lucifer_zzq/article/details/76675239 最正確的姿勢安裝cudnn,網上大多數教程都太坑了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM