GPU共享调度
 
                  更新时间 2025-06-11 11:37:18
                 
 
                    最近更新时间: 2025-06-11 11:37:18
                  
 本文介绍GPU共享调度,实现GPU的共享和隔离能力。
 前提条件
已创建Kubernetes集群,安装好智算套件,并且集群包含NVIDIA GPU节点。
使用限制
- 共享GPU调度目前支持仅申请显存和同时申请显存和算力两种任务,这两种任务不能同时存在于一个节点上,即一个节点只运行仅申请显存的任务,或者只运行同时申请显存和算力的任务。 
- 为工作负载申请算力和显存时,有如下限制: - 每一张GPU提供的算力按100计量,代表这张卡的100%算力,例如申请50代表使用GPU卡的50%算力。 
- 显存的计算单位为MiB,比如申请1000,则代表工作负载需要1000MiB的显存资源。 
 
共享GPU调度标签说明
用户可根据实际使用场景,选择 【仅申请显存】和 【同时申请显存和算力】其中一种的调度能力,给节点打上标签,启用共享调度的能力。
| 标签 | 标签值 | 说明 | 
|---|---|---|
| ack.node.gpu.schedule | egpu | 仅显存隔离,不限制算力 | 
| core_mem | 显存隔离和算力限制 | 
场景一:仅显存隔离,不限制算力
步骤1:节点配置共享GPU调度标签。
kubectl label no <node_name> ccse.node.gpu.schedule=egpu步骤2:提交任务,任务YAML如下:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gpu-share-test
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gpu-share-test
  template:
    metadata:
      labels:
        app: gpu-share-test
    spec:
      containers:
        - name: gpu-share-test
          image: registry-vpc-crs-hangzhou7.cnsp-internal.ctyun.cn/library/nvidia-samples:vectoradd-cuda11.6.0-ubi8
          command:
            - sleep
            - 1h
          resources:
            limits:
              ctyun.cn/gpu-memory: '2000' # 单位为MiB,此处代表申请 2000MiB 显存步骤3:验证显存隔离能力。
远程登录到刚刚创建的pod。
kubectl exec -it <pod_name> -- bash执行nvidia-smi查看显存大小,预期输出如下:
[root@gpu-share-test-77db5c96cd-ghl9b /]# nvidia-smi 
Mon Nov 25 08:10:08 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.14              Driver Version: 550.54.14      CUDA Version: 12.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  NVIDIA A10                     On  |   00000000:00:06.0 Off |                    0 |
|  0%   33C    P8             21W /  150W |        0MiB /  2000MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
场景二:显存隔离和算力限制
步骤1:节点配置共享GPU调度标签
kubectl label no <node_name> ccse.node.gpu.schedule=core_mem步骤2:提交任务,任务YAML如下:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gpu-share-test
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gpu-share-test
  template:
    metadata:
      labels:
        app: gpu-share-test
    spec:
      containers:
        - name: gpu-share-test
          image: deep-learning-examples:v3
          command:
            - sleep
            - 1h
          resources:
            limits:
              ctyun.cn/gpu-core.percentage: "10"  # 每一张GPU提供的算力按100计量,10代表一张一张卡10%的算力
              ctyun.cn/gpu-memory: '2000'  # 单位为MiB,此处代表申请 2000MiB 显存步骤3:验证显存隔离能力。
远程登录到刚刚创建的pod。
kubectl exec -it <pod_name> -- bash执行nvidia-smi查看显存大小,预期输出如下:
[root@gpu-share-test-77db5c96cd-ghl9b /]# nvidia-smi 
Mon Nov 25 08:10:08 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.14              Driver Version: 550.54.14      CUDA Version: 12.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  NVIDIA A10                     On  |   00000000:00:06.0 Off |                    0 |
|  0%   33C    P8             21W /  150W |        0MiB /  2000MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+步骤4:执行GPU任务.
执行以下命令,运行GPU任务。
time python ./main.py --arch=resnet50 --evaluate --epochs=1 --pretrained -b=5 /imagenet执行任务后,查看执行时间。
DLL 2024-12-08 14:26:52.588591 - Summary: train.data_time : None s train.compute_time : None s val.data_time : 0.00411 s val.compute_latency_at100 : 1.87428 s val.compute_latency_at
99 : 0.07948 s val.compute_latency_at95 : 0.07825 s
Experiment ended
real    0m49.596s
user    0m52.247s
sys     0m3.520s步骤5:调整算力资源,查看任务执行时间。
将上面工作负载中的ctyun.cn/gpu-core.percentage增大至50。
resources:
  limits:
    ctyun.cn/gpu-core.percentage: "50"  # 每一张GPU提供的算力按100计量,50代表一张一张卡50%的算力
    ctyun.cn/gpu-memory: '2000'执行GPU任务,查看命令输出内容,可以见到耗时减少。
data_time : 0.00086 s val.compute_latency_at100 : 0.60483 s val.compute_latency_at
99 : 0.02637 s val.compute_latency_at95 : 0.02540 s
Experiment ended
real    0m12.447s
user    0m12.778s
sys     0m3.486s