教程 | 使用 Docker 安裝深度學習環境

本文由集智小仙女發表在集智AI學園公眾號上,歡迎關注集智AI學園微信公眾號:swarmAI。

前言

用 Docker 安裝深度學習環境,輕量、方便!整個系統大小僅需2~3G,用完還能帶著走!一人裝環境,全班都能用,還有 NVIDIA 官方提供的 GPU 鏡像等著你哦~

1.什麼是 Docker

2.關於 Docker 的幾個概念

3.為什麼用 Docker

4.實戰:使用 Docker 創建並分享一個深度學習環境

深度學習環境的配置一直是一個令人頭疼的問題,尤其是對使用 Windows 平台的用戶來說,在安裝一些開源深度學習框架的時候,經常會遇到一起奇奇怪怪的問題。更有一些深度學習框架(比如 PyTorch),目前沒有提供對 Windows 平台的官方支持。

為了避免出現環境問題,有些同學選擇使用 VMware、VirtualBox 運行 Linux 虛擬機的方式進行深度學習實驗。但是像 VMware、VirtualBox 這類「重」虛擬機運行起來常會拖慢系統,並且這些虛擬機目前是不支持 GPU 虛擬化的。

所以今天要分享給大家的是使用 Docker 配置安裝深度學習環境。

使用Docker安裝環境的優點如下:

  1. 無需自己配置環境,通過 Docker 鏡像可以使用各種已配置好的深度學習環境。
  2. 輕量便捷。一個 Docker 客戶端+一個鏡像,總共大約3~4G即可組成一個深度學習系統環境。
  3. 便於分享。可以將自己的環境通過鏡像庫或直接以文件拷貝的方式傳播。
  4. 官方支持。很多深度學習框架&項目提供官方 Docker 鏡像。

英偉達專門提供的支持GPU虛擬化的Docker鏡像:

1.什麼是Docker?

已經熟悉 Docker 的同學肯定已經有了自己的理解。

我這裡給出一種簡單(但不一定嚴謹)的描述,以供初學者快速理解。

Docker 類似於我們使用的虛擬機軟體(VMware,VritualBox),可以創建、運行虛擬系統。

網上可以找到大量的 Docker 虛擬系統(鏡像)。我們只需要搜索想要的系統環境(比如Python3.6+PyTorch),然後使用 Docker 運行它,就可以在其中調試深度學習程序。

那 Docker 與之前說的「重量級」虛擬機軟體有什麼不同的地方?

別急,在下面我們會專門說明這個問題,且慢慢往下看~

2.關於Docker的幾個概念

關於 Docker 的組成部分,有那麼幾個小概念需要大家提前了解一下。

鏡像

Docker 鏡像就是系統環境的載體。

Docker 鏡像是 Docker 容器運行時的只讀模板,類似於虛擬主機本體。

從 Docker 鏡像倉庫中可以找到大量可用的鏡像,你可以按照自己的需求自行搜索,比如尋找一個安裝了 PyTorch+Jupyter Notebook 的系統鏡像。

容器

每一個 Docker 容器都是從 Docker 鏡像中創建的。

之所以有容器的存在,因為鏡像是只讀的。當我們通過鏡像運行一個系統環境(虛擬機)時,Docker 就會創建一個容器來容納這個系統環境。我們在這個環境中進行的修改(包括創建文件、安裝新軟體包等等),相當於都是在容器中進行的,不會影響到原來的鏡像。

在我們想分享修改後(比如安裝了新軟體包)的系統時,我們可以執行「commit」命令。這時被我們修改過的容器,就會提交到鏡像中,形成新版本的鏡像。這個過程特別像GitHub的使用。我們從GitHub上clone下代碼,修改,然後直到 commit 提交。

簡單來說,容器可以視為鏡像的「運行態」。

Docker Hub

官方的鏡像發布網站,你在這裡可以找到自己需要的鏡像。

然而在國內,我們往往使用國內的鏡像庫,比如阿里雲、網易蜂巢等等。

