全部產品
Search
文件中心

Container Service for Kubernetes:啟用NUMA拓撲感知調度

更新時間:Jun 19, 2024

在CPU與GPU間通訊頻繁的情境下,跨NUMA(Non-uniform memory access)節點訪問會導致延遲增加、頻寬受限等問題,從而影響系統整體效能。為瞭解決此類問題,ACK基於Scheduler Framework機制,實現NUMA拓撲感知調度,將Pod調度到最佳的NUMA節點上,從而減少跨NUMA節點的訪問以最佳化效能。

工作原理

NUMA節點是構成非統一記憶體存取(NUMA)系統的基本單位,一個NUMA集合是指單個Node節點上多個NUMA節點的組合,用於實現計算資源的有效分配,並降低處理器間記憶體訪問的競爭。在8 GPU卡機器,即配備了8塊GPU卡的高效能機器中,通常包含多個NUMA節點。當CPU沒有綁核或CPU沒有與GPU分配在相同NUMA上時,可能會由於CPU爭搶或CPU與GPU跨NUMA通訊導致應用執行效能下降。為了使應用的執行效能最大化,您可以選擇將CPU與GPU綁定在相同NUMA下。

原生的基於kubelet CPU Policy以及NUMA Topology Policy的方案能夠在單機上實現將CPU與GPU綁定在相同NUMA上的效果,但是在叢集中使用時會存在一些痛點:

  • 放置結果調度器不感知:調度器無法感知到節點上已指派的具體CPU以及GPU,繼而無法判斷剩餘的CPU與GPU資源是否能夠滿足Pod的QoS要求,導致調度後大量出現AdmissionError狀態的Pod,嚴重時可能導致叢集崩潰。

  • 放置效果上層不可控:由於kubelet拓撲分配策略在原生Kubernetes中只能在節點的進程啟動參數裡看到,無法通過節點標籤等叢集層面手段擷取。因此,在提交任務時,您無法指定工作負載運行在支援聯合分配的節點上,導致應用的實際運行效果具有較大的波動性。

  • 拓撲策略使用複雜:NUMA拓撲策略通過節點進行聲明,因此單一節點上只能帶有一種拓撲策略。提交任務並使用拓撲策略前,叢集資源管理員需要手動劃分叢集,在節點上進行特殊標記,且任務Pod上也需要聲明帶有特殊標記的節點親和。此外,不同策略的Pod即使相互之間沒有幹擾也無法放置於相同節點上,導致叢集利用率下降。

為瞭解決上述問題,ACK基於Scheduler Framework實現了拓撲感知調度能力,同時採用自主研發的gputopo-device-plugin以及ack-koordinator組件的ack-koordlet完成節點CPU、GPU拓撲結構上報,並且支援在工作負載上聲明NUMA拓撲分配策略的能力,解決了原生kubelet方案中存在的不足。整體方案架構如下所示。

前提條件

叢集要求:

節點要求:

組件要求:

  • kube-scheduler組件版本需高於6.4.4版本。相關介紹,請參見kube-scheduler。如果您需要升級kube-scheduler組件,請在Container Service控制台單擊目的地組群,然後選擇營運管理 > 組件管理升級組件。

  • 已安裝ack-koordinator(原ack-slo-manager)。具體操作,請參見ack-koordinator(ack-slo-manager)

    • ACK靈駿叢集:直接完成ack-koordinator組件的安裝。

    • ACK叢集Pro版:配置ack-koordinator參數時,需設定Feature Gate agentFeatures的取值為NodeTopologyReport=true。

      image

  • 已安裝GPU拓撲感知調度組件。具體步驟,請參見安裝GPU拓撲感知調度組件

    重要

    如果您先安裝了GPU拓撲感知調度組件,然後安裝了ack-koordinator組件,您需在安裝ack-koordinator後重啟GPU拓撲感知調度組件。

使用限制

  • 不支援與CPU拓撲感知調度GPU拓撲感知調度同時使用。

  • 僅支援CPU與GPU裝置間的聯合分配。

  • 應用Pod中的所有容器的CPU Request必須為整數(單位:Core),且Request與Limit相同。

  • 應用Pod中容器的GPU資源通過aliyun.com/gpu申請,目前僅支援整卡申請。

計費說明

使用該功能需要安裝AI套件,可能會產生額外費用。請參見雲原生AI套件計費說明

ack-koordinator組件本身的安裝和使用是免費的,不過需要注意的是,在以下情境中可能產生額外的費用:

  • ack-koordinator是非託管組件,安裝後將佔用Worker節點資源。您可以在安裝組件時配置各模組的資源申請量。

  • ack-koordinator預設會將資源畫像、精細化調度等功能的監控指標以Prometheus的格式對外透出。若您配置組件時開啟了ACK-Koordinator開啟Prometheus監控指標選項並使用了阿里雲Prometheus服務,這些指標將被視為自訂指標併產生相應費用。具體費用取決於您的叢集規模和應用數量等因素。建議您在啟用此功能前,仔細閱讀阿里雲Prometheus計費說明,瞭解自訂指標的免費額度和收費策略。您可以通過賬單和用量查詢,監控和管理您的資源使用方式。

