更新时间:2024-08-17 GMT+08:00

使用GPU虚拟化

本文介绍如何使用GPU虚拟化能力实现算力和显存隔离,高效利用GPU设备资源。

前提条件

约束与限制

  • 单个GPU卡最多虚拟化成20个GPU虚拟设备。
  • init容器不支持使用GPU虚拟化资源。
  • GPU虚拟化支持显存隔离、显存与算力隔离两种隔离模式。单个GPU卡仅支持调度同一种隔离模式的工作负载。
  • 使用GPU虚拟化后,不支持使用Autoscaler插件自动扩缩容GPU虚拟化节点。
  • XGPU服务的隔离功能不支持以UVM的方式申请显存,即调用CUDA API cudaMallocManaged(),更多信息,请参见NVIDIA官方文档。请使用其他方式申请显存,例如调用cudaMalloc()等。
  • 受GPU虚拟化技术的限制,容器内应用程序初始化时,通过nvidia-smi监测工具监测到的实时算力可能超过容器可用的算力上限。

创建GPU虚拟化应用

通过控制台创建

  1. 登录CCE控制台。
  2. 单击集群名称进入集群,在左侧选择“工作负载”,在右上角单击“创建工作负载”
  3. 配置工作负载信息。

    “容器配置>基本信息”中设置xGPU配额:

    • 显存:显存值单位为MiB,需为正整数,且为128的倍数。若配置的显存超过单张GPU卡的显存,将会出现无法调度状况。
    • 算力:算力值单位为%,需为5的倍数,且最大不超过100。
    • 当显存设置为单张GPU卡的容量上限或算力设置为100%时,将会使用整张GPU卡。
    • 使用GPU虚拟化时,工作负载调度器将默认指定为Volcano且不可更改。
    图1 设置xGPU配额

    本文主要为您介绍GPU虚拟化的使用,其他参数详情请参见工作负载

    其余信息都配置完成后,单击“创建”

  4. 工作负载创建成功后,您可以尝试验证GPU虚拟化的隔离能力。

    1. 登录容器查看容器被分配显存总量。
      kubectl exec -it gpu-app -- nvidia-smi

      预期输出:

      Wed Apr 12 07:54:59 2023       
      +-----------------------------------------------------------------------------+
      | NVIDIA-SMI 470.141.03   Driver Version: 470.141.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...  Off  | 00000000:21:01.0 Off |                    0 |
      | N/A   27C    P0    37W / 300W |   4912MiB /  5120MiB |      0%      Default |
      |                               |                      |                  N/A |
      +-------------------------------+----------------------+----------------------+
      
      +-----------------------------------------------------------------------------+
      | Processes:                                                                  |
      |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
      |        ID   ID                                                   Usage      |
      |=============================================================================|
      +-----------------------------------------------------------------------------+

      预期输出表明,该容器被分配显存总量为5120 MiB,实际使用了4912MiB。

    2. 查看所在节点的GPU显存隔离情况(在节点上执行)。
      nvidia-smi

      预期输出:

      Wed Apr 12 09:31:10 2023        
      +-----------------------------------------------------------------------------+
      | NVIDIA-SMI 470.141.03   Driver Version: 470.141.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...  Off  | 00000000:21:01.0 Off |                    0 |
      | N/A   27C    P0    37W / 300W |   4957MiB / 16160MiB |      0%      Default |
      |                               |                      |                  N/A |
      +-------------------------------+----------------------+----------------------+
      
      +-----------------------------------------------------------------------------+
      | Processes:                                                                  |
      |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
      |        ID   ID                                                   Usage      |
      |=============================================================================|
      |    0   N/A  N/A    760445      C   python                           4835MiB |
      +-----------------------------------------------------------------------------+

      预期输出表明,GPU节点上的显存总量为16160 MiB,其中示例Pod使用了4957MiB。

