教程|使用 Docker 安裝深度學習環境
用 Docker 安裝深度學習環境,輕量、方便!整個系統大小僅需2~3G,用完還能帶著走!一人裝環境,全都能用,還有 NVIDIA 官方提供的 GPU 鏡像等著你哦~
1.什么是 Docker2.關于 Docker 的幾個概念3.為什么用 Docker4.實戰:使用 Docker 創建并分享一個深度學習環境
深度學習環境的配置一直是一個令人頭疼的問題,尤其是對使用 Windows 平臺的用戶來說,在安裝一些開源深度學習框架的時候,經常會遇到一起奇奇怪怪的問題。更有一些深度學習框架(比如 PyTorch),目前沒有提供對 Windows 平臺的官方支持。
為了避免出現環境問題,有些同學選擇使用 VMware、VirtualBox 運行 Linux 虛擬機的方式進行深度學習實驗。但是像 VMware、VirtualBox 這類“重”虛擬機運行起來常會拖慢系統,并且這些虛擬機目前是不支持 GPU 虛擬化的。
所以今天要分享給大家的是使用 Docker 配置安裝深度學習環境。
使用Docker安裝環境的優點如下:
無需自己配置環境,通過 Docker 鏡像可以使用各種已配置好的深度學習環境。
輕量便捷。一個 Docker 客戶端+一個鏡像,總共大約3~4G即可組成一個深度學習系統環境。
便于分享。可以將自己的環境通過鏡像庫或直接以文件拷貝的方式傳播。
官方支持。很多深度學習框架&項目提供官方 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個步驟:
使用 阿里云 鏡像站點加速服務
Docker-machine?
從阿里云鏡像獲取一個與需求相似的鏡像
把鏡像從庫里拖拽過來!
查看并運行鏡像
將容器的修改提交到鏡像中
將鏡像上傳到阿里云鏡像倉庫中
將鏡像打包為獨立文件
測試分享出的 Docker 鏡像
1.使用 阿里云 鏡像站點加速服務
在安裝 Docker 后,理論上我們就可以去 Docker Hub 上尋找我們想用的鏡像了。不過在國內訪問國外的 Docker Hub 速度是非常慢的,所以我選擇使用阿里云的鏡像倉庫。
訪問:https://cr.console.aliyun.com/#/accelerator
注冊阿里賬戶并登錄。
選擇 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.6
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 下來: