Docker搭建tensorflow-gpu環境

前言:連續配了幾個晚上,搞深度學習的環境,之前配成功過,但是這次再配的時候,發現遇到的坑和以前不一樣,算了,直接上Docker大法,不想爲環境再浪費寶貴的時間

 

首先我們先了解一下,docker配深度學習環境需要什麼。

答:只需1.顯卡驅動,2.docker 3.深度學習環境鏡像

對就是這麼簡單。

1.首要的是顯卡驅動,在下載顯卡驅動之前先查一下,你即將要安裝的版本,最低是多少。

  比如我是要安裝cuda10的,那麼傳送門,看一下你應該需要安裝的最低版本。

知道了最低的版本。

先不管其他,卸載之前可能安裝的驅動:

sudo apt-get --purge remove "*nvidia*"

看一下系統推薦的顯卡驅動:

sudo ubuntu-drivers devices

查到推薦的顯卡驅動,一般就是那個free的版本,18.04直接是指令安裝就有,沒有的上官網去下載。

重點:安裝驅動之前,一定一定,要記得關閉ubuntu的secue boot,不知道怎麼關,來教你,傳送門

安裝好了驅動之後,運行nvidia-smi,可能會報以下錯誤:

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver 18.04

但是如果你cd 到/usr/src 下看到你的顯卡驅動版本,那麼就不用擔心了,繼續,因爲我是第二天就好了(知道爲什麼的大佬求教)

2.安裝docker

這個網上一大堆教程,主要思路是先安裝docker-ce,然後安裝Nvidia Docker2

參考這位大神寫的安裝docker部分,傳送門,其中有一個/etc/docker/daemon.json 

內容修改成,沒有這個文件需要新建,這是唯一我和他安裝docker不一樣的部分。

{
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

3.開始拉tensorflow-gpu的鏡像,有很多教程直接上nvidia官網拉cuda和cudnn的環境,裏面並沒有tensorflow,其實搞起來很麻煩。後來我直接上docker-hub,搜tensorflow的鏡像一大堆,拉鏡像之前,先看一下自己需要的版本,在tensorflow官網有

因爲我下的cuda10,所以直接上1.13.1的鏡像

docker pull tensorflow/tensorflow-1.13.1-gpu-py3

拉下載之後,創建container運行

docker run -it --name DL_ENV02 -v /home/jun/DL2/:/home/jun/DL2/ --runtime=nvidia -e NVIDIA_VISIBLE_DEVICE=0 tensorflow/tensorflow:1.13.1-gpu-py3

這個我大概解釋一下,DL_ENV02是我的容器名字,然後/home/jun/DL2/:/home/jun/DL2/,是信息交互的文件夾位置,一個在容器內,一個在你的主機上,就通過這個路徑和容器進行信息交互。NVIDIA_VISIBLE_DEVICE=0是你的顯卡設備號,我就一張卡,所以默認是0

 

如果遇到下面的坑:

docker: Error response from daemon: Unknown runtime specified nvidia.

問題解決傳送門,安裝好之後,問題消失,完美。

搞定之後,我們測試一下,運行下面的程序,

import tensorflow as tf
 
with tf.device('/cpu:0'):
    a = tf.constant([1.0,2.0,3.0],shape=[3],name='a')
    b = tf.constant([1.0,2.0,3.0],shape=[3],name='b')
with tf.device('/gpu:1'):
    c = a+b
   
#注意:allow_soft_placement=True表明:計算設備可自行選擇,如果沒有這個參數,會報錯。
#因爲不是所有的操作都可以被放在GPU上,如果強行將無法放在GPU上的操作指定到GPU上,將會報錯。
sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True,log_device_placement=True))
#sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
sess.run(tf.global_variables_initializer())
print(sess.run(c))

結果是【2,4,6】

這段是參考別人的博客,這裏是傳送門

關於docker的指令:

查看有哪些容器:docker container ls

運行容器:docker start <container-name>

進入容器:docker attach <container-name>

退出容器:exit

搞定,碎覺!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章