在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方案中存在的不足。整體方案架構如下所示。
前提條件
叢集要求:
建立ACK叢集Pro版,且叢集為1.24及以上版本。具體步驟,請參見建立Kubernetes託管版叢集。如需升級叢集,請參見升級叢集。
節點要求:
僅支援GPU計算型Super Computing Cluster執行個體規格類型系列sccgn7ex及靈駿節點,請參見執行個體規格類型系列描述。靈駿節點請參見管理靈駿叢集和靈駿節點。
GPU拓撲感知調度的節點需要手動添加標籤
ack.node.gpu.schedule=topology
。相關資訊請參見GPU節點調度屬性標籤說明。
組件要求:
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。
已安裝GPU拓撲感知調度組件。具體步驟,請參見安裝GPU拓撲感知調度組件。
重要如果您先安裝了GPU拓撲感知調度組件,然後安裝了ack-koordinator組件,您需在安裝ack-koordinator後重啟GPU拓撲感知調度組件。
使用限制
計費說明
使用該功能需要安裝AI套件,可能會產生額外費用。請參見雲原生AI套件計費說明。
ack-koordinator組件本身的安裝和使用是免費的,不過需要注意的是,在以下情境中可能產生額外的費用:
使用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開啟拓撲感知調度相關參數:
參數 | 說明 |
| Pod需要將CPU與裝置進行聯合分配。 目前取值僅支援 |
| Pod調度時需要採用哪種NUMA放置策略。
|
| Pod調度時是否需要避開某些NUMA節點。 說明 NUMA節點類型:
|
開啟前後效能對比
本文使用模型載入過程來測試開啟NUMA拓撲感知調度前後帶來的效能提升。我們將使用text-generation-inference工具在兩塊GPU卡上拉起模型,並使用NSight工具統計綁核前後GPU載入的速度變化。
本實驗採用靈駿節點,TGI1.4版本,請參見TGI下載地址,NSight工具請參見NSight工具下載。
採用不同的工具進行測試,測試結果會存在差異。本樣本中的效能對比資料僅為採用NSight工具獲得的測試結果。實際資料以您的作業環境為準。
不開啟拓撲感知調度
相同情境下不開啟拓撲感知調度的應用YAML如下:
查看模型載入時間,可以看出模型完成載入需要15.9s。
開啟拓撲感知調度
相同情境下開啟拓撲感知調度的應用YAML如下:
查看模型載入時間,可以看出模型完成載入需要5.4s,較未開啟時提升了66%。