前提条件
已创建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
步骤二:提交任务,任务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 显存
步骤三:验证显存隔离能力
远程登录到刚刚创建的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 |
+-----------------------------------------+------------------------+----------------------+
场景2:显存隔离和算力限制
步骤一:节点打上共享GPU调度标签
kubectl label no <node_name> ccse.node.gpu.schedule=core_mem
步骤二:提交任务,任务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 显存
步骤三:验证显存隔离能力
远程登录到刚刚创建的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 |
+-----------------------------------------------------------------------------------------+
步骤四:执行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
步骤五:调整算力资源,查看任务执行时间
将上面工作负载中的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