GPU 机器学习开箱即用
作者 | 寒蟬 阿里云操作系統團隊
導讀:本次課程為您介紹如何在 Serverless Kubernetes 集群中使用 GPU 加速機器學習任務的執行。本文分為四個部分,第一部分是 ECI GPU 的簡單介紹,第二部分是 ECI GPU 的基本實現原理,第三部分是 ECI GPU 的使用方式,最后一部分是通過經典的 MNIST(手寫數字識別)任務來演示如何在 ACK 集群中使用 GPU 來執行機器學習任務。
ECI GPU 簡介
相較于普通的 ECI 實例,ECI GPU 實例為用戶容器提供了 GPU 資源以加速機器學習等任務的運行,其典型架構如上圖所示。ECI GPU 實例預裝了 GPU 驅動,免去了用戶安裝和維護 GPU 驅動的麻煩。同時,ECI GPU 實例同普通的 ECI 實例一樣兼容 CRI 接口,Kubernetes 也可以直接對 ECI GPU 實例進行調度和編排。此外,利用官方容器鏡像,用戶無需關心 CUDA Toolkit/Tensorflow/PyTorch 等工具和框架的搭建部署,只需要專注于具體業務功能的開發和實現。
通過 ECI GPU 實例,用戶可以一鍵式部署和運行經過 GPU 加速的機器學習等業務,簡單方便。
ECI GPU 基本實現原理
大家知道,容器一般是通過內核接口訪問主機上的資源。但是對于 GPU 資源,容器無法直接通過內核接口訪問到,只能通過廠商驅動與 GPU 進行交互。
那么,ECI GPU 實例是如何讓用戶容器實例訪問到 GPU 資源的呢?本質上,ECI GPU 就是在用戶容器創建時將 GPU 驅動的一些必要的動態庫文件掛載到用戶容器中,從而使得用戶容器可以通過這些掛載的動態庫文件訪問到位于 Host 端的 GPU。
ECI GPU 的基本實現框架如上圖所示,圖中所有方框代表的組件都運行在 ECI HostOS 側。其中 ContainerAgent 是自研的一個組件,可以類比與 Kubelet,其接受來自管控的指令;右上角的 nvidia-container-runtime-hook 是 NVIDIA 開源實現的一個符合 OCI 標準的一個 prestart hook,prestart hook 用于在容器執行用戶指定的的命令前執行一些自定義配置操作;右側中間位置的 libnvidia-container 也是一個 NVIDIA 開源的一個組件,用于將 Host 側 GPU 驅動的動態庫掛載到指定容器中。
簡單介紹一下 ECI GPU 下的容器啟動流程:
ECI GPU 使用方式
目前在 ACK/ASK 集群中使用 GPU,只需要在 YAML 文件中指定兩個字段即可,如上圖標紅處所示。
第一個字段是 k8s.aliyun.com/eci-use-specs,該字段用于指定 ECI GPU 實例規格,當前阿里云上可用的 ECI GPU 實例規格已經列在左圖的表格中了。
第二個字段是 nvidia.com/gpu,該字段用于指定該容器所要使用的 GPU 數量。注意,spec 中所有容器指定要使用的 GPU 數量總和不能超過 k8s.aliyun.com/eci-use-specs 字段指定的 ECI GPU 實例規格所提供的 GPU 數量,否則容器會創建失敗。
演示
視頻演示過程請點擊【視頻課鏈接】進行學習。
最后簡單演示一下如何在 ACK 集群中使用 GPU 加速執行機器學習任務。我們以在 ASK 集群中進行 MNIST(手寫數字識別)訓練任務為例:
該任務由 YAML 文件定義,如上圖所示。我們在 YAML 文件中指定了 ECI GPU 實例類型,該實例類型包含一顆 NVIDIA P4 GPU。然后我們指定了容器鏡像為 nvcr.io/nvidia/pytorch,該鏡像是由 NVIDIA 提供,內部已經封裝好了 CUDA/PyTorch 等工具。最后,我們通過 nvidia.com/gpu 指定了要使用的 GPU 數量為 1。
如上圖所示,在 ASK 集群中,我們選擇使用模板創建應用實例,然后在模板中輸入右側 YAML 文件的內容,最后點擊創建即可創建一個使用 GPU 的容器了。
容器創建完成之后,首先我們通過 kubectl 命令登錄到我們創建的容器中,然后執行 nvidia-smi 命令確認 GPU 是否可用。如上圖中的左上角截圖所示,nvidia-smi 命令成功返回了 GPU 的信息,如 GPU 的型號的 P4,驅動版本號是 418.87.01,CUDA 版本為 10.1 等,這表示了我們創建的容器是可以正常使用 GPU 資源的。
接著,如上圖中的右側截圖所示,我們進入 /workspace/examples/mnist 目錄下執行 python main.py 開始執行 MNIST 訓練任務,MNIST 訓練任務會先下載 MNIST 數據集,由于 MNIST 數據集較大可能下載時間會比較長。下載完數據集后,MNIST 訓練任務會開始進行數據集的訓練。
當 MNIST 任務執行完之后,我們會看到訓練結果打印在屏幕上,如上圖中左下角截圖所示。MNIST 測試集包含 10000 張測試圖片,從結果圖片我們可以看到其中由 9845 張手寫數字圖片都被正確識別了,精度已經是相當高。有興趣的同學可以對比測試一下不使用 GPU 場景下的 MNIST 任務所用的訓練時間。
總結
綜上所述,ECI GPU 不僅大大加速了用戶在云上執行機器學習等任務的執行,并且其免運維免部署的特性使得用戶只需要專注于具體業務的實現而不需要關心底層環境的部署,真正做到開箱即用,方便用戶的開發。考慮到用戶對計算力的需求,未來我們還會有 vGPU 的實例供用戶選擇,以進一步降低用戶成本,敬請期待。
總結
以上是生活随笔為你收集整理的GPU 机器学习开箱即用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于 Knative 低成本部署在线应用
- 下一篇: 通过 IDE/Maven 部署 Serv