通过共享GPU调度实现算力分配

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

前提条件

  • 已创建ACK集群Pro版,且集群版本为v1.20及以上。具体步骤,请参见创建ACK托管集群。对于不同ACK版本的集群,调度器版本需满足以下要求。关于调度器各版本支持的功能,请参见kube-scheduler

    ACK集群版本

    调度器版本

    1.28

    v1.28.1-aliyun-5.6-998282b9及以上

    1.26

    v1.26.3-aliyun-4.1-a520c096及以上

    1.24

    v1.24.3-ack-2.0及以上

    1.22

    v1.22.15-ack-2.0及以上

    1.20

    v1.20.4-ack-8.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

    华北3(张家口)

    cn-zhangjiakou

    华南1(深圳)

    cn-shenzhen

    西南1(成都)

    cn-chengdu

    华南2(河源)

    cn-heyuan

    中国香港

    cn-hongkong

    印度尼西亚(雅加达)

    ap-southeast-5

    新加坡

    ap-southeast-1

    泰国(曼谷)

    ap-southeast-7

    美国(弗吉尼亚)

    us-east-1

    美国(硅谷)

    us-west-1

    日本(东京)

    ap-northeast-1

    华东2 金融云

    cn-shanghai-finance-1

  • 共享GPU调度支持算力分配的调度器于2022年03月01日上线,在此之后创建的集群将使用新版本调度器,但是在此之前已有集群的调度器不会自动升级到新版本,需要您手动进行操作。若您的集群创建时间早于2022年03月01日,请按照如下操作进行处理:

    1. 提交工单申请新版共享GPU调度内测。

    2. 卸载旧版共享GPU组件。

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

      1. 登录容器服务管理控制台,在左侧导航栏选择集群

      2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm

      3. Helm页面,单击ack-ai-installer右侧操作列下方的删除,然后在弹出的删除应用对话框,单击确定

    3. 安装新版共享GPU组件。具体操作,请参见安装共享GPU调度组件

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

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 节点池页面右侧,单击创建节点池

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

    配置项

    说明

    节点池名称

    设置节点池名称。本文配置为gpu-core

    期望节点数

    设置节点池初始节点数量。若您不需要创建节点,请填写为0

    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显存和算力的任务。

    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:benchmark-tensorflow-2.2.3
            command:
            - bash
            - run.sh
            - --num_batches=500000000
            - --batch_size=8
            resources:
              limits:
                # 单位为GiB,该Pod总共申请了2 GiB显存。
                aliyun.com/gpu-mem: 2
                #申请一张GPU卡的30%算力。
                aliyun.com/gpu-core.percentage: 30
            workingDir: /root
          restartPolicy: Never
  2. 执行以下命令,部署cuda-sample.yaml文件提交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

    预期输出表明,STATUSRunning,即任务部署成功。

  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