例項演示如何使用CCE XGPU虛擬化

华为云开发者联盟發表於2024-04-01

本文分享自華為雲社群《CCE XGPU虛擬化的使用》,作者: 可以交個朋友。

一 背景

在網際網路場景中,使用者的AI訓練和推理任務對GPU虛擬化有著強烈的訴求。GPU卡作為重要的計算資源不管是在演算法訓練還是預測上都不可或缺,而對於常見的演算法訓練業務或智慧業務都有往容器遷移演進的趨勢,所以如何更好的利用GPU資源成了容器雲平臺需要解決的問題。雲廠商如果提供GPU虛擬化可以為使用者帶來的如下收益:

  • 提高資源利用率(GPU/視訊記憶體)。GPU共享後,總利用率接近執行任務利用率之和,減少了資源浪費。
  • 提高服務質量(QoS),增強公平性。多個任務既可以同時開始享受資源,也可以單獨保證某一個任務的執行。
  • 減少任務排隊時間和總任務的消耗時間。假設兩個任務結束時間分別是x,y,透過GPU共享,兩個任務全部結束的時間小於x+y。
  • 叢集中可以執行更多工,透過分時複用,減少搶佔。

image.png

二 CCE平臺上GPU虛擬化的優勢

CCE GPU虛擬化採用自研xGPU虛擬化技術,能夠動態對GPU裝置視訊記憶體與算力進行劃分,單個GPU卡最多虛擬化成20個GPU虛擬裝置。相對於靜態分配來說,虛擬化的方案更加靈活,最大程度保證業務穩定的前提下,可以完全由使用者自己定義使用的GPU量,

  • 靈活:精細配置GPU算力佔比及視訊記憶體大小,算力分配粒度為5%GPU,視訊記憶體分配粒度達MB級別。
  • 隔離:支援視訊記憶體和算力的嚴格隔離,支援單視訊記憶體隔離,算力與視訊記憶體同時隔離兩類場景。
  • 相容:業務無需重新編譯,無需進行CUDA庫替換,對業務無感。

三 CCE上如何更好的使用xGPU能力

建議使用者在使用GPU資源時,提前建立好對應規格型號的GPU節點資源池,方便後期管理和排程。
image.png

3.1 安裝外掛

GPU的使用需要藉助CCE外掛能力實現,前往CCE 外掛市場進行外掛的安裝。

安裝Volcano排程器外掛

image.png

外掛安裝完成後,可前往配置中心-排程設定,設定預設排程器為Volcano,如果不設定需要在負載yaml中指定排程器spec.schedulerName: volcano

image.png

安裝GPU外掛(CCE AI 套件)

外掛中心安裝GPU外掛,CCE平臺已經提供多個版本的驅動,在列出的驅動列表中選擇使用即可,支援不同節點池選擇不同驅動版本。也支援自行配置其它版本的驅動,需要自行提供驅動下載連結。

image.png

3.2 建立負載任務呼叫xGPU資源

根據xGPU支援虛擬化維度進行操作實踐

注意: 未開啟volcano作為全域性排程器時,需要在yaml指定排程器為volcano

3.2.1 xGPU模式之視訊記憶體隔離如何使用

建立負載app01.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app01
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app01
  template:
    metadata:
      labels:
        app: app01
    spec:
      containers:
      - name: bert-container
        image: swr.cn-north-4.myhuaweicloud.com/container-solution/bert-intent-detection:v1 
        ports: 
        - containerPort: 80
        resources:
          limits:
            volcano.sh/gpu-mem.128Mi: '16'
          requests:
            volcano.sh/gpu-mem.128Mi: '16'
      schedulerName: volcano

volcano.sh/gpu-mem.128Mi: '16': 視訊記憶體申請量等於 128Mi x 16=2048Mi=2Gi;也當前負載最多隻能使用2Gi的視訊記憶體資源。

檢視Pod資訊,pod yaml自動生成兩條註解,同樣也標註了負載使用了2Gi視訊記憶體

image.png

容器內使用nvidia-smi檢視視訊記憶體,表現最大視訊記憶體為2Gi,視訊記憶體隔離生效

image.png

xGPU視訊記憶體隔離能力透過在HCE2.0上實現,在節點上檢視/proc/xgpu目錄,0表示使用的物理gpu顯示卡的序列號(如果是多個卡則有多個目錄,檔名從0開始,各個檔案對應相關下標的GPU卡),container目錄下存放使用gpu虛擬化的 容器資訊。

image.png

