通过共享GPU调度实现多卡共享

ACK集群Pro版支持共享GPU,共享GPU能够在Kubernetes上实现共享GPU调度和显存隔离。本文介绍如何设置共享GPU调度的多卡共享策略。

前提条件

多卡共享信息介绍

重要

目前多卡共享仅支持显存隔离且算力共享的场景,不支持显存隔离且算力分配的场景。

模型开发阶段,有可能需要使用多张GPU卡,但无需使用大量GPU资源。如果将多张GPU卡全部分配给开发平台,有可能造成资源浪费。此时,共享GPU调度的多卡共享将发挥作用。

多卡共享策略指的是某个应用申请了N个GiB的显存,并指定了这N个GiB的显存由M块GPU卡分配,每块GPU卡分配的显存为N/M(目前N/M必须为整数,并且这M张GPU卡必须在同一个Kubernetes节点上)。例如,某个应用申请了8 GiB显存,并指定了GPU卡个数为2,那么某个节点需分配2块GPU卡给该应用,每块GPU卡分配4 GiB显存。单卡共享和多卡共享的区别:

  • 单卡共享:一个Pod仅申请一张GPU卡,占用该GPU部分资源。

  • 多卡共享:一个Pod申请多张GPU卡,每张GPU提供部分资源,且每张GPU提供的资源量相同。

图片1.png

设置多卡共享策略

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

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

  3. 在页面右上角,单击使用YAML创建资源。将以下内容拷贝至模板区域,然后单击创建

    展开查看YAML详细信息

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: tensorflow-mnist-multigpu
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: tensorflow-mnist-multigpu
            # 在Pod label中申明8 GiB显存,由2块GPU卡提供,每块提供4 GiB显存。
            aliyun.com/gpu-count: "2"
        spec:
          containers:
          - name: tensorflow-mnist-multigpu
            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: 8 # 总共申请8 GiB显存。
            workingDir: /root
          restartPolicy: Never

    YAML文件说明如下:

    • 该YAML定义一个使用TensorFlow mnist样例的Job,任务申请8 GiB显存,并申请2张GPU卡,每张GPU卡将提供4 GiB显存。

    • 申请2张GPU卡通过在Pod Label定义标签aliyun.com/gpu-count=2实现

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

验证多卡共享策略

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

  2. 在创建的容器所在行,例如tensorflow-mnist-multigpu-***,单击操作列的终端,进入容器,执行如下命令。

    nvidia-smi

    预期输出:

    Wed Jun 14 03:24:14 2023
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 470.161.03   Driver Version: 470.161.03   CUDA Version: 11.4     |
    |-------------------------------+----------------------+----------------------+
    | 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:09.0 Off |                    0 |
    | N/A   38C    P0    61W / 300W |    569MiB /  4309MiB |      2%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
    |   1  Tesla V100-SXM2...  On   | 00000000:00:0A.0 Off |                    0 |
    | N/A   36C    P0    61W / 300W |    381MiB /  4309MiB |      0%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    +-----------------------------------------------------------------------------+

    预期输出表明,容器内部仅能够使用2张GPU卡,每张卡的总显存均为4309 MiB(也就是申请的4 GiB显存,而每张卡真实显存为16160 MiB)。

  3. 在创建的容器所在行,例如tensorflow-mnist-multigpu-***,单击操作列的日志,查看容器日志,可以看到如下关键信息。

    totalMemory: 4.21GiB freeMemory: 3.91GiB
    totalMemory: 4.21GiB freeMemory: 3.91GiB

    关键信息表明,应用查询到的设备信息中,每张卡的总显存为4 GiB左右,而不是每张卡真实显存16160 MiB,也就是应用使用的显存已被隔离。