配置共享GPU调度仅共享不隔离策略

在某些场景下,您可能不需要GPU隔离模块参与共享GPU调度。例如,有些业务应用本身提供显存限制能力,类似于Java应用启动时,可以通过选项指定该应用能够使用的最大内存值。这种情况下,使用GPU隔离模块隔离业务显存反而会有问题。对此,共享GPU调度支持某些节点不安装GPU隔离模块的选项。本文介绍如何配置共享GPU调度仅共享不隔离策略。

前提条件

步骤一:创建节点池

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

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

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

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

    配置项

    说明

    实例规格

    架构选择GPU云服务器,选择多个GPU实例规格。本文以使用GPU卡V100为例进行说明。

    期望节点数

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

    节点标签

    单击1.jpg,添加如下记录:ack.node.gpu.scheduleshare。仅开启GPU共享调度能力。

    关于节点标签的更多信息,请参见GPU节点调度属性标签

步骤二:提交任务

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

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

  3. 单击页面右上角的使用YAML创建资源,将如下代码拷贝至模板区域,然后单击页面下方的创建

    展开查看YAML详细信息

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: tensorflow-mnist-share
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: tensorflow-mnist-share
        spec:
          containers:
          - name: tensorflow-mnist-share
            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有1个Pod,该Pod申请4 GiB显存。

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

步骤三:验证仅共享不隔离能力

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

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

    nvidia-smi

    预期输出:

    Wed Jun 14 06:45:56 2023
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 515.105.01   Driver Version: 515.105.01   CUDA Version: 11.7     |
    |-------------------------------+----------------------+----------------------+
    | 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   35C    P0    59W / 300W |    334MiB / 16384MiB |      0%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    +-----------------------------------------------------------------------------+

    Pod内部能够发现整张GPU卡的总显存16384 MiB(本文示例使用GPU卡为V100),而在有隔离模块参与的场景下,该值与Pod申请值一致(本文示例为4 GiB),说明配置生效。

    业务应用需要从两个环境变量中读取该业务能够使用的显存值。

    ALIYUN_COM_GPU_MEM_CONTAINER=4 # 该Pod能够使用的显存值。
    ALIYUN_COM_GPU_MEM_DEV=16 # 每张GPU卡总共的显存值。

    如果应用需要的是显存的百分比,也就是该应用使用的显存占GPU卡总显存的百分比。可以使用上述两个环境变量得出:

    percetange = ALIYUN_COM_GPU_MEM_CONTAINER / ALIYUN_COM_GPU_MEM_DEV = 4 / 16 = 0.25