檢視容器ID對應命令,檢視meminfo和quota檔案,可以看到HCE2.0控制給容器GPU卡視訊記憶體和算力的上限配置。

image.png

meminfo :容器分配視訊記憶體為2Gi,
quota :容器分配的算力,0代表不限制算力可以使用到整卡的算力
路徑中xgpu3: 代表虛擬gpu卡的卡號 每建立一個新的容器都會按次序生成一個新的虛擬gpu卡號

3.3.2 單節點多張gpu卡場景分析

購買多gpu卡機型

image.png

虛擬化模式下不支援單pod申請超過一張卡的gpu資源,如單pod需要使用多卡資源請關閉gpu虛擬化;同時多卡排程,也不支援1.x,2.x 形式,需要為大於1的整數

image.png

節點上能看到兩張gpu物理卡編號

image.png

看到容器資源視訊記憶體隔離生效,xGPU1是從0號gpu卡上軟體連線過來的

image.png

3.2.3 xGPU模式之視訊記憶體算力均隔離如何使用

建立負載app02,yaml如下

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app02
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app02
  template:
    metadata:
      labels:
        app: app02
    spec:
      containers:
      - name: bert-container
        image: swr.cn-north-4.myhuaweicloud.com/container-solution/bert-intent-detection:v1 
        ports: 
        - containerPort: 80
        resources:
          limits:
            volcano.sh/gpu-mem.128Mi: '32'
            volcano.sh/gpu-core.percentage: '20'
          requests:
            volcano.sh/gpu-mem.128Mi: '32'
            volcano.sh/gpu-core.percentage: '20'
      schedulerName: volcano

volcano.sh/gpu-mem.128Mi: '32': 視訊記憶體申請量等於 128Mi x 32=4096Mi=4Gi

volcano.sh/gpu-core.percentage: '20' : 算力申請量等於整卡算力的20%
表示當前負載最多隻能使用4Gi的視訊記憶體,算力上限為20%。

檢視Pod資訊,yaml檔案自動生成3條註解,標註了負載使用了4Gi視訊記憶體,算力可使用整卡算力的20%

image.png

容器內執行nvidia-smi 命令檢視顯示卡驅動資訊也可發現視訊記憶體為4Gi

前往宿主機檢視GPU資源使用狀況

節點上/proc/xgpu/container 目錄下檢視相關容器的xGPU的配額,發現可用視訊記憶體為4Gi,可用算力為20%

image.png

3.3.3 xGPU相容GPU共享模式

如果您在叢集中已使用nvidia.com/gpu資源的工作負載,可在gpu-device-plugin外掛配置中選擇“虛擬化節點相容GPU共享模式”選項,即可相容Kubernetes預設GPU排程能力。

開啟該相容能力後,使用nvidia.com/gpu配額時等價於開啟虛擬化GPU視訊記憶體隔離,可以和視訊記憶體隔離模式的工作負載共用一張GPU卡,但不支援和算顯隔離模式負載共用一張GPU卡。

建立工作負載app03,yaml如下,使用整卡排程

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app03
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app03
  template:
    metadata:
      labels:
        app: app03
    spec:
      containers:
      - name: bert-container
        image: swr.cn-north-4.myhuaweicloud.com/container-solution/bert-intent-detection:v1 
        ports: 
        - containerPort: 80
        resources:
          limits:
            nvidia.com/gpu: 1
          requests:
            nvidia.com/gpu: 1
      schedulerName: volcano

檢視Pod資訊,yaml檔案中自動生成2條註解,算力可使用整卡百分之100的算力

image.png

容器內執行 nvidia-smi命令檢視顯示卡驅動資訊

可以發現當我們申請1張GPU整卡時,容器裡的視訊記憶體上限為整卡的視訊記憶體配額

image.png

節點上檢視/proc/xgpu/container/ 目錄下為空,容器使用到整卡的視訊記憶體和算力資源

image.png

建立工作負載app04, yaml如下,使用分卡共享排程
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app04
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app04
  template:
    metadata:
      labels:
        app: app04
    spec:
      containers:
      - name: bert-container
        image: swr.cn-north-4.myhuaweicloud.com/container-solution/bert-intent-detection:v1 
        ports: 
        - containerPort: 80
        resources:
          limits:
            nvidia.com/gpu: 0.4
          requests:
            nvidia.com/gpu: 0.4
      schedulerName: volcano

