k8s集群中英伟达gpu多实例mig资源上报和分配方法

  • 2025-04-08 11:53:07
  • 运维
  • 104
  • shevechco

多实例GPU(MIG)功能允许将GPU安全地划分为多个独立的GPU实例,供CUDA应用程序使用。英伟达高端GPU卡都可以开启MIG,一般MIG实例最多可分配7个。
MIG主要针对于那些未充分利用GPU资源的用户提供的GPU切分解决方案,为每个用户提供了独立的GPU资源,最大化的使用了GPU资源,下面我们就来看一下如何在k8s集群中使用MIG。
使用MIG之前我们需要做以下前期工作
1.确保已经安装英伟达GPU驱动,驱动安装可以在本站搜索下
2.安装nvidia-container-runtime,具体可以查看我之前的笔记:https://sulao.cn/post/1020
接着我们就部署在k8s集群中MIG需要的组件vidia-device-plugin和gpu-feature-discovery
首先我们安装helm

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

然后使用如下命令验证安装

helm version

然后添加vidia-device-plugin和gpu-feature-discovery的helm仓库

helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
helm repo add nvgfd https://nvidia.github.io/gpu-feature-discovery
helm repo update

然后在helm仓库搜索上述两个组件

helm search repo nvdp --devel
helm search repo nvgfd --devel

选择一个MIG策略并部署nvidia-device-plugin和gpu-feature-discovery组件

helm install --version=${version} --generate-name --set migStrategy=${MIG_STRATEGY} nvdp/nvidia-device-plugin
helm install --version=${version} --generate-name --set migStrategy=${MIG_STRATEGY} nvgfd/gpu-feature-discovery

MIG_STRATEGY有三种策略,分别是none、single、mixed,下面我们来看看三种策略的区别。
1).none策略
none策略旨在使nvidia-device-plugin的运行方式保持不变。该插件不会区分启用了MIG和未启用MIG的GPU,而是会枚举节点上的所有GPU,并使它们通过nvidia.com/gpu资源类型可用。
我们部署一个使用GPU的POD进行测试

kubectl run -it --rm --image=nvidia/cuda:11.0-base --restart=Never --limits=nvidia.com/gpu=1 mig-none-test -- nvidia-smi -L
GPU 0: A100-SXM4-40GB (UUID: GPU-c455907b-b566-3bf7-e873-8115c0fb869a)
pod "mig-none-test" deleted

可以看到和此前使用无任何区别,使用上还是和原有GPU一样
2).single策略
single策略旨在使用户在Kubernetes中使用GPU的体验保持与以往相同。MIG设备将与传统的nvidia.com/gpu资源类型一同枚举,就像以前一样。然而,与该资源类型相关联的属性现在映射到该节点上可用的MIG设备,而不是完整的GPU。
我们创建7个MIG切片的GPU

nvidia-smi mig -cgi 19,19,19,19,19,19,19 -C
nvidia-smi -L
GPU 0: A100-SXM4-40GB (UUID: GPU-c455907b-b566-3bf7-e873-8115c0fb869a)
  MIG 1g.5gb Device 0: (UUID: MIG-GPU-c455907b-b566-3bf7-e873-8115c0fb869a/7/0)
  MIG 1g.5gb Device 1: (UUID: MIG-GPU-c455907b-b566-3bf7-e873-8115c0fb869a/8/0)
  MIG 1g.5gb Device 2: (UUID: MIG-GPU-c455907b-b566-3bf7-e873-8115c0fb869a/9/0)
  MIG 1g.5gb Device 3: (UUID: MIG-GPU-c455907b-b566-3bf7-e873-8115c0fb869a/10/0)
  MIG 1g.5gb Device 4: (UUID: MIG-GPU-c455907b-b566-3bf7-e873-8115c0fb869a/11/0)
  MIG 1g.5gb Device 5: (UUID: MIG-GPU-c455907b-b566-3bf7-e873-8115c0fb869a/12/0)
  MIG 1g.5gb Device 6: (UUID: MIG-GPU-c455907b-b566-3bf7-e873-8115c0fb869a/13/0)

重启nvidia-device-plugin组件重新上报GPU资源,使用describe命令查看

kubectl descibe node <node_name>
Capacity:
nvidia.com/gpu: 7
...
Allocatable:
nvidia.com/gpu: 7

3).mixed策略
为了测试此策略,我们检查所有MIG设备是否使用其完全限定名称以nvidia.com/mig-<slice_count>g.<memory_size>gb的形式进行了枚举。该测试假设集群中在单个节点上的GPU已经启用了MIG。
我们创建4个MIG切片的GPU

nvidia-smi mig -cgi 9,14,19,19 -C
nvidia-smi -L
GPU 0: A100-SXM4-40GB (UUID: GPU-4200ccc0-2667-d4cb-9137-f932c716232a)
  MIG 3g.20gb Device 0: (UUID: MIG-GPU-c455907b-b566-3bf7-e873-8115c0fb869a/2/0)
  MIG 2g.10gb Device 1: (UUID: MIG-GPU-c455907b-b566-3bf7-e873-8115c0fb869a/3/0)
  MIG 1g.5gb Device 2: (UUID: MIG-GPU-c455907b-b566-3bf7-e873-8115c0fb869a/9/0)
  MIG 1g.5gb Device 3: (UUID: MIG-GPU-c455907b-b566-3bf7-e873-8115c0fb869a/10/0)

然后我们重启nvidia-device-plugin组件,重新报上GPU资源到节点,使用describe命令查看

kubectl descibe node <node_name>
Capacity:
nvidia.com/mig-1g.5gb: 2
nvidia.com/mig-2g.10gb: 1
nvidia.com/mig-3g.20gb: 1
...
Allocatable:
nvidia.com/mig-1g.5gb: 2
nvidia.com/mig-2g.10gb: 1
nvidia.com/mig-3g.20gb: 1

然后在POD中使用方法如下:

kubectl run -it --rm --image=nvidia/cuda:11.0-base --restart=Never --limits=nvidia.com/mig-1g.5gb=1 mig-mixed-test -- nvidia-smi -L
GPU 0: A100-SXM4-40GB (UUID: GPU-c455907b-b566-3bf7-e873-8115c0fb869a)
MIG 1g.5gb Device 0: (UUID: MIG-GPU-c455907b-b566-3bf7-e873-8115c0fb869a/9/0)
pod "mig-mixed-test" deleted

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.sulao.cn/post/1021

相关推荐