1. 程式人生 > >深度學習環境配置docker+pycharm+GPU

深度學習環境配置docker+pycharm+GPU

前言

在機器學習過程中,可能要使用各種機器學習框架,如tensorflow,mxnet,caffe等等。相信配過這些環境的人都對這個過程很是厭煩。有沒有一種更好的方法呢?回答是肯定的:有!下面就隆重介紹一下一個神奇的工具docker。

docker

docker是一個很強大的工具,非常方便開發,測試以及釋出產品。並能保證在這幾個環節中軟體執行的環境是一模一樣的。對docker不太熟悉的人可以暫時把docker當做一個輕量級的虛擬機器(注意:docker和虛擬機器是不一樣的,虛擬機器需要大量的資源來模擬硬體,執行作業系統。而docker幾乎不會有計算效能的損失)。下面說幾個docker的概念:

  • image: 就是映象,是別人或自己做好的機器學習的環境,只要下載下來就可以了。這裡是一些別人提交的映象docker hub
  • container: 也叫容器,是docker根據映象產生的,一個映象可以產生多個容器。我們的程式碼執行實際上是在容器中。容器中也可以裝這種軟體但容器停止執行後並不會提交到映象中,如果要儲存這些改變可以使用commiting指令(這裡我也沒有仔細研究)。
  • deamon: daocker守護程序,當安裝完docker並啟動後docker守護程序就開始執行,用來管理映象、容器等。可以通過docker API和socket兩種方式與deamon進行互動。

開始配置

先說一下我當時開始研究這個的目的實際上是因為之前聽說docker非常方便,正好又準備安裝mxnet,mxnet的官網也提供docker方式安裝的教程,因此就試了一下。按說有教程那還不簡單,問題是mxnet的教程只教到mxnet安裝成功,然後在terminal裡啟動容器,就開始程式設計,我總不能在終端裡搞開發吧?於是我的研究之路就開始了。

環境

  • 系統:ubuntu16.04
  • nvidia驅動版本:375.20
  • cuda:8.0.61
  • cudnn:6.0.21

安裝docker和MXnet

  1. 按照這裡的提示安裝docker(可以選擇CE版)
  2. 按照這裡的提示是docker執行不需要超級使用者許可權(也就是不用使用sudo,如果不做這一步以後執行docker指令時前邊要加sudo。這一步在mxnet官網說是可選的,我開始偷懶就沒做,這會導致後邊pycharm連線docker時許可權不夠的問題,所以還是做了吧
    )。
  3. 按照這裡的提示安裝nvidia-docker2(這一步是為了能夠使用GPU運算)
  4. 拉取MXnet docker 映象
    $ docker pull mxnet/python:gpu # Use sudo if you skip Step 2
    使用下邊的指令檢視映象是否拉取成功

    $ docker images # Use sudo if you skip Step 2
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    mxnet/python        gpu                 493b2683c269        3 weeks ago         4.77 GB
  5. 執行如下指令就可以使用MXnet了

    $ nvidia-docker run -it mxnet/python:gpu bash # Use sudo if you skip Step 2 in the installation instruction
    
    # Start a python terminal
    
    root@4919c4f58cac:/# python
    >>> import mxnet as mx
    >>> a = mx.nd.ones((2, 3), mx.gpu())
    >>> b = a * 2 + 1
    >>> b.asnumpy()
    array([[ 3.,  3.,  3.],
           [ 3.,  3.,  3.]], dtype=float32)

    恭喜你!到了這裡你已經成功安裝了docker和mxnet,但問題是我總不能在terminal裡做開發吧?
    不行,還要繼續研究!

PyCharm設定