注意:相容Kubernetes預設GPU排程模式時,如使用nvidia.com/gpu: 0.1引數,最終計算後 ,指定的視訊記憶體值如非128MiB的整數倍時會向下取整,例如:GPU節點上的視訊記憶體總量為24258MiB,而24258MiB * 0.1 = 2425.8MiB,此時會向下取整至128MiB的18倍,即18 * 128MiB=2304MiB

檢視Pod資訊,yaml檔案自動轉換成視訊記憶體隔離,算力不隔離

image.png

容器內執行 nvidia-smi 命令檢視容器中使用的顯示卡資訊

可以發現容器中視訊記憶體配額為整卡百分之40視訊記憶體資源

image.png

前往節點 /proc/xgpu/container 目錄檢視分配的xGPU的資訊

可以發現對應的容器限制效果為:視訊記憶體隔離生效算力不進行隔離

image.png

3.3.4 單pod中多個容器(視訊記憶體隔離)

建立工作負載app05,yaml如下:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app05
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app05
  template:
    metadata:
      labels:
        app: app05
    spec:
      containers:
      - name: bert-container
        image: swr.cn-north-4.myhuaweicloud.com/container-solution/bert-intent-detection:v1 
        ports: 
        - containerPort: 80
        resources:
          limits:
            volcano.sh/gpu-mem.128Mi: '16'
          requests:
            volcano.sh/gpu-mem.128Mi: '16'
      - name: bert-container2
        image: swr.cn-north-4.myhuaweicloud.com/container-solution/bert-intent-detection:v1 
        command:
        - /bin/bash
        args:
        - '-c'
        - while true; do echo hello; sleep 10;done
        ports: 
        - containerPort: 81
        resources:
          limits:
            volcano.sh/gpu-mem.128Mi: '16'
          requests:
            volcano.sh/gpu-mem.128Mi: '16'
      schedulerName: volcano

檢視Pod資訊,yaml檔案註解中會有兩個容器的資源使用2Gi+2Gi、

image.png

容器中執行nvidia-smi命令,檢視容器中視訊記憶體分配資訊

兩個容器中各自都看到有2Gi視訊記憶體的資源

image.png

image.png

節點檢視 /proc/xgpu/congtainer目錄下生成兩個容器檔案,視訊記憶體隔離都為2Gi,算力都沒有做限制

image.png

3.4 GPU監控相關指標

檢視監控指標需要安裝kube-prometheus-stack外掛的server模式

image.png

xGPU核心監控指標

xgpu_memory_total:容器GPU虛擬化視訊記憶體總量,該指標為container級別

image.png

xgpu_memory_used:容器使用GPU虛擬化視訊記憶體使用量,該指標為container級別

image.png

xgpu_core_percentage_total:容器GPU虛擬化算力總量,該指標為container級別,20代表可以使用整卡算力的20%,該指標為container級別

image.png

xgpu_core_percentage_used:容器GPU虛擬化算力使用量,該指標為container級別,目前使用量為0

image.png

gpu_schedule_policy:GPU虛擬化分三種模式(0:視訊記憶體隔離算力共享模式、1:視訊記憶體算力隔離模式、2:預設模式,表示當前卡還沒被用於GPU虛擬化裝置分配),該指標為節點級別

image.png

多卡場景,gpu_index欄位為gpu物理卡的編號

image.png

xgpu_device_health:GPU虛擬化裝置的健康情況,0:表示GPU虛擬化裝置為健康狀態;1:表示GPU虛擬化裝置為非健康狀態。該指標為container級別

image.png

其他監控指標請參考:https://support.huaweicloud.com/usermanual-cce/cce_10_0741.html

3.5 升級GPU驅動版本

Nvidia driver驅動程式定期會發布新版本,如果負載需要使用新版本驅動,可以透過CCE AI套件的能力進行驅動版本的更新

1.編輯gpu外掛 點選使用獲取535.54.03版本的驅動下載連結

image.png

https://hgcs-drivers-cn-north-4.obs.cn-north-4.myhuaweicloud.com/release/driver/tesla/NVIDIA-Linux-x86_64-535.54.03.run

2.更改gpu001節點池的下載驅動連結為535.54.03版本

image.png

3.外掛升級完成後必須手動重啟gpu節點才能生效

注意:重啟節點會造成該節點上業務中斷,需要提前將該節點設定禁止排程,然後擴容該節點上關鍵業務,再進行驅逐處理,最後重啟節點,恢復排程。

image.png

image.png

節點重啟中

image.png

節點驅動升級完成

image.png

驗證:gpu驅動升級成功到535.54.03版本

image.png

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

相關文章