ACK Pro集群支持为应用申请GPU显存和算力,能够帮助您更精细化的使用GPU的显存和算力资源。本文介绍如何使用算力分配功能。

前提条件

  • 已创建ACK Pro版集群,且集群版本为1.20.11。具体操作步骤,请参见创建Kubernetes托管版集群
  • 对于不同ACK版本的集群,调度器版本需要满足以下要求。关于调度器各版本支持的功能,请参见kube-scheduler
    ACK版本调度器版本
    1.20v1.20.4-ack-8.0及以上
    1.22v1.22.15-ack-2.0及以上
    1.24v1.24.3-ack-2.0及以上
  • 已安装共享GPU组件,且Chart版本为1.2.0以上。关于安装共享GPU组件的具体操作,请参见安装并使用共享GPU组件和资源工具
  • cGPU版本为1.0.5及以上。关于cGPU的升级操作,请参见升级节点cGPU版本

使用限制

  • 共享GPU调度目前支持仅申请显存同时申请显存和算力两种任务,这两种任务不能同时存在于一个节点上,即一个节点只运行仅申请显存的任务,或者只运行同时申请显存和算力的任务。
  • 为任务申请算力时,有如下限制:
    • 每一张GPU提供的算力按100计量,代表这张卡的100%算力,例如申请20代表使用GPU卡的20%算力。
    • 申请的算力值应为5的倍数,最小为5。如果不为5的倍数,任务将提交失败。
  • 目前只有以下地域支持GPU显存算力分配功能。如果您需要使用该功能,请确保集群所在地域在此范围内。
    地域地域ID
    华北2(北京)cn-beijing
    华东2(上海)cn-shanghai
    华东1(杭州)cn-hangzhou
    华北(张家口)cn-zhangjiakou
    华南1(深圳)cn-shenzhen
    西南1(成都)cn-chengdu
    华南2(河源)cn-heyuan
    中国(香港)cn-hongkong
    印度尼西亚(雅加达)ap-southeast-5
    新加坡ap-southeast-1
    美国(弗吉尼亚)us-east-1
    美国(硅谷)us-west-1
    日本(东京)ap-northeast-1
  • 共享GPU调度支持算力分配的调度器于2022年3月1日上线,在此之后创建的集群将使用新版本调度器,但是在此之前已有集群的调度器不会自动升级到新版本,需要您手动进行操作。若您的集群创建时间早于2022年3月1日,请按照如下操作进行处理:
    1. 提交工单申请新版共享GPU调度内测。
    2. 卸载旧版共享GPU组件。

      如果已安装旧版共享GPU组件(仅支持显存共享,Chart版本≤1.2.0),请按照以下步骤进行处理。

      1. 登录容器服务管理控制台
      2. 在控制台左侧导航栏中,单击集群
      3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
      4. 在集群管理页左侧导航栏中,选择应用 > Helm
      5. Helm页面,单击ack-ai-installer右侧操作列下方的删除
      6. 在弹出的删除应用对话框,单击确定
    3. 安装新版共享GPU组件。具体操作,请参见安装并使用共享GPU组件和资源工具

步骤一:创建支持算力分配的节点池

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,选择节点管理 > 节点池
  5. 节点池页面右侧,单击创建节点池

    部分参数配置说明如下,关于配置项的详细说明,请参见节点池配置

    配置项说明
    节点池名称设置节点池名称。本文配置为gpu-core
    期望节点数设置节点池初始节点数量。若您不需要创建节点,请填写为0
    操作系统操作系统仅支持CentOS 7.x和Alibaba Cloud Linux 2.x。
    ECS标签为ECS实例添加标签。
    自定义资源组指定节点池所扩容节点的资源组信息。
    节点标签为集群节点添加标签。本文配置如下,关于节点标签的更多信息,请参见ACK调度GPU使用的节点标签说明
    • 开启节点GPU显存和算力隔离能力:单击添加节点标签,输入第一个节点标签的ack.node.gpu.schedulecore_mem
    • 在节点上使用Binpack算法为Pod选择GPU卡:单击添加节点标签,输入第二个节点标签的ack.node.gpu.placementbinpack
    重要 如果您需要将集群中已存在的GPU节点切换为算力隔离模式,请先将该节点从集群中移除,然后重新加入支持算力隔离的节点池。不支持直接使用kubectl label nodes <NODE_NAME> ack.node.gpu.schedule=core_mem命令将该GPU节点切换为算力隔离模式。

步骤二:查看节点池是否开启算力分配功能

执行以下命令,查看节点池的节点是否开启算力分配功能。
kubectl get nodes <NODE_NAME> -o yaml

