Kubernetes的共享GPU集群調(diào)度

問題背景

全球主要的容器集群服務(wù)廠商的Kubernetes服務(wù)都提供了Nvidia GPU容器調(diào)度能力,但是通常都是將一個(gè)GPU卡分配給一個(gè)容器蛾方。這可以實(shí)現(xiàn)比較好的隔離性,確保使用GPU的應(yīng)用不會(huì)被其他應(yīng)用影響;對(duì)于深度學(xué)習(xí)模型訓(xùn)練的場(chǎng)景非常適合桩砰,但是如果對(duì)于模型開發(fā)和模型預(yù)測(cè)的場(chǎng)景就會(huì)比較浪費(fèi)拓春。 大家的訴求是能夠讓更多的預(yù)測(cè)服務(wù)共享同一個(gè)GPU卡上,進(jìn)而提高集群中Nvidia GPU的利用率亚隅。而這就需要提供GPU資源的劃分硼莽,而這里GPU資源劃分的維度指的就是GPU顯存和Cuda Kernel線程的劃分。通常在集群級(jí)別談支持共享GPU煮纵,通常是兩件事情:

1.調(diào)度

2.隔離懂鸵,我們這里主要討論的是調(diào)度,隔離的方案未來會(huì)基于Nvidia的MPS來實(shí)現(xiàn)行疏。

而對(duì)于細(xì)粒度的GPU卡調(diào)度匆光,目前Kubernetes社區(qū)并沒有很好的方案,這是由于Kubernetes對(duì)于GPU這類擴(kuò)展資源的定義僅僅支持整數(shù)粒度的加加減減酿联,無法支持復(fù)雜資源的分配终息。比如用戶希望使用Pod A占用半張GPU卡,這在目前Kubernetes的架構(gòu)設(shè)計(jì)中無法實(shí)現(xiàn)資源分配的記錄和調(diào)用贞让。這里挑戰(zhàn)是多卡GPU共享是實(shí)際矢量資源問題周崭,而Extened Resource是標(biāo)量資源的描述。

針對(duì)此問題震桶,我們?cè)O(shè)計(jì)了一個(gè)outoftree的共享GPU調(diào)度方案休傍,該方案依賴于Kubernetes的現(xiàn)有工作機(jī)制:

Extended Resource定義

Scheduler Extender機(jī)制

Device Plugin機(jī)制

用戶場(chǎng)景

作為集群管理員,我想提高集群的GPU使用率;在開發(fā)過程中蹲姐,多個(gè)用戶共享模型開發(fā)環(huán)境

作為應(yīng)用開發(fā)人員,我希望能夠同時(shí)在Volta GPU上運(yùn)行多個(gè)推理任務(wù)

目標(biāo)

能夠讓使用者通過API描述對(duì)于一個(gè)可共享資源的申請(qǐng)人柿, 并能實(shí)現(xiàn)該種資源的調(diào)度

非目標(biāo)

不支持該共享資源的隔離

不支持超賣

設(shè)計(jì)原則

明確問題簡(jiǎn)化設(shè)計(jì)柴墩,第一步只負(fù)責(zé)調(diào)度和部署,后續(xù)再實(shí)現(xiàn)運(yùn)行時(shí)顯存管控凫岖。

有很多的客戶明確的訴求是首先可以支持多AI應(yīng)用可以調(diào)度到同一個(gè)GPU上江咳,他們可以接受從應(yīng)用級(jí)別控制顯存的大小,利用類似gpu_options.per_process_gpu_memory_fraction控制應(yīng)用的顯存使用量哥放。那我們要解決的問題就先簡(jiǎn)化到以顯存為調(diào)度標(biāo)尺歼指,并且把顯存使用的大小以參數(shù)的方式傳遞給容器內(nèi)部甥雕。

不做侵入式修改

本設(shè)計(jì)中不會(huì)修改Kubernetes核心的Extended Resource的設(shè)計(jì), Scheduler的實(shí)現(xiàn)社露,Device Plugin的機(jī)制以及Kubelet的相關(guān)設(shè)計(jì)。重用Extended Resource描述共享資源的申請(qǐng)API。這樣的好處在于提供一個(gè)可以移植的方案附鸽,用戶可以在原生Kubernetes上使用這個(gè)方案。

按顯存和按卡調(diào)度的方式可以在集群內(nèi)并存坷备,但是同一個(gè)節(jié)點(diǎn)內(nèi)是互斥的省撑,不支持二者并存丁侄;要么是按卡數(shù)目,要么是按顯存分配石景。

詳細(xì)設(shè)計(jì)

前提:

