写点什么

实例演示如何使用 CCE XGPU 虚拟化

  • 2024-04-01
    广东
  • 本文字数:4770 字

    阅读完需:约 16 分钟

实例演示如何使用CCE XGPU虚拟化

本文分享自华为云社区《CCE XGPU虚拟化的使用》,作者: 可以交个朋友。

一 背景


在互联网场景中,用户的 AI 训练和推理任务对 GPU 虚拟化有着强烈的诉求。GPU 卡作为重要的计算资源不管是在算法训练还是预测上都不可或缺,而对于常见的算法训练业务或智能业务都有往容器迁移演进的趋势,所以如何更好的利用 GPU 资源成了容器云平台需要解决的问题。云厂商如果提供 GPU 虚拟化可以为用户带来的如下收益:


  • 提高资源利用率(GPU/显存)。GPU 共享后,总利用率接近运行任务利用率之和,减少了资源浪费。

  • 提高服务质量(QoS),增强公平性。多个任务既可以同时开始享受资源,也可以单独保证某一个任务的运行。

  • 减少任务排队时间和总任务的消耗时间。假设两个任务结束时间分别是 x,y,通过 GPU 共享,两个任务全部结束的时间小于 x+y。

  • 集群中可以运行更多任务,通过分时复用,减少抢占。


二 CCE 平台上 GPU 虚拟化的优势


CCE GPU 虚拟化采用自研 xGPU 虚拟化技术,能够动态对 GPU 设备显存与算力进行划分,单个 GPU 卡最多虚拟化成 20 个 GPU 虚拟设备。相对于静态分配来说,虚拟化的方案更加灵活,最大程度保证业务稳定的前提下,可以完全由用户自己定义使用的 GPU 量,


  • 灵活:精细配置 GPU 算力占比及显存大小,算力分配粒度为 5%GPU,显存分配粒度达 MB 级别。

  • 隔离:支持显存和算力的严格隔离,支持单显存隔离,算力与显存同时隔离两类场景。

  • 兼容:业务无需重新编译,无需进行 CUDA 库替换,对业务无感。

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


建议用户在使用 GPU 资源时,提前创建好对应规格型号的 GPU 节点资源池,方便后期管理和调度。


3.1 安装插件


GPU 的使用需要借助 CCE 插件能力实现,前往 CCE 插件市场进行插件的安装。


安装 Volcano 调度器插件



插件安装完成后,可前往配置中心-调度设置,设置默认调度器为 Volcano,如果不设置需要在负载 yaml 中指定调度器spec.schedulerName: volcano



安装 GPU 插件(CCE AI 套件)


插件中心安装 GPU 插件,CCE 平台已经提供多个版本的驱动,在列出的驱动列表中选择使用即可,支持不同节点池选择不同驱动版本。也支持自行配置其它版本的驱动,需要自行提供驱动下载链接。


3.2 创建负载任务调用 xGPU 资源


根据 xGPU 支持虚拟化维度进行操作实践注意: 未开启volcano作为全局调度器时,需要在yaml指定调度器为volcano

3.2.1 xGPU 模式之显存隔离如何使用


创建负载 app01.yaml


apiVersion: apps/v1kind: Deploymentmetadata:  name: app01spec:  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 显存



容器内使用 nvidia-smi 查看显存,表现最大显存为 2Gi,显存隔离生效



xGPU 显存隔离能力通过在 HCE2.0 上实现,在节点上查看/proc/xgpu 目录,0 表示使用的物理 gpu 显卡的序列号(如果是多个卡则有多个目录,文件名从 0 开始,各个文件对应相关下标的 GPU 卡),container 目录下存放使用 gpu 虚拟化的 容器信息。



查看容器 ID 对应命令,查看 meminfo 和 quota 文件,可以看到 HCE2.0 控制给容器 GPU 卡显存和算力的上限配置。



meminfo :容器分配显存为 2Gi,


quota:容器分配的算力,0 代表不限制算力可以使用到整卡的算力


路径中xgpu3: 代表虚拟 gpu 卡的卡号 每创建一个新的容器都会按次序生成一个新的虚拟 gpu 卡号

3.3.2 单节点多张 gpu 卡场景分析


购买多 gpu 卡机型



虚拟化模式下不支持单 pod 申请超过一张卡的 gpu 资源,如单 pod 需要使用多卡资源请关闭 gpu 虚拟化;同时多卡调度,也不支持 1.x,2.x 形式,需要为大于 1 的整数



节点上能看到两张 gpu 物理卡编号



