Volcano社區新版本發佈!7大功能全面增強隊列能力與調度穩定性

本文分享自華爲雲社區《Volcano 社區 v1.9.0 版本正式發佈!全面增強隊列能力與調度穩定性》,作者:雲容器大未來。

北京時間2024年5月21日,Volcano社區v1.9.0版本正式發佈,此次版本增加了以下新特性:

  • 支持彈性隊列容量capacity調度
  • 支持隊列與節點間的親和調度
  • Volcano支持Kubernetes v1.29
  • GPU共享支持節點打分調度
  • 增強scheduler metrics指標
  • 新增License合規性檢查
  • 提升調度穩定性

Volcano是業界首個雲原生批量計算項目,於2019年6月在上海 KubeCon 正式開源,並在2020年4月成爲 CNCF 官方項目。2022年4月,Volcano 正式晉級爲CNCF 孵化項目。Volcano 社區開源以來,受到衆多開發者、合作伙伴和用戶的認可和支持。截至目前,累計有600+全球開發者參與社區貢獻。

volcano.png

支持彈性隊列容量capacity調度

Volcano現在使用proportion插件來進行隊列管理,用戶可以設置隊列的guarantee、capability等字段來設置隊列的預留資源和容量上限。並通過設置隊列的weight值來實現集羣內的資源共享,隊列按照weight值按比例劃分集羣資源,但這種隊列管理方式存在以下問題:

  • 隊列劃分的資源容量通過權重體現,不夠直觀。
  • 隊列內的所有資源使用相同的比例進行劃分,不能爲隊列的每一維資源單獨設置容量。

基於以上考慮,Volcano實現了新的隊列彈性容量管理能力,它支持:

  • 用戶可以直接爲隊列設置每一維度資源的容量,而不是設置weigh值來實現。
  • 基於deserved的隊列彈性容量調度,支持隊列的資源共享和回收。

比如在AI大模型訓練中分別爲隊列中不同的GPU型號如A100和V100,設置不同的資源容量。同時在集羣資源空閒時,隊列可以複用其他空閒隊列的資源,並在需要時進行資源回收,直到回收到用戶爲隊列設置的資源容量爲止,即應得資源量deserved,從而實現彈性容量能力。

使用改功能時需要設置隊列的deserved字段,爲每一維資源設置應得資源量。同時需要在調度配置中打開capacity插件,並關閉proportion插件。

apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
  name: demo-queue
spec:
  reclaimable: true
  deserved: # set the deserved field.
    cpu: 64
    memeory: 128Gi
    nvidia.com/a100: 40
    nvidia.com/v100: 80

隊列彈性容量調度的完整使用例子,請參考:How to use capacity plugin[1]

關於彈性隊列容量設計文檔,請參考Capacity scheduling Design[2]

支持隊列與節點間的親和調度

隊列通常關聯着公司內的部門,而不同部門通常需要使用不同的異構資源類型,比如大模型訓練團隊需要使用NIVDIA的Tesla GPU,而推薦團隊需要使用AMD的GPU,當用戶提交作業到隊列時,需要根據隊列的屬性將作業自動調度到對應資源類型的節點上。

爲此Volcano實現了隊列和節點的親和調度能力,用戶只需在隊列的affinity字段設置需要親和的節點標籤,Volcano會自動將提交到當前隊列的作業調度到隊列關聯的節點上,用戶無需單獨設置作業的親和性,而只需統一設置隊列的親和性,提交到隊列的作業都會根據隊列與節點的親和性將作業調度到對應的節點。

該特性同時支持硬親和、軟親和、反親和調度,使用時需要爲節點設置key爲volcano.sh/nodegroup-name的標籤,然後設置隊列的affinity字段,指定硬親和、軟親和和反親和的標籤值。例如如下的隊列設置,表示提交到該隊列的作業需要調度到標籤值爲groupname1和groupname2的節點,並優先調度到標籤值爲groupname2的節點,同時,作業不能調到到標籤值爲groupname3和groupname4的節點,當資源不足時則也可以調度到標籤值爲groupname3的節點上。

apiVersion: scheduling.volcano.sh/v1beta1
kind: Queue
metadata:
  name: default
  spec:
    reclaimable: true
    weight: 1
    affinity:            # added field
      nodeGroupAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
        - <groupname1>
        - <groupname2>    
        preferredDuringSchedulingIgnoredDuringExecution:
        - <groupname1>
      nodeGroupAntiAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
        - <groupname3>
        - <gropuname4>
        preferredDuringSchedulingIgnoredDuringExecution:
        - <groupname3>

