文档

使用共享GPU调度(eGPU)

更新时间:

本文介绍如何在ACK灵骏托管版集群中的灵骏节点上使用共享GPU调度(eGPU),实现GPU的调度和隔离能力。

索引

前提条件

已创建ACK灵骏托管版集群,并且集群带有GPU的灵骏节点。具体操作,请参见创建带有ACK的灵骏集群服务

说明
  • ACK灵骏托管版集群默认会安装基于eGPU的共享GPU调度组件,您可以在ACK灵骏托管版集群中直接使用基于eGPU的GPU共享能力。关于如何判断集群是否已安装基于eGPU的共享GPU组件的具体操作,请参见如何查看是否已安装基于eGPU的共享GPU组件?

  • 共享GPU调度组件的安装没有机型限制。但目前由于eGPU对H800的灵骏机型上的能力暂不支持,所以该机型的GPU显存与算力隔离能力暂时无法正常使用。如您需要使用GPU显存与算力隔离能力,请使用其他机型的灵骏节点。

步骤一:开启GPU共享调度能力

为灵骏节点开启GPU共享调度能力的步骤如下。

  1. 查找/etc/lingjun_metadata文件是否存在。

    • 如果文件存在,然后执行命令nvidia-smi,输出正常,表明预期开启共享GPU调度能力的节点是灵骏节点,可继续执行下一步。

    • 如果文件不存在,表明预期开启共享GPU调度能力的节点不是灵骏节点,因此此节点无法开启GPU共享调度能力。如果需要开启GPU共享调度能力,请创建灵骏节点。具体操作,请参见灵骏节点池

  2. 执行如下命令,通过给节点设置标签ack.node.gpu.schedule为节点开启共享GPU调度能力。

    kubectl label node <NODE_NAME> ack.node.gpu.schedule=<SHARE_MODE>
    说明

    如果标签的Value为egpu_mem,表示只进行GPU显存隔离。如果Value设置为egpu_core_mem,表示进行GPU显存和算力双隔离。您可以只申请GPU显存资源,但是如果要申请GPU算力资源,则需要同时申请GPU显存资源和GPU算力资源。

步骤二:使用GPU共享资源

下文以设置标签的Value为egpu_core_mem为例进行说明。

  1. 等待节点将共享GPU的资源上报结束。

  2. 执行如下命令,查看Node资源信息。

    kubectl get node <NODE_NAME> -oyaml

    预期输出:

      allocatable:
        aliyun.com/gpu-core.percentage: "100"
        aliyun.com/gpu-count: "1"
        aliyun.com/gpu-mem: "80"
        ...
        nvidia.com/gpu: "0"
        ...
      capacity:
        aliyun.com/gpu-core.percentage: "100"
        aliyun.com/gpu-count: "1"
        aliyun.com/gpu-mem: "80
        ...
        nvidia.com/gpu: "0"
        ...

    预期输出表明,资源列表中存在aliyun.com/gpu-memaliyun.com/gpu-core.percentage资源。

  3. 使用GPU共享资源。具体使用方法,请参见安装共享GPU调度组件

    说明

    如果Pod需要调度并使用整卡资源,则需要在目标Pod上增加Label ack.gpushare.placement=require-whole-device,然后指定需要使用的GPU显存数量为gpu-mem,则该Pod会被默认调度到拥有该数量显存的整张GPU上。

步骤三:运行共享GPU示例

  1. 使用如下YAML提交Benchmark任务。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: benchmark-job
    spec:
      parallelism: 1
      template:
        spec:
          containers:
          - name: benchmark-job
            image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3
            command:
            - bash
            - run.sh
            - --num_batches=500000000
            - --batch_size=8
            resources:
              limits:
                aliyun.com/gpu-mem: 10
                aliyun.com/gpu-core.percentage: 60
            workingDir: /root
          restartPolicy: Never
          hostNetwork: true
          tolerations:
            - operator: Exists
  2. 执行如下命令,提交任务。

    kubectl apply -f benchmark.yaml
  3. 等待Pod运行起来后,使用如下命令,进入Pod。

    kubectl exec -ti benchmark-job-xxxx bash
  4. 在容器中执行如下命令,查看GPU隔离情况。

    vgpu-smi

    预期输出:

    +------------------------------------------------------------------------------+
    |    VGPU_SMI 460.91.03     DRIVER_VERSION: 460.91.03     CUDA Version: 11.2   |
    +-------------------------------------------+----------------------------------+
    | GPU  Name                Bus-Id           |        Memory-Usage     GPU-Util |
    |===========================================+==================================|
    |   0  xxxxxxxx            00000000:00:07.0 |  8307MiB / 10782MiB   60% /  60% |
    +-------------------------------------------+----------------------------------+

    预期输出表明,Pod容器被分配了10 GB的显存和GPU上60%的算力资源。

常见问题

如何查看是否已安装基于eGPU的共享GPU组件?

执行如下命令,查看是否已安装基于eGPU的共享GPU组件。

kubectl get ds -nkube-system | grep gpushare

预期输出:

NAME                                 DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                    AGE
gpushare-egpu-device-plugin-ds       0         0         0       0            0           <none>
gpushare-egpucore-device-plugin-ds   0         0         0       0            0           <none>

预期输出表明,基于eGPU的共享GPU组件已安装。

  • 本页导读 (1)
文档反馈