看到容器资源显存隔离生效,xGPU1 是从 0 号 gpu 卡上软件连接过来的


3.2.3 xGPU 模式之显存算力均隔离如何使用


创建负载 app02,yaml 如下


apiVersion: apps/v1kind: Deploymentmetadata:  name: app02spec:  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%



容器内执行nvidia-smi 命令查看显卡驱动信息也可发现显存为 4Gi


前往宿主机查看 GPU 资源使用状况


节点上/proc/xgpu/container 目录下查看相关容器的 xGPU 的配额,发现可用显存为 4Gi,可用算力为 20%

3.3.3 xGPU 兼容 GPU 共享模式


如果您在集群中已使用nvidia.com/gpu资源的工作负载,可在 gpu-device-plugin 插件配置中选择“虚拟化节点兼容 GPU 共享模式”选项,即可兼容 Kubernetes 默认 GPU 调度能力。


开启该兼容能力后,使用nvidia.com/gpu配额时等价于开启虚拟化 GPU 显存隔离,可以和显存隔离模式的工作负载共用一张 GPU 卡,但不支持和算显隔离模式负载共用一张 GPU 卡。


创建工作负载 app03,yaml 如下,使用整卡调度


apiVersion: apps/v1kind: Deploymentmetadata:  name: app03spec:  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 的算力



容器内执行 nvidia-smi命令查看显卡驱动信息


可以发现当我们申请 1 张 GPU 整卡时,容器里的显存上限为整卡的显存配额



节点上查看/proc/xgpu/container/ 目录下为空,容器使用到整卡的显存和算力资源



创建工作负载 app04, yaml 如下,使用分卡共享调度


apiVersion: apps/v1kind: Deploymentmetadata:  name: app04spec:  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 文件自动转换成显存隔离,算力不隔离



容器内执行 nvidia-smi 命令查看容器中使用的显卡信息


可以发现容器中显存配额为整卡百分之 40 显存资源



前往节点 /proc/xgpu/container 目录查看分配的 xGPU 的信息


可以发现对应的容器限制效果为:显存隔离生效算力不进行隔离


3.3.4 单 pod 中多个容器(显存隔离)


创建工作负载 app05,yaml 如下:


apiVersion: apps/v1kind: Deploymentmetadata:  name: app05spec:  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、



容器中执行nvidia-smi命令,查看容器中显存分配信息


两个容器中各自都看到有 2Gi 显存的资源




节点查看 /proc/xgpu/congtainer目录下生成两个容器文件,显存隔离都为 2Gi,算力都没有做限制


3.4 GPU 监控相关指标


查看监控指标需要安装 kube-prometheus-stack 插件的 server 模式



xGPU 核心监控指标


xgpu_memory_total:容器 GPU 虚拟化显存总量,该指标为 container 级别



xgpu_memory_used:容器使用 GPU 虚拟化显存使用量,该指标为 container 级别



xgpu_core_percentage_total:容器 GPU 虚拟化算力总量,该指标为 container 级别,20 代表可以使用整卡算力的 20%,该指标为 container 级别



xgpu_core_percentage_used:容器 GPU 虚拟化算力使用量,该指标为 container 级别,目前使用量为 0



gpu_schedule_policy:GPU 虚拟化分三种模式(0:显存隔离算力共享模式、1:显存算力隔离模式、2:默认模式,表示当前卡还没被用于 GPU 虚拟化设备分配),该指标为节点级别



多卡场景,gpu_index 字段为 gpu 物理卡的编号



xgpu_device_health:GPU 虚拟化设备的健康情况,0:表示 GPU 虚拟化设备为健康状态;1:表示 GPU 虚拟化设备为非健康状态。该指标为 container 级别



其他监控指标请参考:https://support.huaweicloud.com/usermanual-cce/cce_10_0741.html

3.5 升级 GPU 驱动版本


Nvidia driver 驱动程序定期会发布新版本,如果负载需要使用新版本驱动,可以通过 CCE AI 套件的能力进行驱动版本的更新


1.编辑 gpu 插件 点击使用获取 535.54.03 版本的驱动下载链接



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 版本



3.插件升级完成后必须手动重启 gpu 节点才能生效


注意:重启节点会造成该节点上业务中断,需要提前将该节点设置禁止调度,然后扩容该节点上关键业务,再进行驱逐处理,最后重启节点,恢复调度。




节点重启中



节点驱动升级完成



验证:gpu 驱动升级成功到 535.54.03 版本



点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
实例演示如何使用CCE XGPU虚拟化_开发_华为云开发者联盟_InfoQ写作社区