本文分享自华为云社区《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/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显存

容器内使用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/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%

容器内执行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/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的算力

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

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

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

 

创建工作负载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文件自动转换成显存隔离,算力不隔离

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

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

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

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

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、

容器中执行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版本

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

实例演示如何使用CCE XGPU虚拟化的更多相关文章

  1. SSO之CAS单点登录实例演示

    本文目录: 一.概述 二.演示环境 三.JDK安装配置 四.安全证书配置 五.部署CAS-Server相关的Tomcat 六.部署CAS-Client相关的Tomcat 七. 测试验证SSO 一.概述 ...

  2. Thrift入门及Java实例演示<转载备用>

    Thrift入门及Java实例演示 作者: Michael 日期: 年 月 日 •概述 •下载配置 •基本概念 .数据类型 .服务端编码基本步骤 .客户端编码基本步骤 .数据传输协议 •实例演示(ja ...

  3. 原生JS编写的照片墙效果实例演示特效

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-Web

    实例演示使用RDIFramework.NET 框架的工作流组件 进行业务流程的定义—请假申请流程-Web 参考文章: RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系 ...

  5. 审核流(3)低调奢华,简单不凡,实例演示-SNF.WorkFlow--SNF快速开发平台3.1

    下面我们就从什么都没有,结合审核流进行演示实例.从无到有如何快速完美的实现,然而如此简单.低调而奢华,简单而不凡. 从只有数据表通过SNF.CodeGenerator代码生成器快速生成单据并与审核流进 ...

  6. Thrift入门及Java实例演示

    目录: 概述 下载配置 基本概念 数据类型 服务端编码基本步骤 客户端编码基本步骤 数据传输协议 实例演示(java) thrift生成代码 实现接口Iface TSimpleServer服务模型 T ...

  7. Apache Thrift学习之一(入门及Java实例演示)

    目录: 概述 下载配置 基本概念 数据类型 服务端编码基本步骤 客户端编码基本步骤 数据传输协议 实例演示(java) thrift生成代码 实现接口Iface TSimpleServer服务模型 T ...

  8. jquery.validate.js实例演示

    validate是前端重要的交互手段,提升性能的同时更能提升用户操作体验,validate的实现大概有三种方式:HTML5部分支 持,validate验证框架,手动写js或ajax调用接口.使用val ...

  9. jquery仿alert提示框、confirm确认对话框、prompt带输入的提示框插件[附实例演示]

    jquery仿alert提示框.confirm确认对话框.prompt带输入的提示框插件实例演示 第一步:引入所需要的jquery插件文件: http://www.angelweb.cn/Inc/eg ...

  10. jmeter实例演示

    Jmeter 是比较轻便的性能测试工具,下面根据一个实例演示下jmeter的常见用法 一.前期准备,在使用之前,先分析测试需求,比如:需不要登录?需不需要监视服务器性能?多线程还是多循环?需不需根据流 ...

随机推荐

  1. 【Android逆向】apk 反编译

    1. Kali搭建apktool环境 1. 访问apktool 官网https://ibotpeaches.github.io/Apktool/install/ 参考红圈里的步骤处理即可 2. 执行命 ...

  2. 【Azure Spring Cloud】部署Azure spring cloud 失败

    问题描述 使用Azure CLI指令部署Azure Spring Cloud项目失败,错误消息提示没有安装"azure.storage.blob"模块 问题分析 根据错误提示,是p ...

  3. 【Azure 事件中心】开启 Apache Flink 制造者 Producer 示例代码中的日志输出 (连接 Azure Event Hub Kafka 终结点)

    问题描述 Azure Event Hub 在标准版以上就默认启用的Kafka终结点,所以可以通过Apache Kafka协议连接到Event Hub进行消息的生产和消费.通过示例代码下载到本地运行后, ...

  4. 【Azure 应用服务】App Service 通过门户配置数据库连接字符串不生效 

    应用设置 Application Setting 在应用服务中,应用设置是作为环境变量传递给应用程序代码的变量. 对于 Linux 应用和自定义容器,应用服务使用 --env 标志将应用设置传递到容器 ...

  5. [Linux ] 编译 ffmpeg 使用 AV1 编码 svt_av1 编码器

    编译带 AV1 编码器的 ffmpeg 安装 aom git clone --depth 1 https://aomedia.googlesource.com/aom mk build cmake - ...

  6. Jmeter 响应断言你知道多少?

    1 断言各组件介绍 Apply to:同上 测试字段: * 响应文本:响应体 * 响应代码:响应状态码 * 响应信息:状态码的消息 * 响应头:顾名思义就是响应头 * 请求头:顾名思义就是请求头 * ...

  7. Java 小案例+super使用

    1 package com.bytezero.supertest3; 2 3 /** 4 * 5 * @Description AccountTest类 6 * @author Bytezero·zh ...

  8. JS2-DOM

    API和Web API API 应用程序编程接口,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,且又无需访问源码,或理解内部工作机制的细节 API是给程序员提供的一种工具,以便能 ...

  9. tomcat SSL安全连接配置简介

    tomcat中使用https提供服务,配置的方式有两种.生成或购买CA证书时会要求绑定域名.设置密码和证书别名(aliase). tomcat可用的证书列表里用三个文件: 方式一: <Conne ...

  10. 基于英特尔® Gaudi® 2 AI 加速器的文本生成流水线

    随着生成式人工智能 (Generative AI,GenAI) 革命的全面推进,使用 Llama 2 等开源 transformer 模型生成文本已成为新风尚.人工智能爱好者及开发人员正在寻求利用此类 ...