利用docker安裝tensorflow,並遠程使用

1.安裝nvidia驅動
2.安裝docker

	1. sudo apt-get remove docker docker-engine docker.io containerd runc
	2. sudo apt-get update
	3. sudo apt-get install \
          apt-transport-https \
          ca-certificates \
          curl \
          gnupg-agent \
          software-properties-common	
        4.curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
	5.sudo add-apt-repository \
          "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
           $(lsb_release -cs) \
           stable"	
        6.sudo apt-get update
	7.sudo apt-get install docker-ce docker-ce-cli containerd.io

 

 
3.安裝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

 

4.拉取鏡像(docker基本操作在第6部分)
  1. 使用國內安裝好的集成環境,包括cuda+cudnn+tensorflow——gpu,示例是集成環境
    1. dockerhub地址
    2. 選擇合適的標籤(我們使用的標籤爲:all-py36-jupyter等價於all-jupyter-py36)
    3. 執行命令
      1. sudo docker pull ufoym/deepo:all-py36-jupyter
  2. 使用英偉達提供的docker鏡像,這裏的鏡像只安裝了cuda,可能需要自己安裝對應版本的python和tensorflow
    1. dockerhub地址
5.創建容器
  1. 測試容器內的cuda是否可以連通顯卡驅動
    1. sudo docker run --runtime=nvidia --rm ufoym/deep0:all-py36-jupyter nvidia-smi
    2. 正常
    3. 報錯
      1. 解決方案
        sudo mkdir -p /etc/systemd/system/docker.service.d
        sudo tee /etc/systemd/system/docker.service.d/override.conf <<EOF
        [Service]
        ExecStart=
        ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=nvidia=/usr/bin/nvidia-container-runtime
        EOF
        sudo systemctl daemon-reload
        sudo systemctl restart docker
        sudo tee /etc/docker/daemon.json <<EOF
        {
            "runtimes": {
                "nvidia": {
                    "path": "/usr/bin/nvidia-container-runtime",
                    "runtimeArgs": []
                }
            }
        }
        EOF
        sudo pkill -SIGHUP dockerd
        1. 原來是nvidia-docker 沒有註冊:docker: Error response from daemon: Unknown runtime specified nvidiawhile running nvidia docke 接着尋找如何註冊: docker-engine-setup
        2. 執行以下命令進行註冊
        3. 修改配置
        4.  再去開啓鏡像,done。
  2. 創建一個容器,並進去測試是否支持gpu和查看tensorflow版本
    1. sudo docker run --name py36 --runtime=nvidia -it -v /home/wjg/data:/data  ufoym/deepo:all-py36-jupyter  bash
    2. 可以看到是支持gpu的。版本爲1.8.0
  3. 查看容器內的cuda版本
    1. ls /usr/local/ 可以看到爲cuda-9.0
  4. 開啓容器的ssh,可以遠程連接此docker容器
    1. 以下命令在容器中執行
      1. apt-get update 
      2. apt-get install openssh-server
      3. cd /
      4. ./etc/init.d/ssh stop //停止ssh服務
      5. 修改ssh配置,允許root用戶使用密碼登錄此容器
        1. vim /etc/ssh/sshd_config
        2. 註釋掉這行:#PermitRootLogin prohibit-password 改行表示禁止root用戶使用密碼登錄
        3. 添加一條語句:PermitRootLogin yes 表示允許root用戶使用密碼登錄
      6. ./etc/init.d/ssh start //開啓ssh
      7. 修改root密碼
        1. passwd root
        2. 輸入新的密碼即可
    2. 在宿主機執行以下命令,將修改後的容器提交爲鏡像,一定要在容器運行的情況下,在宿主機執行命令
      1. docker commit -m "描述信息" -a "作者名" 容器ID 鏡像名:標籤
      2. 如docker commit -m "tf_gpu_1.8_ssh" -a "wjg" 7be82a146744 tfSSH:1.0
    3. 實例化新提交的鏡像,並映射ssh的22號端口
      1. sudo docker run --name py36SSH --runtime=nvidia -it -v /home/wjg/data:/data  -p 42022:22 tfSSH:1.0 bash
    4. 此時就可以用使用宿主機的 ip:42022登錄docker容器,也可以pycharm直接調用該容器的python解釋器。
  5. ssh開機自啓動
     
    1. 在容器的/root/.bashrc下添加如下shell腳本
    2. #========================start ssh==============
      result=`ps -ef | grep ssh | grep -v "grep"`
      pattern="ssh"
      if [ "$result" = "" ];then
          echo "ssh is not running, ssh is starting......."
          if [ -f /etc/init.d/ssh ];then
              cd /etc/init.d
               ./ssh start
          else
              echo "could not find ssh in /etc/init.d/ssh"
          fi
      else
          echo "ssh is running"
      fi

       

6.docker基本操作
  1. 鏡像操作
  1. docker search 關鍵字   去dockerhub搜索相關鏡像
  2. docker pull 鏡像名:tag   拉取鏡像,:tag是可選的,默認latest
  3. docker images 查看本地所有鏡像
  4. docker rmi 鏡像id 刪除本地指定鏡像
  5. 容器操作
  1. doker run  --name container-name  -d -it  image-name安裝docker鏡像形成容器,container-name:爲容器起個名稱,image-name:安裝哪個鏡像。
    1. -d 表示後臺運行
    2. -p 主機端口:內部端口:主機端口映射到容器內部端口
    3. -i 以交互模式運行容器,通常與-t一起使用
    4. -t 分配一個僞終端
  2. docker ps 查看運行中的容器,加上-a,可以查看所有容器
  3. docker stop/start container-name/container-id 啓動關閉容器
  4. dicker rm container-id 刪除容器
  5. docker logs container-name/container-id 容器日誌
  6. docker exec -it container-name/container-id /bin/bash 以交互的方式進入一個正在運行的容器
  7. docker attach container-id 以交互的方式進入一個正在運行的容器
  8. docker commit -m "描述信息" -a "作者名" 容器ID 鏡像名:標籤  使一個容器變成一個鏡像(一定要在容器運行的情況下執行)
  9. Ctrl+P+Q 推出容器但不關閉容器
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章