基於docker的caffe環境搭建與使用示例
0. 引言
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上。因此,Docker給應用提供了一個從開發到上線均一致的程式碼環境,讓程式碼的流水線變得簡單不少。
以下是基於docker的caffe環境搭建過程,並給出使用示例。
1. 安裝Docker
2. 基於Docker安裝Caffe
在caffe官網上已經提供了建立caffe映象所需的Dockerfile,並且在docker hub上也能找到:https://hub.docker.com/r/elezar/caffe/。
1) 通過以下命令即可在本地建立caffe映象:
$ docker pull elezar/caffe: cpu
注意,如果要建立GPU版本,則將上述命令中的cpu改成gpu。
2) 下載完成後,測試是否安裝正確。
輸入:
$ docker run -ti elezar/caffe:cpu caffe --version
會看到如下輸出,說明安裝成功:
libdc1394 error: Failed to initialize libdc1394
caffe version 1.0.0-rc3
也可以輸入:
$ docker images
可以看到本地多了一個caffe映象。
3. Docker下caffe的使用
3.1 在互動模式下執行caffe容器:
$ sudo docker run -t -i elezar/caffe:cpu /bin/bash
- docker run 執行一個容器
- -t 分配一個(偽)tty (link is external)
- -i 互動模式 (so we can interact with it)
- elezar/caffe:cpu 使用 elezar/caffe:cpu 映象建立容器
- /bin/bash 執行命令 bash shell
這時我們就可以發現我們已經進入了剛剛建立的容器中,hostname已經變成[email protected],其中@後面的這一串數字是當前容器的ID。搭建好的caffe資料夾在/opt/caffe/目錄下:
然後就可以正常使用了。
3.2 以mnist為例,獲取mnist資料:
$ cd /opt/caffe/data/mnist/
$ ./get_mnist.sh
可以看到當前目錄下生成了新的mnist資料:
是不是和直接在linux系統上使用caffe完全一樣呢?是的,通過互動模式的設定,在docker的容器中使用caffe就和直接在linux系統上一樣一樣滴~~當然,還是有不一樣的地方,請看下回分解 ↓↓↓
3.3 容器中資料如何儲存
按ctrl+D 或 exit 退出當前容器。
退出後,如果你想重新使用之前的容器,可以通過以下命令重啟,回到之前的狀態:
$ docker start container_ID
$ docker attach container_ID
另外要注意,如果你新執行caffe映象的一個容器,你會發現在之前那個容器中生成的資料都沒有啦!
要理解這一點,首先我們需要知道Docker的檔案系統是如何工作的。Docker映象是由多個檔案系統(只讀層)疊加而成。當我們啟動一個容器的時候,Docker會載入只讀映象層並在其上新增一個讀寫層。如果執行中的容器修改了現有的一個已經存在的檔案,那該檔案將會從讀寫層下面的只讀層複製到讀寫層,該檔案的只讀版本仍然存在,只是已經被讀寫層中該檔案的副本所隱藏。當刪除Docker容器,並通過該映象重新啟動時,之前的更改將會丟失。(在Docker中,只讀層及在頂部的讀寫層的組合被稱為Union File System,聯合檔案系統)。
那麼如何儲存這種修改呢?有兩種方式,一種是通過docker commit來擴充套件一個新的image,另一種是通過docker volume,繞過預設的聯合檔案系統,將更改的檔案以正常的檔案或者目錄的形式保存於宿主機上。
3.3.1 docker commit
$ docker commit c5f24e953610 mycaffe
其中c5f24e953610是我們之前所使用容器的ID,可以通過docker ps -a檢視;mycaffe是新生成的映象的名稱。
這時候我們再使用docker images命令檢視現有映象,發現除了原始的elezar/caffe外,還多了一個名為mycaffe的映象,即為我們剛建立的映象:
如果我們現在為mycaffe建立一個容器,並檢視data/mnist/目錄,就會發現之前生成的mnist資料存在了,說明容器中的資料被我們儲存下來了:
$ docker run -ti mycaffe /bin/bash
$ cd /opt/caffe/data/mnist/
$ ls
3.3.2 docker Volume
要實現主機和容器之間的資料互動,需要通過docker Volume來完成。
首先在主機中建立一個用於儲存資料的資料夾,並在其中新增一個檔案作為測試:
$ mkdir dockerData
$ cd dockerData
$ touch test-file
然後將該資料夾掛載到新的容器中,在執行時使用-v來宣告Volume:
$ docker run -ti -v /home/elaine/dockerData:/dockerData elezar/caffe:cpu
以上命令會將主機中的/home/elaine/dockerData目錄掛載到容器中的/dockerData目錄下,這樣我們就可以在容器中看到這個目錄了,並且可以看到我們事先存放的test-file:
我們可以在主機上直接操作該目錄,比如在主機上再增加一個檔案,我們也可以馬上在容器中看到變化:
我們也可以在容器中給這個目錄新增資料,如caffe訓練後的model等,任何在/dockerData路徑的檔案都可以在主機中訪問到。
3.4 附:Docker刪除指令
//刪除指定容器
$ docker rm container_ID/name
//刪除所有已經停止的容器
$ docker rm $(docker ps -a -q)
//刪除指定映象
$ docker rmi image_name