预期输出:

#省略其他字段。
status:
  #省略其他字段。
  allocatable:
    #节点共有400%的算力,4张GPU卡,每张卡提供100%算力。
    aliyun.com/gpu-core.percentage: "400"
    aliyun.com/gpu-count: "4"
    #节点共有60 GiB显存,4张GPU卡,每张卡提供15 GiB显存。
    aliyun.com/gpu-mem: "60"
  capacity:
    aliyun.com/gpu-core.percentage: "400"
    aliyun.com/gpu-count: "4"
    aliyun.com/gpu-mem: "60"

由预期输出得到,存在aliyun.com/gpu-core.percentage字段表示算力分配功能已开启。

步骤三:使用算力分配功能

未使用算力分配功能前,一张GPU卡的总显存为15 GiB,Pod可以100%使用该GPU卡的算力。本文以同时申请显存和算力任务为例,申请2 GiB显存、一张GPU卡的30%算力,介绍如何使用GPU显存算力分配功能。

  1. 使用以下YAML内容,创建申请GPU显存和算力的任务。
    cat > /tmp/cuda-sample.yaml <<-EOF
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: cuda-sample
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: cuda-sample
        spec:
          containers:
          - name: cuda-sample
            image:  registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:cuda-sample-11.0.3
            command:
            - bandwidthTest
            resources:
              limits:
                #申请2 GiB显存。
                aliyun.com/gpu-mem: 2
                #申请一张GPU卡的30%算力。
                aliyun.com/gpu-core.percentage: 30
            workingDir: /root
          restartPolicy: Never
    EOF
  2. 执行以下命令,提交cuda-sample任务。
    kubectl apply -f /tmp/cuda-sample.yaml
    说明 任务所使用的镜像较大,拉取镜像需要一定的时间,请您耐心等待。
  3. 执行以下命令,查看cuda-sample任务的运行状态。
    kubectl get po -l app=cuda-sample

    预期输出:

    NAME                READY   STATUS    RESTARTS   AGE
    cuda-sample-m****   1/1     Running   0          15s

    由预期输出得到,STATUS Running,表示任务部署成功。

  4. 执行以下命令,查看显存和算力的使用情况。
    kubectl exec -ti cuda-sample-m**** -- nvidia-smi

    预期输出:

    Thu Dec 16 02:53:22 2021
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 450.102.04   Driver Version: 450.102.04   CUDA Version: 11.0     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  Tesla V100-SXM2...  On   | 00000000:00:08.0 Off |                    0 |
    | N/A   33C    P0    56W / 300W |    337MiB /  2154MiB |     30%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    +-----------------------------------------------------------------------------+

    由预期输出得到:

    • 显存:未开启算力分配功能前,Pod能够使用的总显存为该GPU卡的总显存,本文为15 GiB(在节点上执行nvidia-smi命令即可查询GPU卡的总显存)。开启算力分配功能后,Pod当前已使用337 MiB,能够使用的总显存为2154 MiB(约为2 GiB),说明显存隔离生效。
    • 算力:未开启算力分配功能前,Pod运行的任务能够100%使用GPU卡(您可以将申请的算力设置为100进行验证)。开启算力分配功能后,Pod已使用GPU卡的30%算力,说明算力隔离生效。
    说明 如果有n个任务,假设每个任务申请30%算力(n≤3,最多部署3个),n个任务运行在同一张GPU卡上,此时在每个Pod中执行nvidia-smi命令,可以看到算力为n*30%。nvidia-smi命令的查询结果目前仅显示以卡为单位的算力利用率,而不显示以任务为单位的算力利用率。
  5. 使用以下命令,查看Pod日志。
    kubectl logs cuda-sample-m**** -f

    预取输出:

    [CUDA Bandwidth Test] - Starting...
    Running on...
    
     Device 0: Tesla V100-SXM2-16GB
     Quick Mode
    
    time: 2021-12-16/02:50:59,count: 0,memSize: 32000000,succeed to copy data from host to gpu
    time: 2021-12-16/02:51:01,count: 1,memSize: 32000000,succeed to copy data from host to gpu
    time: 2021-12-16/02:51:02,count: 2,memSize: 32000000,succeed to copy data from host to gpu
    time: 2021-12-16/02:51:03,count: 3,memSize: 32000000,succeed to copy data from host to gpu

    由预期输出得到,使用算力分配功能后,Pod日志刷新较慢,此时算力被限制在该GPU卡的30%左右。

  6. 可选:执行以下命令,删除cuda-sample任务。

    验证完毕后,您可以对任务进行删除操作。

    kubectl delete job cuda-sample