戰(zhàn):用 HAMi 把一張卡分給多個(gè)任務(wù))
GPU 顯存共享實(shí)戰(zhàn)用 HAMi 把一張卡分給多個(gè)任務(wù)【免費(fèi)下載鏈接】HAMiHeterogeneous GPU Sharing on Kubernetes項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ha/HAMi你的訓(xùn)練任務(wù)只要 3GB 顯存Pod 卻必須申請(qǐng)整張卡剩下的顯存只能閑置。如果你要管理這樣的集群可以看看 HAMi一個(gè) CNCF 孵化項(xiàng)目在 Kubernetes 上做 GPU 顯存共享與異構(gòu)計(jì)算調(diào)度讓任務(wù)按需申請(qǐng)顯存和算力應(yīng)用側(cè)不用改一行代碼。 它幫你解決什么一句話把昂貴的加速器當(dāng)成資源池按顯存、算力、卡數(shù)切分再讓調(diào)度器知道每張卡的狀態(tài)。具體就三點(diǎn)按份共享申請(qǐng) 1 張物理卡的同時(shí)用nvidia.com/gpumem限定這張卡上最多能用多少 MB 顯存用nvidia.com/gpucores限定算力百分比。像合租一間房一張卡能住多戶。零應(yīng)用改動(dòng)沿用標(biāo)準(zhǔn) Kubernetes 資源請(qǐng)求/限制寫(xiě)法應(yīng)用代碼對(duì) HAMi 無(wú)感知。設(shè)備感知的調(diào)度提供 binpack、spread、拓?fù)涓兄?、?dòng)態(tài) MIG 等放置模式還能把不同廠商的設(shè)備放進(jìn)同一套調(diào)度流程。知道它干什么之后接下來(lái)看怎么裝。 三步把 HAMi 跑起來(lái)環(huán)境前置條件以 NVIDIA 卡為例驅(qū)動(dòng)不低于 440Kubernetes 不低于 1.23Helm 大于 3.0容器運(yùn)行時(shí)把 nvidia 配成默認(rèn)。其他廠商的卡有不同的后端要求裝之前先翻一下倉(cāng)庫(kù)里對(duì)應(yīng)的 chart 說(shuō)明。然后按順序做三件事給節(jié)點(diǎn)打標(biāo)簽kubectl label nodes node-name gpuon安裝核心組件helm install hami ./charts/hami -n kube-systemchart 就在倉(cāng)庫(kù)的charts/hami/目錄clone 下來(lái)直接用驗(yàn)證并跑樣例kubectl get pods -n kube-system確認(rèn)hami-scheduler、hami-device-plugin都是 Running再kubectl apply -f examples/nvidia/default_use.yamlPod 跑起來(lái)、容器內(nèi)能看到被限定的卡鏈路就算通了。樣例文件在 examples/nvidia/default_use.yaml。?? 核心機(jī)制怎么工作不必背組件清單記住一條流水線、一個(gè)關(guān)鍵參數(shù)就夠了。流水線Pod 提交后先被 Mutating WebhookK8s 的準(zhǔn)入控制器能在對(duì)象入庫(kù)前改它標(biāo)記接著 HAMi 調(diào)度器依次做 filter、score、bind 三步?jīng)Q定放在哪個(gè)節(jié)點(diǎn)、用哪張卡把分配結(jié)果寫(xiě)進(jìn) Pod 注解節(jié)點(diǎn)上的設(shè)備插件隨后調(diào)用 Allocate() 往容器里注入對(duì)應(yīng)的設(shè)備和環(huán)境變量最后監(jiān)控組件開(kāi)始采集用量。整條數(shù)據(jù)流如下圖所示關(guān)鍵參數(shù)是顯存怎么切。Pod 里這段配置resources: limits: nvidia.com/gpu: 1 # 需要 1 張物理卡 nvidia.com/gpumem: 3000 # 這張卡上最多用 3000MB 顯存容器里的 CUDA 申請(qǐng)顯存時(shí)不會(huì)越過(guò)這個(gè)上限。注意一個(gè)容易踩的點(diǎn)安裝后節(jié)點(diǎn)注冊(cè)的nvidia.com/gpu值默認(rèn)是 vGPU虛擬卡數(shù)量Pod 申請(qǐng)時(shí)它指物理卡數(shù)。弄懂原理后看看它到底能把利用率拉高多少。 一張表看懂共享前后差多少經(jīng)典場(chǎng)景用戶 A 每張卡要 10G 顯存、用 2 張用戶 B 每張要 20G、也用 2 張。指標(biāo)不用 HAMi用 HAMi占用的物理卡42利用率50%100%每張卡承載的任務(wù)12 個(gè)以上共享后兩張卡被填滿另外兩張空出來(lái)留給新任務(wù)支持哪些設(shè)備官方文檔列了 NVIDIA、華為昇騰、寒武紀(jì)、海光、天數(shù)智芯、昆侖芯、沐曦、摩爾線程等examples/目錄里還有 AWS Neuron、壁仞、燧原、VastAI 的樣例配置。不同廠商能力有差異有的只支持顯存上限、不支持算力上限落地前建議對(duì)照 pkg/device/ 下的后端目錄確認(rèn)。類別示例GPUNVIDIA、AMD、摩爾線程、天數(shù)智芯、沐曦、壁仞NPU華為昇騰其他加速器寒武紀(jì) MLU、海光 DCU、昆侖芯、燧原、AWS Neuron設(shè)備能用了下一步是挑一套適合自己的調(diào)度策略。 調(diào)度策略怎么選默認(rèn)策略是 binpack也可以按 Pod 用注解覆蓋。按場(chǎng)景挑你的情況建議卡池緊張希望集中放置保持默認(rèn) binpack把任務(wù)塞進(jìn)盡量少的節(jié)點(diǎn)和卡留出整卡給大任務(wù)想分散放置、減少互相干擾節(jié)點(diǎn)級(jí)用 spreadhami.io/node-scheduler-policy: spread單節(jié)點(diǎn)多卡想控制選哪張卡卡級(jí)策略hami.io/gpu-scheduler-policy: binpack支持的 NVIDIA 卡要硬性分區(qū)動(dòng)態(tài) MIG由 HAMi 按需創(chuàng)建、復(fù)用和回收 MIG 實(shí)例兩條注解合起來(lái)就是這樣annotations: hami.io/node-scheduler-policy: spread hami.io/gpu-scheduler-policy: binpack策略實(shí)現(xiàn)都在 pkg/scheduler/policy/。要用動(dòng)態(tài) MIG 的話先讀 docs/develop/dynamic-mig-lifecycle.md它要求 HAMi 是該卡上唯一創(chuàng)建/銷毀 MIG 的控制器和別的 MIG 控制器并存是不支持的。策略選好了跑起來(lái)之后怎么用得上、查得到呢 看得見(jiàn)、查得動(dòng)裝完監(jiān)控默認(rèn)就開(kāi)著。調(diào)度器暴露/metrics端點(diǎn)默認(rèn)端口 31993接上 Prometheus 再配 Grafana 就能看項(xiàng)目還配套一個(gè) WebUI用來(lái)瀏覽資源總覽和設(shè)備分布。遇到不工作的情況先按這張表自查現(xiàn)象先查哪里hami-device-plugin起不來(lái)節(jié)點(diǎn)有沒(méi)有g(shù)puon標(biāo)簽、nvidia 默認(rèn)運(yùn)行時(shí)是否配好、Pod 事件日志Pod 一直 Pending調(diào)度器和 webhook 是否都 Running申請(qǐng)的顯存是否超過(guò)單卡總量顯存上限像沒(méi)生效該設(shè)備后端是否支持顯存限制用 metrics 端點(diǎn)核對(duì)實(shí)際用量工具鏈都齊了最后說(shuō)說(shuō)它到底適合什么人。 適合誰(shuí)邊界在哪HAMi 比較契合這三類場(chǎng)景共享型 AI 集群多租戶的 Notebook、推理、輕訓(xùn)練混跑在同一個(gè)卡池里異構(gòu)混合集群不同廠商的加速器走一套統(tǒng)一調(diào)度入口要可觀測(cè)的平臺(tái)分配了多少、用了多少都能查得到。兩個(gè)邊界要注意隔離能力取決于設(shè)備后端。部分廠商只有顯存上限、沒(méi)有算力上限效果因卡型和驅(qū)動(dòng)版本而異動(dòng)態(tài) MIG 只覆蓋受支持的 NVIDIA 卡且該卡上的 MIG 生命周期必須完全由 HAMi 接管。如果你的場(chǎng)景只是單機(jī)單卡跑一個(gè)大作業(yè)就沒(méi)必要引入這套東西了。一句話收尾HAMi 把整卡獨(dú)占變成顯存級(jí)共享順手把不同加速器的調(diào)度入口也統(tǒng)一了。想讀源碼或動(dòng)手試git clone https://gitcode.com/GitHub_Trending/ha/HAMi?!久赓M(fèi)下載鏈接】HAMiHeterogeneous GPU Sharing on Kubernetes項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ha/HAMi創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考