深度學習環境配置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
- 按照這裡的提示安裝docker(可以選擇CE版)
- 按照這裡的提示是docker執行不需要超級使用者許可權(也就是不用使用sudo,如果不做這一步以後執行docker指令時前邊要加sudo。這一步在mxnet官網說是可選的,我開始偷懶就沒做,這會導致後邊pycharm連線docker時許可權不夠的問題,所以還是做了吧
- 按照這裡的提示安裝nvidia-docker2(這一步是為了能夠使用GPU運算)
拉取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
執行如下指令就可以使用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。下面開始設定(英文好的看這裡):
- 保證Docker integration和Python Docker兩個外掛是開啟的
Professional版的pycharm預設是安裝了這兩個外掛,並且是開啟的。 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的指令進行這些操作。
為你的程式碼配置映象裡的直譯器
其實整篇文章就只為了這一步,只要我們的程式碼能使用映象裡的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
使用GPU執行你的程式碼
到這裡有人就會發現問題,之前我們裝了docker
和nvidia-docker
那pycharm用的是哪一個呢?很不幸的是pycharm使用的是標準的docker
。 那麼這就有問題,我們不能使用GPU做運算。如何才能使用GPU呢?
實際上如果我們用的是nvidia-docker1
我們可能還需要安裝docker-compose
和nvidia-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
的過程,感覺不是很爽。也許有有其他我不瞭解的優點。
祝大家學習愉快!