數人云工程師手記 | 在清華OCP實驗室玩轉NVIDIA GPU實踐

新的一週又開始啦,小數又給你們搬來一篇十足的乾貨~
數人云首席架構師偉濤與你們分享數人云基於Docker/Mesos和NVIDIA GPU的實踐。利用容器的技術來提高GPU的資源利用率,揚其長補其短,搭建深度學習平臺,就是這麼簡單:)html

前言

NVIDIA GPU 能夠大大加快 Deep Learning 任務的運行速度;同時, GPU 資源又是十分昂貴的,須要儘量提升 GPU 資源的利用率。爲了解決上述問題,一個更合理的思路是利用 Mesos 將 GPU 資源匯聚成資源池來實現資源共享,並借用 Docker 交付深度學習的 runtime 環境,很好的解決了上述問題。linux

清華大學交叉信息研究院開放計算項目實驗室( OCP 實驗室)基於以上背景,與數人云合做解決深度學習環境部署繁瑣的問題,該平臺從 6 月份開始已經爲清華大學的師生提供服務。git

本文首先介紹了深度學習平臺經常使用的工具包括 CUDA, Caffe, Mesos, Docker 等;接着介紹整個平臺的架構;而後給出了平臺搭建須要解決的關鍵性問題及應對策略;最後羅列了將來須要克服的關鍵性問題。另外,因爲 GPU + Docker 尚未通用的標準,在實際操做中,咱們使用了一些 Tricky 的作法。github

在介紹深度學習平臺的工具以前,咱們再詳細闡述下用戶需求。用戶本質要解決兩個問題:web

用戶會頻繁的批量部署深度學習環境,並在使用完後及時銷燬環境以釋放資源。遇到的難題是深度學習環境的軟件包安裝繁瑣。
深度學習環境用到的 GPU 資源寶貴,用戶須要 GPU 資源共享。算法

深度學習平臺工具

CUDA: CUDA 是 NVIDIA 開發的一個平行計算平臺和編程模型。它利用 GPU 來提升計算性能。 CUDA 運行於 NVIDIA 的 GPU 硬件之上。docker

Caffe: Caffe 是 BVLC 開發的一個深度學習框架。在 GPU mode 下, Caffe 經過 CUDA 調用 GPU 資源。apache

TensorFlow: TensorFlow 是谷歌開源的一個利用數據流圖進行數據運算的軟件庫,在 GPU mode 下, TensorFlow 也依賴於 CUDA 來使用 GPU 資源。編程

jupyter: jupyter 是一個進行交互式數據處理,及結果可視化的 Web 應用,其前身是 Python Notebook。 是數據科學家經常使用的工具之一。json

Docker: Docker 是一種輕量的虛擬化技術,在保證基本的環境隔離前提下,它幾乎能夠達到裸機的性能。

Apache Mesos: Mesos 是一個分佈式系統內核,它參考了 Linux kernel 原理,在數據中心層對資源進行了抽象。

平臺架構

這裏從節點內部和集羣兩層介紹平臺的架構。

