1. 程式人生 > >Ubuntu14.04下基於nvidia-docker的Tensorflow深度學習環境搭建

Ubuntu14.04下基於nvidia-docker的Tensorflow深度學習環境搭建

* 記錄一下配置過程,內容基本上是配置的每一步中遇到的問題及網上找到的對應方法,格式會比較混亂。做一些記錄,為學弟學妹們後來搭建新伺服器提供些參考(如果老師還給買新伺服器),也希望能幫到有需要的人。

系統配置:CPU 至強E5-2620 V3, GPU:NVIDA TITAN X,  OS:Ubuntu 14.04 LTS

實驗室到了塊TITAN X ,伺服器上終於有顯示卡了。週末搗鼓著裝上驅動把GPU支援的Tensorflow開發環境搭起來(之前一直在用cpu跑TF真的是慢啊)

首先,TITAN X額定功率是300W (也就是說高負荷長時間執行時平均功率在300W,因此峰值功率可能會超),要確保主機電源的功率要足夠。

TITAN X沒有VGA口,需要配一個轉接頭接顯示器。

2.  顯示器接顯示卡的輸出之後,進入Ubuntu時出現了黑屏的情況,命令列也進入不了的那種。

百度一番之後,嘗試進入恢復模式,:編輯grub
# vi /etc/default/grub
修改如下:


1
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nvidia.modeset=0"
2
 
3
 
4
#或者這樣也可
5
 
6
 
7
#GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset"


就能解決黑屏了。恢復模式中,VI無法儲存修改的話,需要重新掛載一次:


# mount-n -o remount / 

此處解決方法參考:

http://www.2cto.com/os/201307/225026.html

http://blog.csdn.net/sqzhao/article/details/9812527

3. 解決黑屏問題後,正常啟動進入系統。開始安裝NVIDIA驅動。之前我安裝過一塊版本很老的顯示卡的驅動,使用命令列安裝,非常麻煩...還得禁用集顯,關閉圖形介面,balabala...上次折騰了兩三天才弄好。然而這塊TITAN X並不用,通過包管理器在圖形介面點選幾下就可以了!幾分鐘搞定,不能再方便!

先去 Ubuntu Software Center 裡安裝 Synaptic Package Manager(新立得安裝包管理器)。開啟Synaptic,輸入:nvidia,選擇nvidia-352(根據顯示卡型號選擇),然後點APPLY,Synaptic 包管理器會把 nvidia-352 所要一併安裝的,都一起安裝,安裝完後,你會發現其實多安裝了很多東西。所以這個安裝驅動方式,比自己一個一個安裝那些包,保險很多很多。安裝之後,重啟即可。點選右上角的關於這臺計算機,發現圖形裡面顯示已經有TITAN了,大功告成。

4. 接著安裝docker。ubuntu是預設自帶docker的。但通常版本不足,需要手動升級到最新版本。

安裝升級docekr參考部落格:

http://www.linuxidc.com/Linux/2015-02/113784.htm

5.安裝nvidia-dockerplugin。有時會遇到docker-engine版本不足的情況。跟著第4步的第一個連結仔細排查一下重試一遍。


6.下拉映象。在docker hub中,搜尋tensorflow的映象。這裡使用tensorflow的官方映象。

連結:https://hub.docker.com/r/tensorflow/tensorflow/

其中有CPU版本、GPU(CUDA)版本的容器。

使用命令啟動容器,有時需要sudo:

$ nvidia-docker run -it -p 8888:8888tensorflow/tensorflow:latest-gpu

其中 -p 是埠對映。 可以在命令後面新增 bash ,這樣進入docker的shell,進行一些操作。需要啟動jupyter notebook的時候,在根目錄下執行 run_jupyter.sh即可

7.本地硬碟掛載到容器。命令 –v /宿主目錄:/容器內目錄


8.有時候nvidia-docker啟動會有點問題。

Tensorflow的github中給出的建議是:“Note: If you would have a problem running nvidia-docker you may trythe old way we have used. But it is not recomended. If you find a bug innvidia-docker report it there please and try using the nvidia-docker asdescribed above.”

連結:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/docker

使用命令:

$ export CUDA_SO=$(\ls/usr/lib/x86_64-linux-gnu/libcuda.* | xargs -I{} echo '-v {}:{}')

$ export DEVICES=$(\ls /dev/nvidia* | xargs-I{} echo '--device {}:{}')

$ docker run -it -p 8888:8888 $CUDA_SO$DEVICES gcr.io/tensorflow/tensorflow:latest-gpu

這個方法需手動掛載GPU。

在docker的shell中,通過ls -la /dec |grep nvidia 檢視顯示卡裝置,然後依次掛載。

# 掛載GPU的命令,每個裝置都需掛載

docker run -it --name NAME -v/home/:/mnt/home --privileged=true --device /dev/nvidia-uvm:/dev/nvidia-uvm--device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactlmyconda:cuda bash

#示例:

docker run -it -p 8888:8888  -v /home/:/mnt/home --privileged=true--device /dev/nvidia-uvm:/dev/nvidia-uvm --device /dev/nvidia0:/dev/nvidia0--device /dev/nvidiactl:/dev/nvidiactl --device/dev/nvidia-modeset:/dev/nvidia-modeset $CUDA_SO $DEVICESgcr.io/tensorflow/tensorflow:latest-gpu bash

9.執行jupyternotebook後,通過如下程式碼測試GPU能否使用,若沒有報錯則表示呼叫成功:

import tensorflow as tf

# '/gpu:'多塊GPU時指派第n塊GPU

with tf.device('/gpu:2'):

  a =tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')

  b =tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')

  c =tf.matmul(a, b)

# 新建 session withlog_device_placement 並設定為 True.

sess =tf.Session(config=tf.ConfigProto(log_device_placement=True))

# 執行這個 op.

print sess.run(c)

我運行了之前的一個小網路,執行成功後命令行中會有以下資訊:

I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcurand.so locally
I tensorflow/core/common_runtime/gpu/gpu_device.cc:951] Found device 0 with properties: 
name: TITAN X (Pascal)
major: 6 minor: 1 memoryClockRate (GHz) 1.531
pciBusID 0000:02:00.0
Total memory: 11.90GiB
Free memory: 7.96GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:972] DMA: 0 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] 0:   Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1041] Creating TensorFlow device (/gpu:0) -> (device: 0, name: TITAN X (Pascal), pci bus id: 0000:02:00.0)

10. 監控顯示卡的狀態,命令:nvidia-smi。享受GPU帶來的加速吧

這篇日誌寫的匆忙,零零散散,亂七八糟。配置過程中也得到了網上不少文章的幫助,我也寫一篇,希望能幫到其他人。

參考連結:

[1]. NVIDIA-DOCKER快速開始:https://github.com/NVIDIA/nvidia-docker/wiki#quick-start

[3]. TITAN X 驅動安裝:http://blog.csdn.net/u010167269/article/details/50703948

[4]. 在容器中執行TF的方式(使用nvidia-docker或docker):https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/docker

[4]. dockerhub中的TF官方映象:https://hub.docker.com/r/tensorflow/tensorflow/

[5]. Docker安裝:http://www.tuicool.com/articles/JBnQja