Docker--深度學習環境配置一站式解決方案

我最近有一些nmb想跟大家分享:

1. 在安裝某個庫的時候,明明是按官方說的一步步來,可是在我電腦上就是各種報錯。

2. 直接用pip或者anaconda安裝的OpenCV沒法調用本地的ffmpeg編解碼器,還有一些需要從頭編譯的庫直接利用conda安裝也會出現或多或少的問題。

3. 別人放在github的代碼我下載到本機後無法直接跑,我只想驗證一下他的結果,但是卻需要各種依賴庫,各種改環境變數,改變我本地的各種設置,最終系統改得連我自己都不認識了,就算跑通了它的代碼,要跑另一些又TM不行了。

畢竟不是CS本專業出身,對於操作系統和軟體的基礎不是很牢固,所以我再折騰了一周之後,終於決定投入docker的懷抱,並且自己封裝了一個image,涵蓋了目前做研究需要的各種深度學習和軟體庫:hub.docker.com/r/yiming 希望這篇簡介可以幫助大家擺脫環境的煩惱:

Docker是什麼?

中文社區給了簡潔的概括:

  • docker是一個開源的軟體部署解決方案;
  • docker也是輕量級的應用容器框架;
  • docker可以打包、發布、運行任何的應用。

在我看來,就是類似虛擬機的東西,只是不同點是虛擬機的硬體都是靠CPU虛擬出來的,而docker可以調用你的本地硬體進行計算,而且docker的封裝更為精簡。

Docker中最重要的兩個概念就是image和container,我從官網找到了以下解釋

Docker objects

When you use Docker, you are creating and using images, containers, networks, volumes, plugins, and other objects. This section is a brief overview of some of those objects.

IMAGES

An image is a read-only template with instructions for creating a Docker container. Often, an image is based on another image, with some additional customization. For example, you may build an image which is based on the ubuntu image, but installs the Apache web server and your application, as well as the configuration details needed to make your application run.

You might create your own images or you might only use those created by others and published in a registry. To build your own image, you create a Dockerfile with a simple syntax for defining the steps needed to create the image and run it. Each instruction in a Dockerfile creates a layer in the image. When you change the Dockerfile and rebuild the image, only those layers which have changed are rebuilt. This is part of what makes images so lightweight, small, and fast, when compared to other virtualization technologies.

CONTAINERS

A container is a runnable instance of an image. You can create, run, stop, move, or delete a container using the Docker API or CLI. You can connect a container to one or more networks, attach storage to it, or even create a new image based on its current state.

By default, a container is relatively well isolated from other containers and its host machine. You can control how isolated a container』s network, storage, or other underlying subsystems are from other containers or from the host machine.

A container is defined by its image as well as any configuration options you provide to it when you create or run it. When a container stops, any changes to its state that are not stored in persistent storage disappears.

簡言之,就像程序和進程的區別一樣,程序是一首曲子,和進程則是曲子的一次演奏。當你run一個container後,無論如何折騰當前的container都不會影響到image,當然,如果你想保存你對container的修改,請參考docker的commit命令。

Nvidia-Docker插件

Nvidia-Docker是英偉達官方出品的docker插件,專門用來允許container直接調用本地的英偉達GPU。不過目前只支持linux系統,需要在你的本機安裝好CUDA和CUDNN

Docker Hub

和github一樣,DockerHub是用來分享自己製作的image的平台,我做的image可以在這裡找到hub.docker.com/r/yiming

使用案例

  • 運行一個container,並且開啟互動式的命令行。當你運行這個命令後,就像遠程登錄了一台伺服器一樣,進入bash界面。

  • nvidia-docker run -it yiminglin/dl-image:latest

  • 載入home路徑到docker的container

    需要注意的是一旦你退出某個container,所有你做的東西都不會保存,所以為了保存數據和代碼,我們可以把某個目錄載入到container中,這樣我們在docker中對該目錄所做的修改都會保存到本機了。

    nvidia-docker run -v /home/yiming/:$(pwd) -it yiminglin/dl-image:latest

    上述命令把載入了我本地的home路徑,在container就可以在/home/目錄中看到我本地機器上保存在home目錄的所有東西:

  • 使用Jupyter notebook:

    Jupyter notebook是做實驗保存數據和分析的重要工具,也是我主要用的開發工具,如果你不需要打開命令行,而是直接想使用jupyter,可以用下面的命令:

    nvidia-docker run -v /home/yiming/:$(pwd) -it -p 8888:8888 yiminglin/dl-image:latest sh -c "jupyter notebook --allow-root --no-browser --ip 0.0.0.0 /home/yiming"

    該命令把本地home路徑載入container,並且把本地埠8888映射到docker container的8888埠(Jupyter的默認埠),最後中home目錄中打開notebook,可以看到提示如下:

    在瀏覽器輸入它提示的網站,就可以使用notebook了

  • 驗證container是否調用了GPU

    我用一個notebook代碼來驗證是否真的調用了GPU,首先利用

    nvidia-smi

    本地查看我的GPU狀態,

    只有一些系統進程,現在我們在上一步的notebook中新建一個python2的notebook,然後運行一些簡單的tensorflow代碼

    簡單的tensorflow測試代碼

    可以看到container命令行中的輸出為:

    本機的GPU狀態為

    由此可以看出nvidia-docker確實實現了container到GPU之間的數據傳輸。

推薦閱讀:

一個基於 TensorFlow 的「顏值評分」開源項目:FaceRank
TensorFlow初步(5)
一文打盡:線性回歸和邏輯斯蒂線性回歸

TAG:深度学习DeepLearning | TensorFlow | Docker |