在節點內部,咱們利用 nvidia-docker ( https://github.com/NVIDIA/nvi... ) 來幫助容器內部的程序調用外面主機上的 CUDA driver。以下圖一所示, CUDA Driver 及 GPU Driver 安裝在外部 Host 上; CUDA Toolkit、其它深度學習組件及用戶應用程序運行在 Docker 容器中。這樣既能快速配置環境,又保證了 HOST 不受用戶應用程序污染。我會在下一章節介紹具體的設置過程。

圖片描述
圖一 來源 https://github.com/NVIDIA/nvi...

在整個集羣層面,利用 Mesos 將資源池化,用戶可經過 Marathon 統一入口部署本身的深度學習 Docker Package。以下圖二所示,集羣包括 3 個 Mesos 管理( Master)節點和多個工做( slave)節點,任務分發到 slave 後, slave 經過 executor 與 Docker daemon 通訊, Docker daemon 按需從內部鏡像倉庫拉取並加載 Docker image。對應到真實應用場景,帶有深度學習依賴組件的 Docker image 將被 pull & run,用戶能夠經過 ssh 或者 jupyter 的 Web 入口與組件進行交互。

圖片描述
圖二 來源 https://mesosphere.com/blog/2...

這個方案與 nvidia & mesosphere 合做推出的方案 http://www.nvidia.com/object/... 不一樣,後面章節會介紹差別。

基礎環境設置

節點設置

第一批機器,咱們選用了 CentOS7.2 操做系統和 NVIDIA Tesla K20c 的顯卡。具體的設置過程以下:

  • 安裝好顯卡並 reboot 機器,而後在終端輸入命令

lspci | grep –i nvidia

若是顯卡安裝成功,則能夠得到以下相似輸出。
84:00.0 3D controller: NVIDIA Corporation GK110GL [Tesla K20c] (rev a1)

  • 安裝顯卡驅動, 能夠在 NVIDIA 官方網站http://www.nvidia.com/Downloa... 找到相應的顯卡驅動,下載並安裝。這裏須要注意的是,許多的 Linux 發行版已經預裝了一個開源的 video driver—Nouveau,而這個 driver 是與 NVIDIA driver 衝突的,須要參考 http://www.dedoimedo.com/comp...
    http://www.allaboutlinux.eu/r... 來禁掉 Nouveau,而後才能成功安裝 NVIDIA Driver。

  • 若是 driver 安裝成功,能夠經過命令 nvidia-smi 獲取以下截圖三的輸出

圖片描述
圖三

  • 安裝 CUDA,在http://docs.nvidia.com/cuda/c... 下載CUDA安裝包,CUDA 的安裝包比較大,依賴也很是多,以及一些必不可少的環境變量設置,這一步須要費些時間。咱們在實際環境中安裝了 CUDA 7.5,目前 NVIDIA 已經發布了 CUDA 8.0 。安裝完成後,尤爲須要查看 /dev/nvidia* 是否存在,通常來講,至少 /dev/nvidiactl, /dev/nvidia-uvm 和 /dev/nvidia0 是應該有的,若有缺失,可使用該連接 http://docs.nvidia.com/cuda/c... 提供的腳原本建立缺失的文件。

  • 驗證 CUDA 安裝成功。安裝完畢後,能夠經過 CUDA 安裝包自帶的sample進行驗證,譬如:
    `cd /usr/local/cuda-7.5/samples/1_Utilities/deviceQuery

make
./deviceQuery`

應該能夠獲得以下截圖四中的內容。

圖片描述
圖四

  • 安裝 nvidia-docker,nvidia-docker 是 NVIDIA 官方爲了讓 NVIDIA GPU 與 Docker 容器兼容而封裝的 Docker Cli – nvidia-docker。能夠在 https://github.com/NVIDIA/nvi... 找到nvidia-docker 相應的 Ubuntu,CentOS 和 二進制安裝包。對於 CentOS 來講,大體步驟以下:

# Install nvidia-docker and nvidia-docker-plugin
wget –P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.0-rc.3/nvidia-docker-1.0.0.rc.3-1.x86_64.rpm
sudo rpm -i /tmp/nvidia-docker*.rpm && rm /tmp/nvidia-docker*.rpm
sudo systemctl start nvidia-docker
# Test nvidia-smi
nvidia-docker run --rm nvidia/cuda:7.5 nvidia-smi

若是設置正常,會獲得與第3步截圖一樣的內容。

  • 爲了環境一致性,須要繞過 nvidia-docker 直接使用原生的 Docker 命令:

docker run `curl -s http://localhost:3476/docker/cli` --rm nvidia/cuda:7.5  nvidia-smi

或者:

docker run --volume-driver=nvidia-docker --volume=nvidia_driver_352.39:/usr/local/nvidia:ro --device=/dev/nvidiactl --device=/dev/nvidia-uvm --device=/dev/nvidia0 --rm nvidia/cuda:7.5  nvidia-smi

這裏參考了 https://github.com/NVIDIA/nvi...

集羣設置

真實環境中,咱們爲用戶部署了企業版數人云,有些技術細節不便展開。但只使用開源的 Apache Mesos 組件絲絕不會影響集羣核心功能的使用。在網絡上已經有不少 Apache Mesos,Marathon 和 Docker 安裝配置的文章,這裏再也不花費篇幅介紹。

若是想要更多feature的調度器,純命令行mesos scheduler-- https://github.com/Dataman-Cl... 是個不錯的選擇。
固然,若是感受 Mesos 的配置運維繁複,推薦你們嘗試 Crane (https://github.com/Dataman-Cl...),它是基於 Swarmkit 的容器控制面板,上手容易,安裝操做都很是簡捷。

最終咱們應該能夠獲得一個 workable 的 Mesos 集羣環境。

兩個深度學習的Docker鏡像

應用戶要求,在https://github.com/NVIDIA/nvi... 的 CUDA docker image 基礎之上,我又製做了兩個包含更多深度學習組件的 Docker 鏡像 2breakfast/caffe-sshd:0.14 和 2breakfast/deeplearning:allinone , 你能夠在 https://hub.docker.com/r/2bre...https://hub.docker.com/r/2bre... 找到相應的 docker image 及 Dockerfile 連接。

  • 2breakfast/caffe-sshd:0.14
    包含 caffe,sshd 服務。用戶能夠ssh到相應的docker容器裏面使用caffe。能夠直接經過命令來測試該 image:

docker run --volume-driver=nvidia-docker --volume=nvidia_driver_352.39:/usr/local/nvidia:ro --device=/dev/nvidiactl --device=/dev/nvidia-uvm --device=/dev/nvidia0 --rm 2breakfast/caffe-sshd:0.14 caffe device_query -gpu all

若是運行正常,能夠大體獲得以下結果:
圖片描述

  • 2breakfast/deeplearning:allinone
    除上述 caffe,sshd 以外,又打包了 Tensorflow, theano, jupyter 等。

經過 Marathon 發佈 2breakfast/deeplearning:allinone

下面是獲取相應 json 文件並在Marathon 上進行部署的命令。

wget https://raw.githubusercontent.com/vitan/deeplearning-dockerfile/master/deploy-deeplearning.json
curl -k -XPOST -d @deploy-deeplearning.json -H "Content-Type: application/json" http://MARATHON_IP_ADDRESS:8080/v2/apps

部署成功後,能夠經過 marathon ui 給出的訪問地址,ssh 登陸到容器內部來使用深度學習組件。譬如:

ssh –p 13452 root@10.1.0.170

密碼:password ,便可訪問。目前容器的默認 ssh account:root , password:password 。

另外,jupyter web 服務並非默認啓動,須要用戶手動啓動它。

小結:遺留問題

  • 用戶數據存儲及隔離

在運行深度學習算法時,不可避免須要操縱數據。目前的方案是:主機目錄 /mnt/data 映射到了容器目錄 /mnt/data ,用戶須要將持久化保持的數據放到該目錄的某個文件下。而主機目錄 /mnt/data 是個 nfs 目錄,集羣節點經過nfs將 /mnt/data 中的數據匯聚到了同一臺 server,該 server 上的相應目錄是一個 ceph block。

該方案最大的問題是 /mnt/data 目錄裏面的文件沒有隔離,只能要求用戶創建各自的 home 目錄來放置本身的文件。將來計劃經過 LDAP 帳戶集成,將數人云企業版帳戶和 ceph 目錄上的 account 打通,在 ceph 上爲不一樣的 LDAP 帳戶創建不一樣的 home 目錄並設置相應讀寫權限,實現隔離。

  • 3476 端口占用

nvidia-docker 會啓動一個 web 服務並佔用每一個節點的端口 3476,這就須要集羣保留端口 3476 資源。在咱們的場景中,直接使用 localhost:3476 獲取信息, 將來考慮將其設置爲 unix://**nvidia-docker.sock。

  • 讓 Mesos 像管理 CPU 資源同樣來管理 GPU 資源

Mesos在1.0版本 https://github.com/apache/mes... 實現了對GPU資源的管理。其參考了 nvidia-docker 的作法,將許多設置內置到了 mesos 中,將來考慮 enable 這部分功能以簡化配置。

相關文章
相關標籤/搜索