1. 程式人生 > >使用docker在Ubuntu上安裝TensorFlow-GPU

使用docker在Ubuntu上安裝TensorFlow-GPU

基於docker在Ubuntu上搭建TensorFlow-GPU計算環境

由於實驗室的伺服器有多人共享使用,而不同人的程式碼對應的keras和tensorflow版本不一致,所以對應的cuda版本也不相同,因此,考慮使用docker安裝自己的容器,這樣就可以避免共享cuda版本不一致造成的麻煩。(不過有貼子說使用docker的話,GPU效能只能發揮80%,所以有利有弊吧)

安裝docker

首先,檢測是否裝好docker,如果安裝好,則輸入docker run hello-world會有如下的提示資訊

# wangyunpeng @ user-SYS-7048GR-TR in ~ [10:28:36] 
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete 
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

如果沒有安裝好,按照如下網址的教程進行Ubuntu上docker的安裝
https://docs.docker.com/install/linux/docker-ce/ubuntu/

特別注意,有些教程會讓你在安裝完docker後修改映象源,就是改/etc/systemd/system/docker.service.d/override.conf或者改/etc/docker/daemon.json這兩個檔案。如果改錯了,這兩個檔案如果配置不正確,docker會無法正確啟動

安裝tensorflow-gpu

主要最後成功安裝的參考的流程還是官網的https://www.tensorflow.org/install/docker
因為要安裝GPU版本的tensorflow,所以要安裝 nvidia-docker
tags的網址在https://hub.docker.com/r/tensorflow/tensorflow/tags/

首先檢視是否有gpu ,使用如下命令lspci | grep -i nvidia,如果有gpu會有如下類似的結果
檢查是否有gpu

其次檢查是否安裝了nvidia-docker,使用如下命令docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi,如果安裝好了,會有如下類似的結果
檢查是否安裝了nvidia-docker
當然,一開始nvidia-docker肯定是沒裝的,所以用以下命令把nvidia-docker先安裝好,如果想看詳細版的,或者Centos等系統安裝,可以參考下面的網址,https://github.com/NVIDIA/nvidia-docker

# If you have nvidia-docker 1.0 installed: we need to remove it and all existing GPU containers
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker

# Add the package repositories
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update

# Install nvidia-docker2 and reload the Docker daemon configuration
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd

# Test nvidia-smi with the latest official CUDA image
docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi

指定自己的gpu版本

當然,一般情況下都不會用latest最新的版本(親身體驗過,最新的nightly-devel開發版本經常有bug),所以要自己指定一個版本,我指定的是tensorflow/tensorflow:1.12.0-gpu-py3,當然這個版本可以在如下網址上找到https://hub.docker.com/r/tensorflow/tensorflow/tags/

選擇帶有gpu標誌的,別選最新的開發版就好,然後輸入如下命令測試,下面這句話就是用nvidia-docker,使用tensorflow/tensorflow:1.12.0-gpu-py3的image映象,執行"import tensorflow as tf; tf.enable_eager_execution(); print(tf.reduce_sum(tf.random_normal([1000, 1000])))"這段程式

docker run --runtime=nvidia -it --rm tensorflow/tensorflow:1.12.0-gpu-py3 \
python -c "import tensorflow as tf; tf.enable_eager_execution(); print(tf.reduce_sum(tf.random_normal([1000, 1000])))"

測試成功的話,會刷刷地出GPU啟動的過程。

然後,如果想進入bash互動式介面的話,啟動一個container容器,輸入:docker run --runtime=nvidia -it tensorflow/tensorflow:1.12.0-gpu-py3 bash,然後此處沒有用--name="xxx"引數指定container,docker會自動給你分配一個名字,使用docker container ls或者docker ps -a檢視即可,後者是檢視所有停止/正在執行的container。
此時系統分配給container容器的的name為upbeat_pascal,用下面命令啟動,關閉容器即可。

docker start upbeat_pascal
docker exec -it upbeat_pascal /bin/bash
docker stop upbeat_pascal

最關鍵的是,每次在容器裡面操作完成後,都要記得commit固化為image儲存下來,使用如下命令把upbeat_pascal這個container容器固化成名為success的image,以後就不怕容器被刪掉後,改動丟失了。

# 把容器upbeat_pascal,固化為image,名為success
docker commit upbeat_pascal success

刪除upbeat_pascal這個容器:

docker rm upbeat_pascal

當然docker run還有很多方便的引數,比如說-v掛載共享目錄,-v 本地目錄:虛擬機器目錄;-p埠轉發-p 本地埠:虛擬機器埠

docker run --runtime=nvidia -it -v /data/wangyunpeng/download:/home -p 8888:8888 success bash

參考資料
https://www.tensorflow.org/install/docker

https://github.com/NVIDIA/nvidia-docker