1. 程式人生 > >nvidia-docker快速遷移caffe環境(GPU+VNCserver+lxde桌面)

nvidia-docker快速遷移caffe環境(GPU+VNCserver+lxde桌面)

有時候我們自己在本機上費力搭建了很複雜的環境(cuda(5,6,7,8)+cudnn+opencv(2,3)+matlab等等其他依賴),我們想遷移這個環境到另一臺機器上就需要重新安裝一遍,如果另一臺機器不是那麼“乾淨”裝了一些可能和你不一致的東西比如opencv,所以需要更換版本這時候需要徹底解除安裝乾淨,否則又會出現亂七八糟的問題,總之一句話遷移成本很高,風險很大。

回到正題,首先簡單介紹下虛擬機器和docker的區別

  1. vm與docker框架,直觀上來講vm多了一層guest OS,同時Hypervisor會對硬體資源進行虛擬化,docker直接使用硬體資源,所以資源利用率相對docker低也是比較容易理解的
  2. 讓我們假設你有一個容器映象(image)容量是1GB,如果你想用一個完整的虛擬機器來裝載,你得需要容量的大小是1GB乘上你需要虛擬機器的數量。但使用Linux容器虛擬化技術(LXC)和AuFS,你可以共享1GB容量,如果你需要1000個容器,假設他們都執行在同樣的系統影像上,你仍然可以用稍微比1GB多一點的空間來給容器系統,一個完整的虛擬化系統得到了分給它的自有全部資源,只有最小的共享。你獲得了更多的隔離,但是這是很龐大的(需要更多的資源)使用Linux容器虛擬化技術(LXC),隔離性方面有所缺失,但是他們更加輕量,而且需要更少資源。所以你可以輕鬆執行1000個容器在一個宿主機器上,甚至眼都不眨。

docker和nvidia-docker的區別

由於我們深度學習需要用到GPU,使用docker時,需要對映裝置等等,docker容器對宿主機的依賴就會很多也就失去了便捷,並不能讓我們很舒服的遷移環境,nvidia-docker則很好的封裝了這些,只需要容器內的cuda版本和宿主機相同就行(這個要求很低了,而且這個要求現在也基本可以通過docker hub上別人做好的帶有各種cuda版本的映象來滿足,所以幾乎無要求)
其實nvidia-docker只是run 和 exec命令和docker執行不同,其餘的和docker執行的一模一樣

nvidia-docker安裝(ubuntu為例)

# **首先安裝docker**
1. sudo apt-get install -y --no-install-recommends \ apt-transport-https \ ca-certificates \ curl \ software-properties-common 2. curl -fsSL https://apt.dockerproject.org/gpg | sudo apt-key add - #如果此處出現認證錯誤,curl後面-k忽略認證 3. sudo add-apt-repository \ "deb https://apt.dockerproject.org/repo/ \ ubuntu-$(lsb_release -cs) \ main" 4. sudo apt-get update 5. sudo apt-get -y install docker-engine 6. sudo docker run hello-world #它會自動下載這個hello-world映象,然後執行,成功出現hello world就是docker就是裝好了 # **然後安裝nvidia-docker** 7. 下載nvidia-docker的安裝包 https://github.com/NVIDIA/nvidia-docker/releases #deb型別: https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.0/nvidia-docker_1.0.0-1_amd64.deb 8. sudo dpkg -i nvidia-docker_1.0.0-1_amd64.deb ### 有一點需要注意docker默然使用root所以docker的每個命令需要sudo官方解釋是安全,我們自己用則無妨 # 建立docker組 sudo groupadd docker # 將當前使用者加入docker組 sudo gpasswd -a ${USER} docker # 重新啟動docker服務(下面是CentOS7的命令) sudo systemctl restart docker # .重新整理Docker成員 newgrp - docker # 之後使用docker就不用sudo了,稍微方便點

docker hub

cuda-caffe
—Ubuntu Core 14.04 + CUDA 8.0 + cuDNN v5 + Caffe. Includes Python interface.
Requirements
—NVIDIA Docker - see requirements for more details.
Usage
—Use NVIDIA Docker: nvidia-docker run -it kaixhin/cuda-caffe.
這個映象的tags有6.5 7.0 7.5 8.0的cuda版本,基本滿足使用

 # 8.0意為cuda8.0,根據自己的需要修改,這個下載比較大所以很慢有空我會把我下好的映象放到國內的百度雲盤
   docker pull kaixhin/cuda-caffe:8.0 
 # 下載後使用下面命令就會看到你已load的映象,注意docker預設在/目錄,所以注意/分割槽的大小
   docker images
 # REPOSITORY   TAG   IMAGE   ID   CREATED   SIZE
 # xxx          8.0    xxx     x     xxx       x
   nvidia-docker run -ti -p 宿主埠:docker容器埠 -v 宿主機地址:docker容器內地址 image名字(或者ID):8.0 
   #不加tag預設是latest
   # -t 以為tty -i 意為可互動 如果-d就直接進後臺 -v 就是檔案對映可以用於宿主機和docker容器檔案傳輸,-p是埠對映待會會用到

到此處基本已經可以用終端來在容器中來跑你的網路了,但是有時候需要matlab或者需要個桌面環境比較順手,這個時候就需要給容器裡的linux裝個桌面然後傳輸出來

安裝LXDE桌面 VNCserver

 # 先對映好埠進入容器
 nvidia-docker run -ti -p 5901:5901 kaixhin/cuda-caffe:8.0 
 # 安裝lxde vncserver
 sudo apt-get update
 sudo apt-get install xorg lxde-core tightvncserver
 # 或者到https://www.realvnc.com/download/vnc/linux/下載vncserver的deb包安裝
 # 此映象預設root使用者,且沒有設定USER和HOME環境變數啟動vncserver時會有錯誤,所以先執行以下命令
  vim /root/.bashrc 
 # 在最後加入以下程式碼後儲存
  export USER=root
  export HOME=/root
 # 然後立即生效該環境變數
  source /root/.bashrc
 # 此處需要設定密碼,還有一個view-only密碼可選否
  vncserver -geometry 1024x768 :1 # 如果你啟動時對映的是590n,那麼此處就是vncserver :n
 # 其他(重新啟動vncserver)
  vncserver -kill :1 && rm /tmp/.X1-lock && rm /tmp/.X1-lock
  vncserver -geometry 2400x1300 :1

通過VNCviewer連線容器內桌面

下載VNCviwer https://www.realvnc.com/download/viewer/
然後輸入地址:127.0.0.1:5901 然後輸入你剛才設定的密碼就成功了
lxde桌面調節解析度
1. sudo vim /etc/xdg/lxsession/LXDE/autostart
最後一行新增
2. @xrandr –auto –output DVI-1 –primary –mode 1680x1050 –left-of DVI-0

docker的其他

 # 檢視正在執行的容器
  docker ps
 # 刪除所有容器
  docker rm `docker ps -a |awk '{print $1}' | grep [0-9a-z]`
 #  儲存容器當前的狀態到一個映象
  docker commit -m "test" 容器ID 新映象名字
 # 儲存映象到一個檔案
  docker save 映象名字>xxx.tar
 # 載入一個映象檔案tar
  docker load < xxx.tar
 # 檢視載入的映象
  docker images
 # 進入掛起的容器
  nvidia-docker exec -it 9f /bin/bash 
 # 重啟退出的容器
  nvidia-docker restart f9f