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