通过ack-co-scheduler使用共享GPU调度

共享GPU调度作为一种资源管理策略,允许多个任务或进程共享同一GPU。您可以在注册集群中使用共享GPU调度,帮您解决传统GPU调度的资源浪费问题,从而提升GPU利用率。

前提条件

计费说明

共享GPU调度目前已实行收费。在使用共享GPU调度前,需开通云原生AI套件。具体收费信息,请参见云原生AI套件计费说明。关于云原生AI套件的更多信息,请参见云原生AI套件概述

使用限制

  • 请勿将共享GPU调度的节点的CpuPolicy设置为static

  • 共享GPU的DaemonSet的Pod在节点上的优先级不是最高的,所以节点资源有可能被其他优先级高的Pod抢占而导致被驱逐。如果想避免这个问题,可以对您实际使用的DaemonSet(如共享GPU显存的gpushare-device-plugin-ds)进行修改,加上priorityClassName: system-node-critical来保证其优先级。

步骤一:安装组件

  1. 在注册集群中安装ack-ai-installer组件。该组件可以提供共享GPU调度(包括共享隔离能力)、GPU拓扑感知调度等调度能力。

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

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

    3. Helm页面,单击创建。搜索并安装ack-ai-installer组件。

  2. 在注册集群中安装ack-co-scheduler组件。通过该组件,您可以自定义ResourcePolicy CR对象,使用多级弹性调度功能。

    1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

    2. 组件管理页面,搜索ack-co-scheduler组件,在卡片右下方单击安装

步骤二:安装和使用GPU资源查询工具

  1. 下载kubectl-inspect-cgpu。

    • 如果您使用的是Linux系统,您可以通过以下命令下载kubectl-inspect-cgpu。

      wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-linux -O /usr/local/bin/kubectl-inspect-cgpu
    • 如果您使用的是macOS系统,您可以通过以下命令下载kubectl-inspect-cgpu。

      wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-darwin -O /usr/local/bin/kubectl-inspect-cgpu
  2. 执行以下命令,为kubectl-inspect-cgpu添加执行权限。

    chmod +x /usr/local/bin/kubectl-inspect-cgpu

步骤三:创建GPU节点

创建GPU云服务器,并安装驱动和nvidia-container-runtime。具体操作,请参见创建节点池

说明
  • 如果您添加节点池时已经创建GPU节点并配置好环境,可以跳过此步骤。

  • 如果您没有安装驱动的脚本,请参见手动升级GPU节点驱动

  • 使用共享GPU调度的节点需要有标签ack.node.gpu.schedule=share,您可以手动为云下节点打上该标签。对于云上节点,您可以使用节点池的节点标签功能将标签的值升级为ack.node.gpu.schedule=cgpu直接开启显存隔离能力。具体操作,请参见GPU节点调度属性标签说明

步骤四:使用共享GPU调度

  1. 执行以下命令,查看集群GPU使用情况。

    kubectl inspect cgpu

    预期输出:

    NAME                           IPADDRESS       GPU0(Allocated/Total)  GPU Memory(GiB)
    cn-zhangjiakou.192.168.66.139  192.168.66.139  0/15                   0/15
    ---------------------------------------------------------------------------
    Allocated/Total GPU Memory In Cluster:
    0/15 (0%)
  2. 使用以下内容,创建GPUtest.yaml。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: gpu-share-sample
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: gpu-share-sample
        spec:
          schedulerName: ack-co-scheduler
          containers:
          - name: gpu-share-sample
            image: registry.cn-hangzhou.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5
            command:
            - python
            - tensorflow-sample-code/tfjob/docker/mnist/main.py
            - --max_steps=100000
            - --data_dir=tensorflow-sample-code/data
            resources:
              limits:
                # 单位为GiB,该Pod总共申请了3 GiB显存。
                aliyun.com/gpu-mem: 3 # 设置GPU显存大小。
            workingDir: /root
          restartPolicy: Never
  3. 执行以下命令,部署一个GPU示例应用,该应用申请3GiB显存。

    kubectl apply -f GPUtest.yaml
  4. 执行以下命令,查看集群GPU显存使用情况。

    kubectl inspect cgpu

    预期输出:

    NAME                           IPADDRESS       GPU0(Allocated/Total)  GPU Memory(GiB)
    cn-zhangjiakou.192.168.66.139  192.168.66.139  3/15                   3/15
    ---------------------------------------------------------------------------
    Allocated/Total GPU Memory In Cluster:
    3/15 (20%)             

    预期输出表明,节点cn-zhangjiakou.192.168.66.139共有15 GiB显存,已分配3 GiB显存。

相关文档

更多关于共享GPU调度的信息,请参见共享GPU调度概述