通过kubectl命令行创建

  1. 使用kubectl连接集群。
  2. 创建使用GPU虚拟化的应用。

    当前支持隔离显存或同时隔离显存与算力,暂不支持设置为仅隔离算力,即不支持单独设置volcano.sh/gpu-core.percentage。

    创建gpu-app.yaml文件,内容如下:

    • 仅隔离显存:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: gpu-app
        labels:
          app: gpu-app
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: gpu-app
        template: 
          metadata:
            labels:
              app: gpu-app
          spec:
            containers:
            - name: container-1
              image: <your_image_address>     # 请替换为您的镜像地址
              resources:
                limits:
                  volcano.sh/gpu-mem.128Mi: 40  # 该Pod分配的显存大小,该数值表示128Mi的倍数,即40*128=5120Mi
            imagePullSecrets:
              - name: default-secret
            schedulerName: volcano
    • 同时隔离显存与算力:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: gpu-app
        labels:
          app: gpu-app
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: gpu-app
        template: 
          metadata:
            labels:
              app: gpu-app
          spec:
            containers:
            - name: container-1
              image: <your_image_address>     # 请替换为您的镜像地址
              resources:
                limits:
                  volcano.sh/gpu-mem.128Mi: 40  # 该Pod分配的显存大小,该数值表示128Mi的倍数,即40*128=5120Mi
                  volcano.sh/gpu-core.percentage: 25    # 该Pod分配的算力大小
            imagePullSecrets:
              - name: default-secret
            schedulerName: volcano
    表1 关键参数说明

    参数

    是否必选

    描述

    volcano.sh/gpu-mem.128Mi

    该数值表示128Mi的倍数,需为正整数,显存值单位为MiB。若配置的显存超过单张GPU卡的显存,将会出现无法调度状况。

    volcano.sh/gpu-core.percentage

    算力值单位为%,需为5的倍数,且最大不超过100。

    • 当显存设置为单张GPU卡的容量上限或算力设置为100%时,将会使用整张GPU卡。
    • 使用GPU虚拟化时,工作负载调度器将默认指定为Volcano且不可更改。

  3. 执行以下命令,创建应用。

    kubectl apply -f gpu-app.yaml

  4. 验证GPU虚拟化的隔离能力。

    1. 登录容器查看容器被分配显存总量。
      kubectl exec -it gpu-app -- nvidia-smi

      预期输出:

      Wed Apr 12 07:54:59 2023       
      +-----------------------------------------------------------------------------+
      | NVIDIA-SMI 470.141.03   Driver Version: 470.141.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...  Off  | 00000000:21:01.0 Off |                    0 |
      | N/A   27C    P0    37W / 300W |   4912MiB /  5120MiB |      0%      Default |
      |                               |                      |                  N/A |
      +-------------------------------+----------------------+----------------------+
      
      +-----------------------------------------------------------------------------+
      | Processes:                                                                  |
      |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
      |        ID   ID                                                   Usage      |
      |=============================================================================|
      +-----------------------------------------------------------------------------+

      预期输出表明,该容器被分配显存总量为5120 MiB,实际使用了4912MiB。

    2. 查看所在节点的GPU显存隔离情况(在节点上执行)。
      nvidia-smi

      预期输出:

      Wed Apr 12 09:31:10 2023        
      +-----------------------------------------------------------------------------+
      | NVIDIA-SMI 470.141.03   Driver Version: 470.141.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...  Off  | 00000000:21:01.0 Off |                    0 |
      | N/A   27C    P0    37W / 300W |   4957MiB / 16160MiB |      0%      Default |
      |                               |                      |                  N/A |
      +-------------------------------+----------------------+----------------------+
      
      +-----------------------------------------------------------------------------+
      | Processes:                                                                  |
      |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
      |        ID   ID                                                   Usage      |
      |=============================================================================|
      |    0   N/A  N/A    760445      C   python                           4835MiB |
      +-----------------------------------------------------------------------------+

      预期输出表明,GPU节点上的显存总量为16160 MiB,其中示例Pod使用了4957MiB。