配置共享GPU调度节点选卡策略

默认情况,Pod分配GPU资源的顺序为先分配完节点上的一张GPU卡,再分配其他GPU卡,避免出现GPU资源碎片。但是在有的场景中,您希望让Pod调度到节点上时,尽量分散到各个GPU卡上,避免因为某张GPU卡坏掉影响的业务过多。本文介绍如何配置共享GPU调度节点选卡策略。

前提条件

策略介绍

在共享GPU调度中,如果节点存在多张GPU卡,从节点中挑选GPU卡分配给Pod时,有两种策略可以考虑:

  • Binpack:默认策略,调度系统先分配完节点的一张GPU卡后,再分配节点上另一张GPU卡,避免节点出现GPU资源碎片。

  • Spread:调度系统会尽量将Pod分散到这个节点的各个GPU上,避免一张GPU卡坏掉后,影响的业务过多。

以下示例表示,某个节点有2张GPU卡,每张卡有15 GiB显存,Pod1申请2 GiB显存,Pod2申请3 GiB显存。

image

步骤一:创建节点池

默认情况下,节点的选卡策略是Binpack。如果要使用Spread策略,请按照如下操作设置。

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

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

  1. 节点池页面,单击右上角的创建节点池

  2. 创建节点池页面,设置创建节点池的配置项,然后单击确认配置。下表仅介绍主要配置项,其余配置项请参见创建节点池

    配置项

    说明

    实例规格

    架构选择GPU云服务器,选择多个GPU实例规格。

    由于只有在节点有多张GPU卡的情况下,节点选卡策略才能看出效果,建议选择带有多张GPU卡机型。

    期望节点数

    设置节点池初始节点数量。如无需创建节点,可以填写为0。

    节点标签

    单击1.jpg,添加两条记录:

    • ack.node.gpu.schedulecgpu。表示开启GPU共享调度能力,同时开启GPU显存隔离能力。

    • ack.node.gpu.placementspread。表示开启节点Spread选卡策略。

步骤二:提交任务

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

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 任务

  3. 单击页面右上角的使用YAML创建资源,将如下代码拷贝至模板区域,然后按照注释编辑YAML内容。编辑完成后,单击页面下方的创建

    展开查看YAML详细信息

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: tensorflow-mnist-spread
    spec:
      parallelism: 3
      template:
        metadata:
          labels:
            app: tensorflow-mnist-spread
        spec:
          nodeSelector:
             kubernetes.io/hostname: <NODE_NAME> # 指定<NODE_NAME>为集群中某个GPU节点名称,便于观察效果,例如:cn-shanghai.192.0.2.109。
          containers:
          - name: tensorflow-mnist-spread
            image: registry.cn-beijing.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:
                aliyun.com/gpu-mem: 4 # 总共申请4 GiB显存。
            workingDir: /root
          restartPolicy: Never

    YAML文件说明如下:

    • 该YAML定义了一个使用tensorflow mnist样例的Job。Job有3个Pod,每个Pod申请4 GiB显存。

    • Pod申请4 GiB显存通过在Pod resources.limits定义aliyun.com/gpu-mem: 4实现

    • 为了在一个节点上看到效果,YAML为Pod添加了一个NodeSelector kubernetes.io/hostname: <NODE_NAME>,用于将Pod调度到指定节点上。

步骤三:验证节点选卡策略是否为Spread

使用共享GPU调度GPU资源查询工具,查询节点GPU资源分配情况:

kubectl inspect cgpu

NAME                   IPADDRESS      GPU0(Allocated/Total)  GPU1(Allocated/Total)  GPU2(Allocated/Total)  GPU3(Allocated/Total)  GPU Memory(GiB)
cn-shanghai.192.0.2.109  192.0.2.109  4/15                   4/15                   0/15                   4/15                   12/60
--------------------------------------------------------------------------------------
Allocated/Total GPU Memory In Cluster:
12/60 (20%)

输出结果表明,3个Pod分别调度到节点的不同GPU卡上,Spread策略生效。