【導讀】本文來自PaddlePaddle團隊,介紹了PaddlePaddle與眾不同的基於Docker的編譯、開發、測試、調試、發布、部署、和運行的全流程及其背後的設計思路。
繼兩周前PaddlePaddle社區發布新的PythonAPI之後,最近又發布了對應的新版Docker鏡像,並優化了鏡像的體積和組織方式。
這些工作的目的是方便大家在單機和Kubernetes機群上運行分布式深度學習作業。當Baidu Research官方Twitter帳號發布這條消息並且被Andrew Ng轉發後,收到了很多反饋。其中有朋友們好奇Docker在AI中的應用是不是「overkill」。其實這些工作都是為了簡化用戶需要做的操作。只是Docker在AI系統中的應用還剛剛開始,大家可能還不熟悉,所以我們寫作本文,介紹PaddlePaddle與眾不同的基於Docker的編譯、開發、測試、調試、發布、部署、和運行的全流程及其背後的設計思路。
除了PaddlePaddle本身,基於它開發的Deep Learning入門教材也是基於Docker image 的形式發布的。這本書中的每一章都是一個Jupyter Notebook。而Docker image裡包括了Jupyter server、PaddlePaddle和所有被依賴的軟體,所以大家不需要安裝軟體即可運行和瀏覽這本書,修改文中的例子程序並且執行和觀察變化。
引入Docker也使得我們不需要修改PaddlePaddle的源碼即可同時支持多種作業系統 -- Linux、Mac、Windows -- 因為這些作業系統都可以運行Docker了。
而且PaddlePaddle的開發環境(各種軟體和配置)本身也被發布為一個Docker image,所以不僅是PaddlePaddle程序的用戶、基於PaddlePaddle開發AI程序的用戶,甚至PaddlePaddle的開發者,也都使用Docker container來開發和調試。
如果不希望使用Docker運行Paddle應用,用戶可以使用開發環境鏡像快速編譯Paddle的.deb安裝包,直接安裝在企業的特定運行環境中運行!
《Deep Leanring 101》這本書是在Github社區裡開發的一個PaddlePaddle應用程式。讓我們先從這本書開始,解釋PaddlePaddle應用開發和發布的過程吧。
因為PaddlePaddle社區已經把書籍的Docker鏡像發布到了dockerhub.com,所以大家只需要執行一條命令即可運行這本書:
如果從國內訪問dockerhub.com速度慢,也可以訪問PaddlePaddle社區在香港維護的Docker registry 服務:
隨後只需要在瀏覽器打開連結 http://localhost:8888,選擇一個感興趣的章節,即可在瀏覽器裡閱讀書籍。界面如下圖所以。用戶可以點擊上方工具欄的「運行」按鈕來運行樣例代碼,查看輸出的結果,並對照書籍開始學習,體驗Paddle帶來的深度學習之旅。
如果大家好奇這本書的Docker鏡像的創建方法,可以參見這個腳本程序 https://github.com/PaddlePaddle/book/blob/develop/.tools/build_docker.sh,並參見下文。大家可以把自己基於PaddlePaddle開發的應用發布出來,便於用戶在單機和Kubernetes機群上運行。
上述書籍鏡像都是基於PaddlePaddle的生產環境鏡像(production iamge)構建的。生產環境鏡像是任何PaddlePaddle應用鏡像的基礎,其中只包括build好的PaddlePaddle以及Python等必要的依賴,這樣使其體積儘量小。目前PaddlePaddle社區維護以下四種生產鏡像,分別對應包括不同CPU和GPU指令集的程序。
GPU/AVX paddle:0.10.0rc2-gpu
GPU/no-AVX paddle:0.10.0rc2-gpu-noavx
no-GPU/AVX paddle:0.10.0rc2
no-GPU/no-AVX paddle:0.10.0rc2-noavx
其中GPU版本鏡像由於包含CUDA driver,體積會略大於純CPU版本的鏡像。而no-AVX鏡像則提供可以兼容部分較早型號的不支持AVX指令集的CPU。也有一些雲服務提供商提供的虛擬機不支持AVX指令集。
下面我們演示使用PaddlePaddle 生產環境鏡像構建應用的方法。首先我們編寫一個應用程式/work/myapp.py:
我們可以執行生產鏡像,利用其中編譯好的PaddlePaddle來執行我們的應用程式:
這個例子裡,/work目錄為保存run.py文件的目錄,run.py程序和其依賴以及數據都會放在這個目錄下,通過-v參數掛載到容器中,運行run.py即可啟動我們的訓練任務。
如果dockerhub.com速度慢,也可以使用PaddlePaddle社區維護的Docker registry:
可以看到如下輸出(截取部分):
對於更加複雜的深度學習應用,比如應用可能依賴官方Docker鏡像之外的庫,用戶可以直接基於PaddlePaddle 的生產環境鏡像打包自己的應用,創建如下的Dockerfile:
使用諸如此類的Dockerfile即可根據用戶的需要構建自己的鏡像並應用於實際生產環境。
我們將PaddlePaddle的Docker鏡像區分為生產環境和開發環境。生產環境僅包含應用運行必要的動態連接庫,三方庫和應用二進位文件;而開發環境則需要提供Paddle原始碼、頭文件、編譯工具以及豐富的開發工具,包括:
gcc/clang
nvcc
Python
sphinx
woboq
sshd
開發環境鏡像會極大的方便以下角色的工作: 1. 深度學習應用開發者:不再需要安裝配置一臺Ubuntu Linux機器並安裝大量的依賴,只需要安裝Docker。這樣開發者可以使用自己的電腦或者遠程的開發伺服器都可以。 2. Paddle版本發布工程師:Paddle後續的版本發布更新均使用開發環境Docker鏡像,根據Paddle的github分支/標籤直接生成多個Paddle生產環境Docker鏡像 3. 文檔編寫/Paddle網站更新:Paddle的文檔通常是以「.md/.rst」格式保存在github上的,並隨著原始碼的更新而更新。文檔和網站內容都是通過github的這些文檔生成的,開發環境鏡像會提供相應的工具,將「.md/.rst」格式解壓、轉換並生成html頁面。
下面介紹如何使用開發環境鏡像。考慮我們完成日常工作的方式,開發者可能會使用自己的筆記本/臺式機/安裝有GPU的工作站:
許多開發者會使用一臺遠程的安裝了GPU的機器完成日常的開發工作,他們通常會ssh登錄到這臺伺服器上開發。開發環境鏡像也提供了sshd服務,這樣開發者可以直接ssh登錄到PaddlePaddle的開發環境容器中啟動訓練任務:
一個基本思路是: 使用git clone下載PaddlePaddle源碼到開發機或本地,然後就可以使用自己慣用的編輯器(如Eclipse/VIM)開始代碼編寫工作。編譯和測試則可以使用docker run -v掛載Paddle原始碼目錄到Docker開發環境鏡像。這樣就可以在Docker容器中直接編譯和測試剛才修改的代碼:
您可以使用下面的命令快速下載並啟動一個PaddlePaddle開發環境的容器,並啟動一個sshd服務。在https://hub.docker.com/r/paddlepaddle/paddle/tags/ 找到您需要的版本替換 <version>。
PaddlePaddle團隊將以易用性為目標,持續更新,為AI從業者和對深度學習感興趣的同學提供更方便的鏡像和工具,把深度學習帶給更多的人!
PaddlePaddle是一個最早由百度科學家和工程師共同研發的並行分布式深度學習平臺,兼備易用性、高效性、靈活性和可擴展性,目前已被百度內部多個產品線廣泛使用。
PaddlePaddle目前已經開放源碼, 但是遠未完善,我們希望能在這個基礎上不斷的改進、擴展和延伸。 同時我們希望廣大開發者積極提供反饋和貢獻原始碼,建立一個活躍的開源社區。
據介紹,PaddlePaddle是一個小而美的團隊、核心成員10人左右、系統工程師為主、全部使用Github辦公。