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

本文分享自華爲雲社區《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

 

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

 

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