3.為什麼要用 Docker?

有同學可能有疑問:既然 Docker 也是一種虛擬機,那我用 VMware,VritualBox 不是一樣嗎?

我們使用 Docker 搭建深度學習環境的理由有三個:

1.輕量級便捷。使用 VMware 等軟體還需要經歷一個漫長的「安裝操作系統」的過程。使用 Docker 只需要從網上找到合適的鏡像下載到本地就好了。

2.便於分享。使用 Docker 建立的鏡像很小巧,很適合分享。比如你配置好了一個 PyTorch 的鏡像,可以直接拷貝給實驗室的其它小夥伴。

3.易於部署。如果你在 Docker 容器中訓練好一個模型,並且為它搭建了一個 web 可訪問的使用介面。那麼你可以把這個容器打包成Docker鏡像,直接將這個鏡像部署到伺服器上,無需在伺服器上重複布置軟體環境。

另外 Docker 運行本身對系統的拖累很低,一般運行鏡像並不會導致系統卡頓。此外 Docker 還有良好的資源隔絕機制,以及 Docker 鏡像有著「鏡像層級版本」的機制。這些都是 Docker 的特性,但目前我們還用不到,所以我們在這不做過多的討論。

4.實戰:9步創建深度學習環境

如何使用 Docker 創建並分享一個深度學習環境呢?需要9個步驟:

  1. 使用 阿里雲 鏡像站點加速服務
  2. Docker-machine?
  3. 從阿里雲鏡像獲取一個與需求相似的鏡像
  4. 把鏡像從庫里拖拽過來!
  5. 查看並運行鏡像
  6. 將容器的修改提交到鏡像中
  7. 將鏡像上傳到阿里雲鏡像倉庫中
  8. 將鏡像打包為獨立文件
  9. 測試分享出的 Docker 鏡像

1.使用 阿里雲 鏡像站點加速服務

在安裝 Docker 後,理論上我們就可以去 Docker Hub 上尋找我們想用的鏡像了。不過在國內訪問國外的 Docker Hub 速度是非常慢的,所以我選擇使用阿里雲的鏡像倉庫。

訪問:cr.console.aliyun.com/#

註冊阿里賬戶並登錄。

選擇 Docker 鏡像加速器。

在這個界面里我們可以看到屬於自己的鏡像加速器地址。我們要把這個加速地址配置到 Docker 里,從而讓 Docker 默認從加速地址中尋找並下載鏡像。

Linux 操作系統的配置都是通過修改 daemon 配置文件完成的,這個配置看起來比較簡單。

Mac 以及 Windows 操作系統由於系統限制,必須使用 docker-machine 來配置加速地址。

2.Docker-machine?

docker-machine 本質上是又是另一種虛擬機(怎麼那麼多虛擬機),我們暫且把它理解為一個自帶 Docker 的 VirtualBox 虛擬機。

上圖配置中第一條命令的意義是:使用阿里的加速地址創建一個 docker-machine 虛擬機並啟動。

後三條命令的意義是:通過配置環境變數(只在本終端中有效)用 docker-machine 虛擬機中的 Docker 環境覆蓋宿主機系統環境。

執行這三條命令後:

在 Docker-machine 運行期間,在當前的宿主機終端中執行的 Docker 命令,實際上都是由 docker-machine 虛擬機中的 Docker 環境執行的,因為只有 docker-machine 虛擬機配置了阿里的加速地址。

3.從阿里雲鏡像獲取一個與需求相似的鏡像

在鏡像加速器地址配置完畢後,我們就可以去尋找需要的 Docker 鏡像了。

我想找個已經安裝好 Python3.6 的鏡像,以便進一步安裝最新的 PyTorch 以及其它相關的軟體包,那麼我搜索「python36」。

4.把鏡像從庫里拽過來!

可以點擊鏡像詳情,查看鏡像的外網地址,然後把鏡像拽到本地上來(之前必須已經配置好阿里加速器)。

