某些场景下,您可能不需要GPU隔离模块参与共享GPU调度。例如,业务应用本身提供显存限制能力,类似于Java应用启动时,可以通过选项指定该应用能够使用的最大内存值。此时,如果使用GPU隔离模块隔离业务可能会导致不可预知的问题。因此,共享GPU调度功能支持在某些节点不安装GPU隔离模块。本文介绍如何不隔离模块配置共享GPU调度。
前提条件
已创建Kubernetes专有版GPU集群。具体操作,请参见创建专有GPU集群。
已安装共享GPU调度基础版组件。具体操作,请参见安装共享GPU调度组件。
步骤一:创建节点池
按照以下步骤创建不安装GPU隔离模块的节点池。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在节点池页面,单击创建节点池,在创建节点池对话框,设置相关配置项,然后单击确认配置。
主要配置项说明如下。更多关于配置项的说明,请参见创建节点池。
期望节点数:设置节点池初始节点数量。如不需要创建节点,可以填写为0。
节点标签:为集群节点添加共享GPU调度属性标签。关于标签的详细信息,请参见GPU节点调度属性标签说明。
单击图标,设置键为
gpushare
,值为true
。
步骤二:提交任务
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在任务页面,单击使用YAML创建资源,在创建页面的代码输入框输入以下示例代码,然后单击创建。
apiVersion: batch/v1 kind: Job metadata: name: tensorflow-mnist-share spec: parallelism: 1 template: metadata: labels: app: tensorflow-mnist-share spec: containers: - name: tensorflow-mnist-share image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5 command: - python - tensorflow-sample-code/tfjob/docker/mnist/main.py - --max_steps=100000 - --data_dir=tensorflow-sample-code/data resources: limits: aliyun.com/gpu-mem: 4 # 总共申请4 GiB显存。 workingDir: /root restartPolicy: Never
代码解析如下。
该YAML定义一个使用TensorFlow minist样例的Job,Job中有一个Pod,该Pod申请4 GiB显存。
申请的4 GiB显存通过在Pod的
resources.limits
字段中定义aliyun.com/gpu-mem: 4
实现。
步骤三:验证仅共享不隔离能力
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在容器组页面,单击步骤二创建的容器右侧操作列的 ,登录容器。
执行以下命令,查看应用的显存情况。
nvidia-smi
预期输出:
Wed Jun 14 06:45:56 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 515.105.01 Driver Version: 515.105.01 CUDA Version: 11.7 | |-------------------------------+----------------------+----------------------+ | 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... On | 00000000:00:09.0 Off | 0 | | N/A 35C P0 59W / 300W | 334MiB / 16384MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| +-----------------------------------------------------------------------------+
输出表明,Pod内部整张GPU卡的总显存为16384 MiB(本文示例使用的GPU卡型为V100),而在有隔离模块参与的场景下,该值与Pod申请值4 GiB一致,说明配置生效。
业务应用需要从以下两个环境变量中读取该业务能够使用的显存值。
ALIYUN_COM_GPU_MEM_CONTAINER=4 # 该Pod能够使用的显存值。 ALIYUN_COM_GPU_MEM_DEV=16 # 每张GPU卡总共的显存值。
如果应用需要的是显存的百分比,也就是该应用使用的显存占GPU卡总显存的百分比。可以使用上述两个环境变量得出,具体计算公式如下。
percetange = ALIYUN_COM_GPU_MEM_CONTAINER / ALIYUN_COM_GPU_MEM_DEV = 4 / 16 = 0.25