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