docker pull registry.cn-shenzhen.aliyuncs.com/chenxl/python3.6n

5.查看並運行鏡像

我們可以使用命令 docker images 查看鏡像信息:

使用 docker run 命令將鏡像運行為可交互的 shell:

在命令中:

  • -t:在新容器內指定一個偽終端或終端。
  • -i:允許你對容器內的標準輸入 (STDIN) 進行交互。

在命令運行後,我們可以觀察到當前 shell 里的提示符已經從「Alex-MacBook-Pro」已經改成了「root@f8ad6eb17624」,這證明我們已經在 Docker 容器的系統環境中了。

我們按照常規的方式安裝深度學習環境,比如用 pip 命令安裝 PyTorch、torchvision 等軟體包,並將項目源碼拷貝到運行的容器中。

在宿主機與 Docker 容器間拷貝數據可使用 docker cp 命令。

在容器里進行一系列的操作後,我們的工作完成,可以運行 exit 命令退出當前 shell。

此時我們可以觀察一下當前的容器(docker ps -al)與之前的鏡像(docker images),可以看到容器與鏡像同時獨立存在,並且可以看到在容器中正在運行的項目(交互shell,即/bin/bash)。

6.將容器的修改提交到鏡像中

假設我們在容器里安裝了新的軟體包並且跑通了自己的項目,現在打算把容器提交成鏡像分享給其它小夥伴。

需要操作的流程如下:

首先查看容器的ID(docker ps -al):

將容器提交到鏡像中,同時我們給它指定新的名字(docker commit [ID] [NEW_name]):

提交完成後我們再查看本機存在的鏡像(docker images):

可以看到經我們修改後的新鏡像「python36/pytorch」獨立存在。

有句話叫「取之於民,用之於民」。

我們可以把這個包含最新版 PyTorch 環境的鏡像上傳到阿里雲的鏡像庫中,讓更多的人可以使用我們的鏡像。

7.將鏡像上傳到阿里雲鏡像倉庫中

我們首先在阿里雲上創建一個鏡像倉庫:

然後我們需要在當前的終端中登錄阿里雲倉庫(之前必須配置了阿里雲加速器):

docker login --username=USER_NAME registry.cn-hangzhou.aliyuncs.com

要把鏡像上傳到指定的鏡像庫,需要先對鏡像進行命名。整個名字由冒號「:」分成兩部分,前部分是我們在上一步建立的鏡像倉庫的地址,後部分是對當前鏡像打的標籤(TAG)。TAG的存在是為了允許一個鏡像庫里存在多個版本的鏡像。

好,這時候萬事具備了,我們運行 push 命令將鏡像推送到雲鏡像庫中。

在上傳結束後,我們就可以在雲鏡像庫的web管理界面看到我們的鏡像了。

8.將鏡像打包為獨立文件

除了上傳雲鏡像庫,我們也可以直接將鏡像打包成一個獨立文件,拷貝分享給別人使用。

同樣,我們使用命令 docker images 查看鏡像的名字:

再使用 docker save -o 將目標鏡像打包成文件。

9.測試分享出的 Docker 鏡像

現在讓我們測試下之前導出的鏡像。

首先嘗試導入剛剛在本地打包的鏡像:

導入成功。

再試下從阿里雲鏡像庫中把之前建立的鏡像 pull 下來:

大功告成!還不快叫小夥伴一起來玩深度學習


如果您有任何關於Pytorch方面的問題,歡迎進【集智—清華】火炬群與大家交流探討,添加集智小助手微信swarmaAI,備註(pytorch交流群),小助手會拉你入群。

關注集智AI學園公眾號

獲取更多更有趣的AI教程吧!

搜索微信公眾號:swarmAI

集智AI學園QQ群:426390994

學園網站: campus.swarma.org

weixin.qq.com/r/FzpGXp3 (二維碼自動識別)


推薦閱讀:

TAG:Docker | 深度学习DeepLearning | 人工智能 |