使用GPU虚拟化
本文介绍如何使用GPU虚拟化能力实现算力和显存隔离,高效利用GPU设备资源。
前提条件
- 已完成GPU虚拟化资源准备。
- 如果您需要通过命令行创建,需要使用kubectl连接到集群,详情请参见通过kubectl连接集群。
约束与限制
- 单个GPU卡最多虚拟化成20个GPU虚拟设备。
- init容器不支持使用GPU虚拟化资源。
- GPU虚拟化支持显存隔离、显存与算力隔离两种隔离模式。单个GPU卡仅支持调度同一种隔离模式的工作负载。
- v1.26及以下的集群中,使用GPU虚拟化后,不支持使用Autoscaler插件自动扩缩容GPU虚拟化节点。
- GPU虚拟化服务的隔离功能不支持以UVM的方式申请显存,即调用CUDA API cudaMallocManaged(),更多信息,请参见NVIDIA官方文档。请使用其他方式申请显存,例如调用cudaMalloc()等。
- 受GPU虚拟化技术的限制,容器内应用程序初始化时,通过nvidia-smi监测工具监测到的实时算力可能超过容器可用的算力上限。
- 受GPU虚拟化技术的限制,GPU虚拟化的算显隔离功能在渲染场景无法使用,渲染场景请使用整卡模式或显存隔离模式。
- 节点上开启了GPU虚拟化且有多张GPU卡时,如果GPU资源不足,不支持抢占其他Pod的GPU资源。
创建GPU虚拟化应用
通过控制台创建
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧选择“工作负载”,在右上角单击“创建工作负载”。
- 配置工作负载信息。
在“容器配置>基本信息”中设置GPU配额:
- 显存:显存值单位为MiB,需为正整数,且为128的倍数。若配置的显存超过单张GPU卡的显存,将会出现无法调度状况。
- 算力:算力值单位为%,需为5的倍数,且最大不超过100。
- 当显存设置为单张GPU卡的容量上限或算力设置为100%时,将会使用整张GPU卡。
- 使用GPU虚拟化时,工作负载调度器将默认指定为Volcano且不可更改。
图1 设置GPU配额本文主要为您介绍GPU虚拟化的使用,其他参数详情请参见工作负载。
其余信息都配置完成后,单击“创建”。
- 工作负载创建成功后,您可以尝试验证GPU虚拟化的隔离能力。
- 登录容器查看容器被分配显存总量。
kubectl exec -it gpu-app -- nvidia-smi
预期输出:
Wed Apr 12 07:54:59 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 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 | 0MiB / 5120MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| +-----------------------------------------------------------------------------+
由于该容器暂未使用GPU程序,因此该容器被分配显存总量为5120 MiB,但实际使用量为0MiB。当在该容器上部署相关GPU程序后,实际使用量将不再为0MiB。
- 查看所在节点的GPU显存隔离情况(在节点上执行)。
nvidia-smi
预期输出:
Wed Apr 12 09:31:10 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 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 | 0MiB / 16160MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
预期输出表明,GPU节点上的显存总量为16160 MiB,由于示例Pod暂未使用GPU程序,因此显存使用量为0MiB。
- 登录容器查看容器被分配显存总量。
通过kubectl命令行创建
- 使用kubectl连接集群。
- 创建使用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且不可更改。
- 仅隔离显存:
- 执行以下命令,创建应用。
kubectl apply -f gpu-app.yaml
- 验证GPU虚拟化的隔离能力。
- 登录容器查看容器被分配显存总量。
kubectl exec -it gpu-app -- nvidia-smi
预期输出:
Wed Apr 12 07:54:59 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 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 | 0MiB / 5120MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| +-----------------------------------------------------------------------------+
由于该容器暂未使用GPU程序,因此该容器被分配显存总量为5120 MiB,但实际使用量为0MiB。当在该容器上部署相关GPU程序后,实际使用量将不再为0MiB。
- 查看所在节点的GPU显存隔离情况(在节点上执行)。
nvidia-smi
预期输出:
Wed Apr 12 09:31:10 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 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 | 0MiB / 16160MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
预期输出表明,GPU节点上的显存总量为16160 MiB,由于示例Pod暂未使用GPU程序,因此显存使用量为0MiB。
- 登录容器查看容器被分配显存总量。