依舊延用Kubernetes Extended Resource定義,但是衡量維度最小單位從1個(gè)GPU卡變?yōu)镚PU顯存的MiB潮孽。如果所節(jié)點(diǎn)使用的GPU為單卡16GiB顯存,它對(duì)應(yīng)的資源就是16276MiB

由于用戶對(duì)于共享GPU的訴求在于模型開發(fā)和模型預(yù)測(cè)場(chǎng)景筷黔,在此場(chǎng)景下往史,用戶申請(qǐng)的GPU資源上限不會(huì)超過一張卡,也就是申請(qǐng)的資源上限為單卡

而我們的工作首先是定義了兩個(gè)新的Extended Resource: 第一個(gè)是gpu-mem佛舱, 對(duì)應(yīng)的是GPU顯存;第二個(gè)是gpu-count椎例,對(duì)應(yīng)的是GPU卡數(shù)。 通過兩個(gè)標(biāo)量資源描述矢量資源, 并且結(jié)合這一資源请祖,提供支持共享GPU的工作機(jī)制订歪。下面是基本的架構(gòu)圖:

核心功能模塊:

GPU Share Scheduler Extender: 利用Kubernetes的調(diào)度器擴(kuò)展機(jī)制,負(fù)責(zé)在全局調(diào)度器Filter和Bind的時(shí)候判斷節(jié)點(diǎn)上單個(gè)GPU卡是否能夠提供足夠的GPU Mem肆捕,并且在Bind的時(shí)刻將GPU的分配結(jié)果通過annotation記錄到Pod Spec以供后續(xù)Filter檢查分配結(jié)果刷晋。

GPU Share Device Plugin: 利用Device Plugin機(jī)制,在節(jié)點(diǎn)上被Kubelet調(diào)用負(fù)責(zé)GPU卡的分配慎陵,依賴scheduler Extender分配結(jié)果執(zhí)行眼虱。

具體流程:

1. 資源上報(bào)

GPU Share Device Plugin利用nvml庫查詢到GPU卡的數(shù)量和每張GPU卡的顯存, 通過ListAndWatch()將節(jié)點(diǎn)的GPU總顯存(數(shù)量 *顯存)作為另外Extended Resource匯報(bào)給Kubelet席纽; Kubelet進(jìn)一步匯報(bào)給Kubernetes API Server捏悬。 舉例說明,如果節(jié)點(diǎn)含有兩塊GPU卡胆筒,并且每塊卡包含16276MiB邮破,從用戶的角度來看:該節(jié)點(diǎn)的GPU資源為16276 *2 = 32552; 同時(shí)也會(huì)將節(jié)點(diǎn)上的GPU卡數(shù)量2作為另外一個(gè)Extended Resource上報(bào)诈豌。

2. 擴(kuò)展調(diào)度

GPU Share Scheduler Extender可以在分配gpu-mem給Pod的同時(shí)將分配信息以annotation的形式保留在Pod spec中,并且在過濾時(shí)刻根據(jù)此信息判斷每張卡是否包含足夠可用的gpu-mem分配抒和。

2.1Kubernetes默認(rèn)調(diào)度器在進(jìn)行完所有過濾(filter)行為后會(huì)通過http方式調(diào)用GPU Share Scheduler Extender的filter方法, 這是由于默認(rèn)調(diào)度器計(jì)算Extended Resource時(shí)矫渔,只能判斷資源總量是否有滿足需求的空閑資源,無法具體判斷單張卡上是否滿足需求摧莽;所以就需要由GPU Share Scheduler Extender檢查單張卡上是否含有可用資源庙洼。

以下圖為例, 在由3個(gè)包含兩塊GPU卡的節(jié)點(diǎn)組成的Kubernetes集群中镊辕,當(dāng)用戶申請(qǐng)gpu-mem=8138時(shí)油够,默認(rèn)調(diào)度器會(huì)掃描所有節(jié)點(diǎn),發(fā)現(xiàn)N1所剩的資源為 (16276 * 2 - 16276 -12207 = 4069 )不滿足資源需求征懈,N1節(jié)點(diǎn)被過濾掉石咬。

而N2和N3節(jié)點(diǎn)所剩資源都為8138MiB,從整體調(diào)度的角度看卖哎,都符合默認(rèn)調(diào)度器的條件;此時(shí)默認(rèn)調(diào)度器會(huì)委托GPU Share Scheduler Extender進(jìn)行二次過濾焕窝,在二次過濾中它掂,GPU Share Scheduler Extender需要判斷單張卡是否滿足調(diào)度需求虐秋,在查看N2節(jié)點(diǎn)時(shí)發(fā)現(xiàn)該節(jié)點(diǎn)雖然有8138MiB可用資源熟妓,但是落到每張卡上看译仗,GPU0和分別GPU1只有4069MiB的可用資源,無法滿足單卡8138MiB的訴求笛辟。而N3節(jié)點(diǎn)雖然也是總共有8138MiB可用資源手幢,但是這些可用資源都屬于GPU0,滿足單卡可調(diào)度的需求。由此胀蛮,通過GPU Share Scheduler Extender的篩選就可以實(shí)現(xiàn)精準(zhǔn)的條件篩選粪狼。