使用NUMA拓撲感知調度

您可以通過在Pod上增加如下Annotation來聲明NUMA拓撲感知調度要求:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    cpuset-scheduler: required                           # 啟用綁定CPU
    scheduling.alibabacloud.com/numa-topology-spec: |    # 表明此Pod的NUMA拓撲需求
      {
        "numaTopologyPolicy": "SingleNUMANode",
        "singleNUMANodeExclusive": "Preferred",
      }
spec:
  containers:
  - name: example
    resources:
      limits:
        aliyun.com/gpu: '4'
        cpu: '24'
      requests:
        aliyun.com/gpu: '4'
        cpu: '24'

以下為NUMA開啟拓撲感知調度相關參數:

參數

說明

cpuset-scheduler

Pod需要將CPU與裝置進行聯合分配。

目前取值僅支援required

numaTopologyPolicy

Pod調度時需要採用哪種NUMA放置策略。

  • SingleNUMANode:Pod調度時CPU與裝置需要放置在相同NUMA下,如果沒有滿足條件的節點,Pod將無法被調度。

  • Restricted:Pod調度時CPU與裝置需要放置在相同的NUMA集合下,如果沒有滿足條件的節點,Pod將無法被調度。

  • BestEffort:Pod調度時盡量將CPU與裝置放置在相同NUMA下,如果沒有節點滿足這一條件,則選擇最優節點進行放置。

singleNUMANodeExclusive

Pod調度時是否需要避開某些NUMA節點。

說明

NUMA節點類型:

  • single:在該NUMA節點上僅運行要求綁定到單個NUMA節點的Pod。

  • shared:類型表明有些Pod可以跨多個NUMA節點分散運行。

  • idle:沒有任何Pod使用的NUMA節點,可以被新的Pod使用。

  • (預設值)Required:若當前Pod要求綁定到單個NUMA節點,則Pod調度時只能使用idlesingle類型的NUMA節點。若可以跨多個NUMA節點分散運行,則Pod調度時只能使用idleshared類型的NUMA節點。

  • Preferred:Pod調度時不限制NUMA節點的使用類型。

開啟前後效能對比

本文使用模型載入過程來測試開啟NUMA拓撲感知調度前後帶來的效能提升。我們將使用text-generation-inference工具在兩塊GPU卡上拉起模型,並使用NSight工具統計綁核前後GPU載入的速度變化。

本實驗採用靈駿節點,TGI1.4版本,請參見TGI下載地址,NSight工具請參見NSight工具下載

重要

採用不同的工具進行測試,測試結果會存在差異。本樣本中的效能對比資料僅為採用NSight工具獲得的測試結果。實際資料以您的作業環境為準。

不開啟拓撲感知調度

相同情境下不開啟拓撲感知調度的應用YAML如下:

展開查看YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: tgi
  name: tgi-deployment-basic
  namespace: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tgi
  template:
    metadata:
      labels:
        app: tgi
    spec:
      containers:
        - command:
            - sleep
            - 3600d
          image: >-
            ghcr.io/huggingface/text-generation-inference:1.4
          imagePullPolicy: IfNotPresent
          name: tgi
          ports:
            - containerPort: 80
              protocol: TCP
          resources:
            limits:
              cpu: '24'
              nvidia.com/gpu: '4'
            requests:
              cpu: '24'
              nvidia.com/gpu: '4'
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /llm
              name: volume-1710932083254
      restartPolicy: Always
      schedulerName: default-scheduler
      volumes:
        - name: volume-1710932083254
          persistentVolumeClaim:
            claimName: model

查看模型載入時間,可以看出模型完成載入需要15.9s。

image.png

開啟拓撲感知調度

相同情境下開啟拓撲感知調度的應用YAML如下:

展開查看YAML

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: tgi-numa
  name: tgi-numa-deployment-basic
  namespace: yueming-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tgi-numa
  template:
    metadata:
      annotations:
        cpuset-scheduler: required
        scheduling.alibabacloud.com/resource-spec: |
          {
            "numaTopologyPolicy": "SingleNUMANode"
          }
      labels:
        app: tgi-numa
    spec:
      containers:
        - command:
            - sleep
            - 3600d
          image: >-
            ghcr.io/huggingface/text-generation-inference:1.4
          imagePullPolicy: IfNotPresent
          name: numa
          resources:
            limits:
              aliyun.com/gpu: '4'
              cpu: '24'
            requests:
              aliyun.com/gpu: '4'
              cpu: '24'
          volumeMounts:
            - mountPath: /llm
              name: volume-1710932083254
      restartPolicy: Always
      schedulerName: default-scheduler
      volumes:
        - name: volume-1710932083254
          persistentVolumeClaim:
            claimName: model

查看模型載入時間,可以看出模型完成載入需要5.4s,較未開啟時提升了66%。

image

相關文檔