Docker

從 集智百科
跳到: 導覽搜尋

目錄

使用Docker安裝深度學習環境

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

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

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

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

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

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

GPU Docker container.png

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 的特性,但目前我們還用不到,所以我們在這不做過多的討論。

使用 Docker 創建並分享一個深度學習環境

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

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

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

註冊阿里賬戶並登錄。

Aliyun caozuotai.png

選擇 Docker 鏡像加速器。

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


How to setup linux docker.png

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

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

How to set linux docker.png

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」。

Search docker images.png

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

Docker image details.png

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


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

5.查看並運行鏡像

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

Cmd docker images.png

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

Cmd run docker.png

在命令中:

- -t:在新容器內指定一個偽終端或終端。

- -i:允許你對容器內的標準輸入 (STDIN) 進行交互。

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

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

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

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

此時我們可以觀察一下當前的容器與之前的鏡像,可以看到容器與鏡像同時獨立存在。

Cmd docker images container.png

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

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

需要操作的流程如下:

首先查看容器的ID:

Docker container id.png

將容器提交到鏡像中,同時我們給它指定新的名字:

Cmd docker commit.png

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

Docker commit finished.png

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

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

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

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

Ailiyun images duck.png

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


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


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

Cmd docker tag.png

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

Cmd docker push.png

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

Ailyun duck images.png

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

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

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

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

Cmd docker export tar.png

9.測試分享出的 Docker 鏡像

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

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

Cmd docker import.png

導入成功。

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

Cmd docker download.png
Cmd docker download success.png

全部成功!

大吉大利,今晚吃雞!

個人工具
名字空間
動作
導覽
工具箱