前言:連續配了幾個晚上,搞深度學習的環境,之前配成功過,但是這次再配的時候,發現遇到的坑和以前不一樣,算了,直接上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
搞定,碎覺!