使用共享GPU调度实现仅共享不隔离能力

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

前提条件

步骤一:创建节点池

按照以下步骤创建不安装GPU隔离模块的节点池。

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

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

  3. 节点池页面,单击创建节点池,在创建节点池对话框,设置相关配置项,然后单击确认配置

    主要配置项说明如下。更多关于配置项的说明,请参见创建节点池

    • 期望节点数:设置节点池初始节点数量。如不需要创建节点,可以填写为0。

    • 节点标签:为集群节点添加共享GPU调度属性标签。关于标签的详细信息,请参见GPU节点调度属性标签说明

      单击1图标,设置gpusharetrue

步骤二:提交任务

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

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

  3. 任务页面,单击使用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定义一个使用TensorFlow minist样例的Job,Job中有一个Pod,该Pod申请4 GiB显存。

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

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

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

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

  3. 容器组页面,单击步骤二创建的容器右侧操作列的终端 > tensorflow-mnist-share,登录容器。

  4. 执行以下命令,查看应用的显存情况。

    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

相关文档