kubernetes GPU共享技術(shù)調(diào)研
對于一個(gè)以內(nèi)容分發(fā)為主的互聯(lián)網(wǎng)公司來說官硝,文章廣告等的準(zhǔn)確分發(fā)至關(guān)重要袜啃,而機(jī)器學(xué)習(xí)模型訓(xùn)練的效率和模型更新迭代的速度直接決定了內(nèi)容分發(fā)效果的好壞。對于機(jī)器學(xué)習(xí)來說,算力是一切的根本盹兢,為了用海量數(shù)據(jù)訓(xùn)練更好的模型砂轻、加速整個(gè)內(nèi)容分發(fā)流程,企業(yè)的 IT 系統(tǒng)需要具備快速然爆、高效調(diào)用管理大規(guī)模 GPU 資源的能力顽分。同時(shí),由于算力資源十分昂貴施蜜,出于成本控制,企業(yè)也需要最大化 GPU 資源利用率雌隅。但是翻默,對于一點(diǎn)資訊來說,GPU的利用率較低恰起,資源使用比較緊張修械。一方面是處于非訓(xùn)練狀態(tài)的實(shí)驗(yàn)占用GPU資源,沒有及時(shí)釋放检盼;另外一方面是無法實(shí)現(xiàn)GPU共享肯污,即使是再小的一個(gè)實(shí)驗(yàn)也要占用至少整塊的GPU資源。對于第一個(gè)問題吨枉,可以通過監(jiān)測訓(xùn)練任務(wù)狀態(tài)蹦渣,及時(shí)釋放資源,但是對于第二個(gè)問題貌亭,目前還未做到GPU資源在多個(gè)Container之間共享柬唯。
GPU共享兩個(gè)關(guān)鍵問題
1. 資源隔離
資源隔離主要采用的是虛擬化的解決思路,目前NVIDIA有兩種 GPU 虛擬化的解決方案:
- GRID: 模式更多用于虛擬機(jī)場景圃庭,基于驅(qū)動(dòng)锄奢,隔離型會做的比較強(qiáng),但不開源剧腻,性能比較好拘央。
- MPS: 應(yīng)用到容器場景,基于軟件的方式书在,隔離性比較弱灰伟,但也不開源。
2. 資源切分及調(diào)度
目前社區(qū)的GPU調(diào)度方案:
1.Nvidia 貢獻(xiàn)的調(diào)度方案蕊温,只支持按較粗粒度的調(diào)度袱箱,按GPU塊數(shù)調(diào)度。
Nvidia GPU Device Plugin
2.阿里云服務(wù)團(tuán)隊(duì)貢獻(xiàn)的 GPU 共享的調(diào)度方案义矛,其目的在于解決用戶共享 GPU 調(diào)度的需求Kubernetes GPU共享實(shí)踐
gpushare-scheduler-extender
gpushare-device-plugin
GPU共享技術(shù)實(shí)踐
由于資源隔離主要采用的是虛擬化技術(shù)发笔,并且NVIDIA提供的兩種GPU虛擬化解決方案都沒有開源,GPU共享在資源隔離方面的實(shí)踐資料相對較少凉翻,大多關(guān)注GPU資源的調(diào)度了讨。
1.阿里GPU共享實(shí)踐
相關(guān)資料: Kubernetes的共享GPU集群調(diào)度
優(yōu)點(diǎn):
- 能夠讓更多的預(yù)測服務(wù)共享同一個(gè)GPU卡上,能夠讓使用者通過API描述對于一個(gè)可共享資源的申請, 并能實(shí)現(xiàn)該種資源的調(diào)度
缺點(diǎn):
不支持該共享資源的隔離
前提條件:
延用Kubernetes Extended Resource定義前计,但是衡量維度最小單位從1個(gè)GPU卡變?yōu)镚PU顯存的MiB
用戶申請的GPU資源上限不會超過一張卡胞谭,也就是申請的資源上限為單卡
實(shí)現(xiàn)思路:
依賴于Kubernetes的現(xiàn)有工作機(jī)制:
- Extended Resource定義
- Scheduler Extender機(jī)制
- Device Plugin機(jī)制
- 利用 kubernetes Extended Resource機(jī)制,重新定義GPU資源男杈,主要是對顯存和GPU數(shù)量的定義丈屹。
- 利用Device Plugin機(jī)制,在節(jié)點(diǎn)上將GPU資源總量上報(bào)給kubelet,kubelet進(jìn)一步上報(bào)給Kubernetes API Server伶棒。
- 利用k8s scheduler Extender機(jī)制旺垒,擴(kuò)展調(diào)度器功能,負(fù)責(zé)在全局調(diào)度器Filter和Bind的時(shí)候判斷節(jié)點(diǎn)上單個(gè)GPU卡是否能夠提供足夠的GPU顯存肤无,并且在Bind的時(shí)刻將GPU的分配結(jié)果通過annotation記錄到Pod Spec以供后續(xù)Filter檢查分配結(jié)果先蒋。
- 節(jié)點(diǎn)運(yùn)行:當(dāng)Pod和節(jié)點(diǎn)綁定的事件被Kubelet接收到后,Kubelet就會在節(jié)點(diǎn)上創(chuàng)建真正的Pod實(shí)體宛渐,在這個(gè)過程中, Kubelet會調(diào)用GPU Share Device Plugin的Allocate方法, Allocate方法的參數(shù)是Pod申請的gpu-mem竞漾。而在Allocate方法中,會根據(jù)GPU Share Scheduler Extender的調(diào)度決策運(yùn)行對應(yīng)的Pod窥翩。
2.騰訊GPU共享實(shí)踐
相關(guān)資料:AI 在 K8S 中的實(shí)踐:云智天樞 AI 中臺架構(gòu)揭秘
實(shí)現(xiàn)思路:
- 常規(guī)GPU使用业岁,按塊調(diào)度
- 使用Nvidia 提供的虛擬化技術(shù)
- 自研實(shí)現(xiàn)GPU半虛擬化: 基于驅(qū)動(dòng)函數(shù)實(shí)現(xiàn),改變了函數(shù)顯存申請寇蚊、釋放和線程的發(fā)起函數(shù)叨襟。
3.才云科技GPU共享實(shí)踐
相關(guān)資料:基于 Kubernetes 的 GPU 類型調(diào)度實(shí)現(xiàn)
實(shí)現(xiàn)思路:
利用kubernetes現(xiàn)有的工作機(jī)制:
- Scheduler Extender 機(jī)制
- Device Plugin 機(jī)制
- API Server 擴(kuò)展機(jī)制(CRD)
- Admission 擴(kuò)展機(jī)制(ResourceQuota)
優(yōu)點(diǎn):
雖未明確解決GPU共享問題,但根據(jù)其設(shè)計(jì)和實(shí)現(xiàn)幔荒,可以支持GPU共享糊闽,方案與方案1類似。相比方案1爹梁,還支持GPU類型調(diào)度以及對資源的使用進(jìn)行限制右犹。
缺點(diǎn):
不支持該共享資源的隔離
1. 通過CRD(CustomResourceDefinition)定義兩種資源:ExtendedResource 和 ResourceClass
ExtendedResource
描述了一種擴(kuò)展資源,比如 NVIDIA GPU姚垃;
ResourceClass
定義了容器選擇哪種擴(kuò)展資源念链,它的使用方式和 Kubernetes 中的 Extended Resource類似,用戶可以直接在容器中指定积糯,就像使用 CPU 和 Memory 一樣掂墓。
2. 利用 Scheduler 的擴(kuò)展機(jī)制擴(kuò)展Scheduler,負(fù)責(zé)調(diào)度容器中使用了ResourceClass資源對象的Pod
通過查詢 ResourceClass 對象的定義過濾選擇節(jié)點(diǎn)上的 ExtendedResource 資源看成,從而找到合適的節(jié)點(diǎn)并綁定君编,并將合適的 ExtendedResource 寫到 Pod Annotation 中,供 Kubelet 組件使用川慌。
3. 利用Nvidia Device Plugin插件吃嘿,擴(kuò)展NVIDIA GPU資源祠乃,負(fù)責(zé)與kubelet組件通信以及創(chuàng)建和維護(hù) ExtendedResource 資源對象
ExtendedResource 資源中包含著 GPU 的頻率、顯存等信息兑燥,當(dāng)多個(gè)容器想使用同一塊 GPU 時(shí)亮瓷,我們可以定義一個(gè) ResourceClass 資源對象,在 ResourceClass 中聲明使用多少顯存(這里共享的是顯存)降瞳。這樣嘱支,應(yīng)用部署時(shí),我們只要在容器中聲明使用該 ResourceClass 資源即可挣饥,之后 Scheduler Extender 會過濾符合條件的 ExtendedResource 對象斗塘,綁定到合適的節(jié)點(diǎn)上。
如果要實(shí)現(xiàn)資源共享亮靴,我們可能需要在 ExtendedResource 中記錄顯存的用量情況,供調(diào)度參考于置。
4.VMware GPU共享實(shí)踐
相關(guān)資料:在 Kubernetes 中使用 vGPU 實(shí)現(xiàn)機(jī)器學(xué)習(xí)任務(wù)共享 GPU
實(shí)現(xiàn)思路:
利用GPU廠家茧吊、虛擬化廠商等提供的GPU虛擬化技術(shù),對GPU進(jìn)行虛擬化八毯,把完整的GPU進(jìn)行分割搓侄。然后按照調(diào)度物理GPU一樣在k8s中調(diào)度GPU。
優(yōu)點(diǎn):
- 不用對k8s等進(jìn)行而外擴(kuò)展话速,開發(fā)工作量小
- 具備更好的隔離型
缺點(diǎn):
- 需要使用如vSphere等虛擬化廠商提供的專門的虛擬化軟件對GPU做虛擬化讶踪,并且需要付費(fèi)
- 虛擬化對機(jī)器性能有損耗
5.其他相關(guān)資料
k8s官網(wǎng)對GPU調(diào)度的說明提供了Nvidia GPU容器調(diào)度能力,但是只能將一個(gè)GPU卡分配給一個(gè)容器
從零開始入門 K8s:GPU 管理和 Device Plugin 工作機(jī)制
如何在Kubernetes實(shí)現(xiàn)GPU調(diào)度及共享
Kubernetes GPU使用指南
Kubernetes如何通過Device Plugins來使用NVIDIA GPU
你真的了解多個(gè)docker容器如何共享GPU么泊交?
Kubeflow 使用 Kubernetes 進(jìn)行機(jī)器學(xué)習(xí)
總結(jié)
從社區(qū)乳讥、stackoverflow以及上述各公司的實(shí)踐來看,目前GPU共享主要共享的是GPU的顯存廓俭,資源隔離性差云石,存在資源搶占等情況,是否需要開展GPU共享相關(guān)的開發(fā)工作需要視公司機(jī)器學(xué)習(xí)對GPU的使用場景來決定研乒;
GPU共享存在一定的限制:
用戶申請的資源限制為單卡
-
從顯存共享的角度來說汹忠,單GPU卡共享具有可行性,主要實(shí)現(xiàn)步驟包括:
- 擴(kuò)展資源定義雹熬,重新定義GPU資源宽菜,主要是對顯存和GPU數(shù)量的定義
- 擴(kuò)展調(diào)度器,負(fù)責(zé)在全局調(diào)度器Filter和Bind的時(shí)候判斷節(jié)點(diǎn)上單個(gè)GPU卡是否能夠提供足夠的GPU顯存
- 利用Nvidia Device Plugin插件機(jī)制竿报,完成資源上報(bào)和分配