全部产品
Search
文档中心

:运行共享GPU调度组件

更新时间:Aug 28, 2023

本文介绍安装完共享GPU组件后,如何在专有版GPU集群中使用共享GPU能力。

前提条件

已安装共享GPU组件。具体操作,请参见安装共享GPU调度组件

注意事项

针对纳入K8s集群管理的GPU节点,为业务应用申请和使用GPU资源时,请关注以下注意事项。

  • 请勿直接在节点上运行GPU应用程序。

  • 请勿通过dockerpodmannerdctl等工具命令创建容器并为容器申请GPU资源。例如,执行docker run --gpus alldocker run -e NVIDIA_VISIBLE_DEVICES=all并运行GPU程序。

  • 请勿在Pod YAML的env中直接添加环境变量NVIDIA_VISIBLE_DEVICES=allNVIDIA_VISIBLE_DEVICES=<GPU ID>等,通过容器的环境变量NVIDIA_VISIBLE_DEVICES直接为Pod申请GPU资源,并运行GPU程序。

  • 在Pod YAML中未设置环境变量NVIDIA_VISIBLE_DEVICES,制作Pod所使用的镜像时,请勿将环境变量默认配置为NVIDIA_VISIBLE_DEVICES=all,并运行GPU程序。

  • 请勿在Pod的securityContext中配置privileged: true,并运行GPU程序。

通过以上非标方式为业务应用申请的GPU资源,将存在如下安全隐患。

  • 通过以上方式为业务应用申请的GPU资源,并未在调度器的设备资源账本中统计,有可能造成节点GPU资源的分配情况与调度器设备资源账本中记录的值不一致。调度器仍然会调度某些申请GPU资源的Pod到这个节点上,导致用户业务因为在同一张GPU卡上出现资源争抢(比如GPU显存申请)而运行失败的情况。

  • 非标操作可能引发其他未知问题,例如NVIDIA社区的已知报错

操作步骤

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

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

  3. 登录目标Master节点,执行以下命令,查询集群的GPU共享能力。

    说明
    kubectl inspect cgpu

    预期输出:

    NAME                     IPADDRESS    GPU0(Allocated/Total)  GPU1(Allocated/Total)  GPU Memory(GiB)
    cn-beijing.192.168.XX.XX   192.168.XX.XX  0/7                    0/7                    0/14
    ---------------------------------------------------------------------
    Allocated/Total GPU Memory In Cluster:
    0/14 (0%)
    说明

    如果想查询GPU共享能力详细信息,执行命令kubectl inspect cgpu -d

  4. 在左侧导航栏,选择工作负载 > 任务,在任务页面的右上角,单击使用YAML创建资源,然后在创建页面,选择命名空间,示例模板选择已有模板或自定义。在模板代码输入框输入以下YAML示例代码,然后单击创建。

    apiVersion: v1
    kind: Pod
    metadata:
      name: gpu-share-sample
    spec:
      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                    
  5. 在Master节点下,再次执行以下命令,查看集群GPU显存使用情况。

    kubectl inspect cgpu

    预期输出:

    NAME                      IPADDRESS      GPU0(Allocated/Total)  GPU Memory(GiB)
    cn-beijing.192.168.XX.XX  192.168.XX.XX  3/14                   3/14
    ---------------------------------------------------------------------
    Allocated/Total GPU Memory In Cluster:
    3/14 (21%)

    预期输出表明,节点cn-beijing.192.168.XX.XX共有14 GiB显存,已分配3 GiB显存。

结果验证

您可以通过以下方式验证节点GPU显存隔离能力是否生效。

  1. 登录目标Master节点。

  2. 执行以下命令,查看已部署应用的日志,验证cGPU显存隔离是否部署成功。

    kubectl logs gpu-share-sample --tail=1

    预期输出:

    2023-08-07 09:08:13.931003: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1326] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 2832 MB memory) -> physical GPU (device: 0, name: Tesla T4, pci bus id: 0000:00:07.0, compute capability: 7.5)

    预期输出表明,容器申请的显存为2832 MB。

  3. 执行以下命令,登录容器查看容器被分配显存总量。

    kubectl exec -it gpu-share-sample nvidia-smi

    预期输出:

    Mon Aug 7 08:52:18 2023
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 418.87.01    Driver Version: 418.87.01    CUDA Version: 10.1     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  Tesla T4            On   | 00000000:00:07.0 Off |                    0 |
    | N/A   41C    P0    26W /  70W |   3043MiB /  3231MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    +-----------------------------------------------------------------------------+

    预期输出表明,该容器被分配显存总量为3231 MiB 。

  4. 登录带有GPU设备的节点,查看示例应用所在节点的GPU显存总量。

    nvidia-smi

    预期输出:

    Mon Aug  7 09:18:26 2023 
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 418.87.01    Driver Version: 418.87.01    CUDA Version: 10.1     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  Tesla T4            On   | 00000000:00:07.0 Off |                    0 |
    | N/A   40C    P0    26W /  70W |   3053MiB / 15079MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    |    0      8796      C   python3                                     3043MiB |
    +-----------------------------------------------------------------------------+
    
                            

    预期输出表明,主机上的显存总量为15079 MiB,其中3053 MiB分配给容器。

相关文档