2.2當(dāng)調(diào)度器找到滿足條件的節(jié)點(diǎn)不跟,就會(huì)委托GPU Share Scheduler Extender的bind方法進(jìn)行節(jié)點(diǎn)和Pod的綁定,這里Extender需要做的是兩件事情

以binpack的規(guī)則找到節(jié)點(diǎn)中最優(yōu)選擇的GPU卡id,此處的最優(yōu)含義是對(duì)于同一個(gè)節(jié)點(diǎn)不同的GPU卡吴趴,以binpack的原則作為判斷條件厢拭,優(yōu)先選擇空閑資源滿足條件但同時(shí)又是所剩資源最少的GPU卡,并且將其作為ALIYUN_COM_GPU_MEM_IDX保存到Pod的annotation中薄坏;同時(shí)也保存該P(yáng)od申請(qǐng)的GPU Memory作為ALIYUN_COM_GPU_MEM_POD和ALIYUN_COM_GPU_MEM_ASSUME_TIME保存至Pod的annotation中,并且在此時(shí)進(jìn)行Pod和所選節(jié)點(diǎn)的綁定涵但。

注意:這時(shí)還會(huì)保存ALIYUN_COM_GPU_MEM_ASSIGNED的Pod annotation,它被初始化為“false”。它表示該P(yáng)od在調(diào)度時(shí)刻被指定到了某塊GPU卡哨啃,但是并沒有真正在節(jié)點(diǎn)上創(chuàng)建該P(yáng)od。ALIYUN_COM_GPU_MEM_ASSUME_TIME代表了指定時(shí)間。

如果此時(shí)發(fā)現(xiàn)分配節(jié)點(diǎn)上沒有GPU資源符合條件莱找,此時(shí)不進(jìn)行綁定,直接不報(bào)錯(cuò)退出浮定,默認(rèn)調(diào)度器會(huì)在assume超時(shí)后重新調(diào)度。

調(diào)用Kubernetes API執(zhí)行節(jié)點(diǎn)和Pod的綁定

以下圖為例悯辙,當(dāng)GPU Share Scheduler Extender要把gpu-mem:8138的Pod和經(jīng)過篩選出來的節(jié)點(diǎn)N1綁定,首先會(huì)比較不同GPU的可用資源击费,分別為GPU0(12207),GPU1(8138),GPU2(4069),GPU3(16276),其中GPU2所剩資源不滿足需求,被舍棄掉;而另外三個(gè)滿足條件的GPU中, GPU1恰恰是符合空閑資源滿足條件但同時(shí)又是所剩資源最少的GPU卡,因此GPU1被選出歪沃。

3. 節(jié)點(diǎn)上運(yùn)行

當(dāng)Pod和節(jié)點(diǎn)綁定的事件被Kubelet接收到后萎羔,Kubelet就會(huì)在節(jié)點(diǎn)上創(chuàng)建真正的Pod實(shí)體育灸,在這個(gè)過程中, Kubelet會(huì)調(diào)用GPU Share Device Plugin的Allocate方法,Allocate方法的參數(shù)是Pod申請(qǐng)的gpu-mem。而在Allocate方法中,會(huì)根據(jù)GPU Share Scheduler Extender的調(diào)度決策運(yùn)行對(duì)應(yīng)的Pod

3.1會(huì)列出該節(jié)點(diǎn)中所有狀態(tài)為Pending并且ALIYUN_COM_GPU_MEM_ASSIGNED為false的GPU Share Pod

3.2選擇出其中Pod Annotation的ALIYUN_COM_GPU_MEM_POD的數(shù)量與Allocate申請(qǐng)數(shù)量一致的Pod蒋譬。如果有多個(gè)符合這種條件的Pod,就會(huì)選擇其中ALIYUN_COM_GPU_MEM_ASSUME_TIME最早的Pod惠爽。

3.3將該P(yáng)od的annotationALIYUN_COM_GPU_MEM_ASSIGNED設(shè)置為true租副,并且將Pod annotation中的GPU信息轉(zhuǎn)化為環(huán)境變量返回給Kubelet用以真正的創(chuàng)建Pod。

相關(guān)項(xiàng)目

目前項(xiàng)目已經(jīng)開源到github.com上

gpushare-scheduler-extender

gpushare-device-plugin

部署

請(qǐng)參照部署文檔

測(cè)試樣例