用過python的人對pycharm肯定非常熟悉了,能不能在pycharm裡使用docker呢?pycharm says-yes!不過,首先你需要一個Professional edition版的pycharm。下面開始設定(英文好的看這裡):

  1. 保證Docker integration和Python Docker兩個外掛是開啟的
    Professional版的pycharm預設是安裝了這兩個外掛,並且是開啟的。
  2. docker配置
    在pycharm的設定->build,Execution,Deployment->Docker頁面裡,點選‘+’號就會出現一個docker設定頁面,我們是Linux系統所以我們在Connect to Docker daemon with選項裡直接選Unix socket就可以了。如果設定成功會在下方看到Connection successful的提示,如果你跳過了安裝docker和MXnet中的第2步,這一步就會有許可權不夠的錯誤提示。這裡寫圖片描述
    如果這一步成功了,就可以在pycharm下方看到Docker tool window,這是一個用來管理映象,容器的視覺化工具。
    這裡寫圖片描述
    在這裡可以很方便的啟動,停止,新增和刪除映象、容器。也可以檢視容器的一些引數。當然也可以使用docker的指令進行這些操作。
    這裡寫圖片描述

  3. 為你的程式碼配置映象裡的直譯器
    其實整篇文章就只為了這一步,只要我們的程式碼能使用映象裡的python直譯器,那就達到了我們的目的了。新增本地直譯器大家應該都會。在Professional版的pycharm裡有個新增遠端直譯器。我們就是用這個
    這裡寫圖片描述
    點選後會出現下邊這個對話方塊
    這裡寫圖片描述
    我們選擇Docker這個選項,此時Server和Python interpreter path已經自動填好,大家不用管它,主要是選擇你要使用的映象。如果你不使用GPU版的映象,那麼其實到了這一步就已經配置好了。
    說一下我這裡為什麼選擇tensorflow/tensorflow:latest-gpu映象,不是已經裝好了MXnet了嘛?說多了都是淚啊!MXnet的映象裡並沒有吧MXnet安裝在python的安裝包路徑下,而是在根路徑下,使用nvidia-docker run -it mxnet/python:gpu bash指令啟動時通過設定PYTHONPATH=/mxnet/python環境變數讓python可以使用,但是!當你在pycharm中啟動時,這個環境變數是沒有設定的。所以import mxnet會不成功。這個問題還是有方法解決的,就是在Edit Configuration裡新增環境變數。而且只能在這裡新增,別的地方新增不好用,反正我實驗的是不行的。
    這裡寫圖片描述
    使用tensorflow的映象就不會有這個問題,因為tensorflow是安裝在python的的路徑下的。所以請大家在接下來也先使用tensorflow作為這次配置的映象,我們這次的目標是能在GPU上跑,所以用下面的指令下載GPU版的
    docker pull tensorflow/tensorflow:latest-gpu

  4. 使用GPU執行你的程式碼
    到這裡有人就會發現問題,之前我們裝了dockernvidia-docker那pycharm用的是哪一個呢?很不幸的是pycharm使用的是標準的docker。 那麼這就有問題,我們不能使用GPU做運算。如何才能使用GPU呢?
    實際上如果我們用的是nvidia-docker1我們可能還需要安裝docker-composenvidia-docker-compose,很不幸nvidia-docker-compose不能和nvidia-docker2相容,那怎麼辦?看這裡,這個連線提供瞭解決的方法就是吧"default-runtime": "nvidia",新增到/etc/docker/daemon.json檔案中

    {
        "default-runtime": "nvidia",
        "runtimes": {
            "nvidia": {
                "path": "/usr/bin/nvidia-container-runtime",
                "runtimeArgs": [ ]
            }
        }
    }

    接下來是非常關鍵的一步,也是最白痴的一步,我在這裡卡了很久。
    重啟docker的守護程序
    重啟docker的守護程序
    重啟docker的守護程序
    sudo pkill -SIGHUP dockerd
    由於我的電腦下班後不關機,所以只要我不主動重啟docker守護程序,這幾天就從沒有重啟過。這樣我們剛剛改的daemon.json檔案是不會生效的。所以一直不能使用GPU運算。

小結

好啦,現在大家就可以使用映象裡的python直譯器執行pycharm裡的程式碼了,而且即使你本機上沒有裝tensorflow,寫程式碼時也會有自動補全,其實在做完PyCharm設定中的第3步時寫程式碼就有自動補全功能了,只是執行時會提示找不到libcuda.so.1的庫,導致不能使用GPU執行。

最後

現在大家可以繼續使用PyCharm愉快的程式設計了。另外有了docker這個神器,以後再也不用發愁環境搭建,電腦重灌系統啦。對測試團隊,以及產品的部署也是很方便的。
另外,PyCharm還有一種方式和docker配合,有興趣的可以研究下docker-compose。但由於這種方式在執行程式碼時會有一個docker-compose up的過程,感覺不是很爽。也許有有其他我不瞭解的優點。
祝大家學習愉快!