該功能對應的調度插件名爲nodegroup,完整使用例子請參考:How to use nodegroup plugin[3]

詳細設計文檔請參考:The nodegroup design[4]

GPU共享功能支持節點打分調度

GPU共享是Volcano v1.8版本推出的GPU共享與隔離方案,提供GPU共享、設備顯存控制能力,以提升AI訓練推理場景下GPU資源利用率低的問題。v1.9在該功能基礎上新增了對GPU節點打分的策略,從而可以在作業分配時選擇最優的節點,進一步提升資源利用率,用戶可以設置不同的打分策略。目前支持以下兩種策略:

  • Binpack:提供GPU卡粒度的binpack算法,優先把一個節點上的已經分配了資源的GPU卡佔滿,避免資源碎片和浪費。

  • Spread:優先使用空閒的GPU卡而不是已經分配了資源的共享卡。

詳細使用文檔請參考:How to use gpu sharing[5]

Volcano支持Kubernetes v1.29

Volcano版本緊跟Kubernetes社區版本節奏,對Kubernetes的每個大的基數版本都進行支持,目前最新支持的版本爲v1.29,並運行了完整的UT、E2E用例,保證功能和可靠性。如果您想參與Volcano適配Kubernetes新版本的開發工作,請參考:https://github.com/volcano-sh/volcano/pull/3459 進行社區貢獻。

增強scheduler metrics指標

Volcano使用了client-go客戶端和Kubernetes交互,儘管客戶端可以設置QPS來避免請求被限流,但是客戶端實際使用的QPS到底達到了多少卻很難觀察到,爲了實時觀測到客戶端請求的頻率,Volcano新增了client-go客戶端的metrics指標,用戶可以通過訪問metrics接口,查看GET、POST等請求在每秒鐘的請求數量,從而確定每秒鐘實際使用的QPS,以此決定是否需要調整客戶端設置的QPS。同時client-go的相關指標還包括客戶端證書輪轉週期統計、每個請求的response size統計等。

用戶可以使用curl http://$volcano_scheduler_pod_ip:8080/metrics 來獲取volcano scheduler的所有詳細指標。

詳細PR見:[feat] Add rest client metrics by Monokaix · Pull Request #3274 · volcano-sh/volcano (github.com)[6]

新增License合規性檢查

爲了增強Volcano社區開源license合規治理規範,避免引入傳染性開源協議,規避潛在風險,Volcano社區引入了開源license合規檢查工具,所謂傳染性協議指的是使用了該協議作爲開源許可的軟件在修改、使用、複製之後生成的衍生作品,也必須以該協議進行開源。開發者提交的PR會引入的三庫如果包含了傳染性開源協議比如GPL,LGPL等,CI門禁會進行攔截,開發者需要將三方庫替換爲松自由軟件許可協議比如MIT、Apache 2.0,BSD等,以通過開源license合規檢查。

提升調度穩定性

Volcano v1.9.0版本在搶佔、調度失敗重試、避免內存泄露、安全性增強等方面做了較多優化,具體內容包括:

致謝貢獻者

Volcano 1.9.0 版本包含了來自多位社區貢獻者的代碼提交,在此對各位貢獻者表示由衷的感謝:

貢獻者GitHub ID

 

參考資料:

[1] How to use capacity plugin:

[2] Capacity scheduling Design:

[3] How to use nodegroup plugin:

[4] The nodegroup design:

[5] How to use gpu sharing:

[6] [feat] Add rest client metrics by Monokaix · Pull Request #3274 · volcano-sh/volcano (github.com):

[7] [cherry-pick for release-1.9]fix PodGroup being incorrectly deleted due to frequent creation and deletion of pods by guoqinwill · Pull Request #3376 · volcano-sh/volcano (github.com):

[8] ignore PredicateFn err info for preempt & reclaim scheduler plugin by LivingCcj · Pull Request #3458 · volcano-sh/volcano (github.com):

[9] fix errTask channel memory leak by bibibox · Pull Request #3435 · volcano-sh/volcano (github.com):

[10] Fix queue metrics when there are no jobs in it by Monokaix · Pull Request #3463 · volcano-sh/volcano (github.com):

[11] Remove list secret in controller ClusterRole by lekaf974 · Pull Request #3449 · volcano-sh/volcano (github.com):

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章