1. 首先創(chuàng)建一個(gè)使用aliyun.com/gpu-mem的應(yīng)用

apiVersion: apps/v1kind: Deploymentmetadata:? name: binpack-1? labels:? ? app: binpack-1spec:? replicas: 1? selector:# define how the deployment finds the pods it managesmatchLabels:? ? ? app: binpack-1? template:# define the pods specificationsmetadata:? ? ? labels:? ? ? ? app: binpack-1? ? spec:? ? ? containers:? ? ? - name: binpack-1? ? ? ? image: cheyang/gpu-player:v2? ? ? ? resources:? ? ? ? ? limits:# MiBaliyun.com/gpu-mem: 1024

使用

請(qǐng)參照使用文檔

構(gòu)建

請(qǐng)參照如何構(gòu)建

視頻Demo

Demo 1:部署多個(gè)GPU Share的Pod人弓,發(fā)現(xiàn)他們以binpack的方式被放置到同一個(gè)GPU卡上

視頻地址:http://cloud.video.taobao.com//play/u/2987821887/p/2/e/6/t/1/214292079721.mp4

Demo 2:避免錯(cuò)誤調(diào)度申請(qǐng)資源超過單個(gè)GPU可用資源的Pod

視頻地址:http://cloud.video.taobao.com//play/u/2987821887/p/2/e/6/t/1/214235285109.mp4

Roadmap

利用nvidia MPS實(shí)現(xiàn)隔離

支持該方案可以在由kubeadm初始化的Kubernetes集群自動(dòng)化部署

Scheduler Extener的高可用性

為GPU, RDMA 和彈性網(wǎng)卡提供通用方案

本文作者:必嘫

作者:阿里云云棲社區(qū)

鏈接:http://www.reibang.com/p/99f3b21b534b

來源:簡(jiǎn)書

簡(jiǎn)書著作權(quán)歸作者所有意蛀,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末痒留,一起剝皮案震驚了整個(gè)濱河市伸头,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌魔策,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異堕仔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人旭斥,你說我怎么就攤上這事∷阈荆” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長削葱。 經(jīng)常有香客問我,道長作郭,這世上最難降的妖魔是什么夹攒? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任编检,我火速辦了婚禮允懂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘躁锡。我一直安慰自己,他們只是感情好蜡坊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布据忘。 她就那樣靜靜地躺著勇吊,像睡著了一般礼殊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上族沃,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天及舍,我揣著相機(jī)與錄音,去河邊找鬼。 笑死歼郭,一個(gè)胖子當(dāng)著我的面吹牛病曾,可吹牛的內(nèi)容都是我干的漾根。 我是一名探鬼主播辐怕,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寄疏,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了驳棱?” 一聲冷哼從身側(cè)響起艘策,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎却汉,沒想到半個(gè)月后合砂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體源织,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谈息,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡医窿,死狀恐怖渣聚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情症歇,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布痕钢,位于F島的核電站课梳,受9級(jí)特大地震影響爆土,放射性物質(zhì)發(fā)生泄漏坏瘩。R本人自食惡果不足惜哪自,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一寄症、第九天 我趴在偏房一處隱蔽的房頂上張望铅忿。 院中可真熱鬧柑潦,春花似錦荧琼、人聲如沸镐侯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澈魄。三九已至鲫构,卻和暖如春伐憾,著一層夾襖步出監(jiān)牢的瞬間瀑罗,已是汗流浹背摧玫。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工掠拳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喊熟,地道東北人壁拉。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像乎婿,于是被迫代替她去往敵國和親谢翎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本文使用kubernetes版本較老谊迄,初次實(shí)驗(yàn)簡(jiǎn)單部署,不足之處較多婿失,歡迎交流。 一识藤、容器編排軟件 1、docke...
    任總閱讀 2,189評(píng)論 1 17
  • 七一一夜閱讀 194評(píng)論 0 0
  • 你的柔情我永遠(yuǎn)不懂吓蘑,你的溫存我永遠(yuǎn)不知,你的愛情我永遠(yuǎn)不癡,你是否明白? 奈何饲齐,怎難以雪忘,待花開花落御雕,等我可好?...
    八孑閱讀 179評(píng)論 0 0
  • 我是一個(gè)專業(yè)體重管理教練酸纲,也是一名培訓(xùn)老師闽坡,為了提升自己的溝通演講水平,我參加堅(jiān)持星球的GALA演講訓(xùn)練營外厂。第三天...
    陽光周周閱讀 377評(píng)論 1 2
  • 《以你的名字呼喚我》兒子與男友分手后沉浸在悲痛中代承,父親說的一席話——在你最猝不及防之時(shí),上天就狡詐地找到了我們最脆...
    Anna陶閱讀 339評(píng)論 0 0