NVIDIA-GPU共享方案(全网最全,持续调研持续更新)

1、什么是vGPU

vGPU(虚拟 GPU)方案则是将物理 GPU 虚拟化,分配给多个虚拟机或容器使用,以提高资源利用率和灵活性

GPU环境部署可以查看这篇文章
https://www.lixueduan.com/posts/ai/01-how-to-use-gpu/

2、方案选型

名称Time-SlicedMIGHAMI
原理GPU 按时间片轮流分配给不同 VM,类似 CPU 时间片调度GPU 被分割为多个,每个实例运行独立的 CUDA 上下文,类似多个小型 GPUHAMI 通过硬件和软件协同,允许 GPU 内存高效映射到多个 VM 或主机,减少内存复制开销,支持动态内存分配
资源分配方式时间分割,动态共享物理分割,静态分配内存共享,动态映射
隔离性较低(共享 GPU 核心和内存)高(每个实例完全隔离)中等(内存共享但访问隔离)
性能开销中等(约 5-10% 调度开销)低(接近原生性能)低到中等(依赖实现)
厂商NVIDIANVIDIA开源组织(原第四范式内部项目)

如果是英伟达A卡或者H卡,建议使用MIG,性能最高,安全性最强,最可靠

如果是其他的卡,或者不考虑小部分性能损失(预计只能发挥90%的性能)建议使用HAMI

3、使用教程

3.1 MIG

环境:k8s、H800(80G显存)

操作过程:
1、启动MIG模型
2、创建GI(GPU instance)
3、创建CI (computer instance)
4、更新K8s GPU插件
5、pod资源分配

1、配置MIG


#启用 MIG 模式
nvidia-smi -mig 1
#指定显卡启用MIG模式
nvidia-smi -i 0 -mig 1

#查看 0 号 GPU 显卡支持的 MIG 规格
nvidia-smi mig -i 0 -lgip


#在第0块显卡创建 7个子GPU ,计算核心数量为 1g,显存 10gb 的资源
nvidia-smi mig -cgi 1g.10gb,1g.10gb,1g.10gb,1g.10gb,1g.10gb,1g.10gb,1g.10gb -i 0

#查看创建情况
nvidia-smi mig -lgi

# 如果要删除GPU0上的所有 GPU 实例
nvidia-smi mig -dgi -i 0  




# 查看CI的profile 信息
nvidia-smi mig -i 0 -lcip

# 为GI创建CI(ID为0)
for gi in {0..6}; do
    nvidia-smi mig -i 0 -cci 0 -gi $gi
done

#查看资源规格列表
nvidia-smi -L


#也可以同时创建gi ci
nvidia-smi mig -cgi 0,1g.10gb -C

# 删除GPU0上的所有CI实例
nvidia-smi mig -dci -i 0  

注意:如果要删除GI,必须先删GI下面的CI
 

2、更新k8s GPU插件

helm upgrade nvdp -n nvidia-device-plugin . -f values.yaml --set migStrategy=mixed

migStrategy策略分为以下几种:

  • none策略禁用 MIG

  • single策略 每个 GPU 只能创建一个 MIG 实例。

  • mixed策略 允许创建多个不同的 MIG 实例。

查看更新情况
kubectl describe node node1 | grep mig

3、pod使用mig资源

apiVersion: v1
kind: Pod
metadata:
  name: mig-test
spec:
  containers:
  - name: cuda-container
    image: nvidia/cuda:11.8.0-base
    resources:
      limits:
        nvidia.com/mig-1g.10gb: 1
    command: ["nvidia-smi"]

3.2 HAMI

环境:nvidia驱动、nvidia-container-toolkit、nvidia-device-plugin

部署
可以参考:https://project-hami.io/zh/docs/installation/online-installation

1、通过添加标签 "gpu=on" 来为 GPU 节点打标签,方便使用 HAMi 调度这些节点。 如果没有此标签,这些节点就无法被 HAMi 调度器进行管理
kubectl label nodes {nodeid} gpu=on

2、添加helm仓库
helm repo add hami-charts https://project-hami.github.io/HAMi/

3、部署 (观测相应的hami-scheduler、hami-device-plugin是否正常启动)
helm upgrade hami hami-charts/hami  --set scheduler.kubeScheduler.imageTag=v1.32.6  --set devicePlugin.runtimeClassName=nvidia  --set devicePlugin.createRuntimeClass=false --install

测试:
HAMI GPU虚拟化 可以按显存大小划分,也可按比例划分

这里演示按内存大小划分

apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  containers:
    - name: ubuntu-container
      image: ubuntu:18.04
      command: ["bash", "-c", "sleep 86400"]
      resources:
        limits:
          nvidia.com/gpu: 2 # 请求 2 个 vGPU
          nvidia.com/gpumem: 3000 # 每个 vGPU 请求 3G 设备内存

3.3 Time-slicing

Time-slicing 的时间分配原则是:谁现在真正活跃在使用 GPU,就按活跃数量平分时间;没人抢的时候,当前使用者就能独占几乎全部时间。

简单例子:
想象一张物理 GPU 是一辆出租车(一次只能载一个人)。

你一个人叫车 → 司机全程只载你,车速全开,你感觉像专车(没竞争 → 吃饱)。
后来又来了 3 个人一起叫同一辆车 → 司机开始让你们 4 个人轮流坐,每人只能坐 1/4 的路程(有竞争 → 开始切片平分)。

即使你在 app 上“预定了 100 次座位”(replicas=100),但如果你实际只带了一个人上车,司机还是只看到你一个人在用车,依然全程给你开(请求数量不影响时间分配,只有实际活跃的使用者数量才决定要不要切片)。

完全平均分配(per-process 平分)。
NVIDIA driver 的 time-slicing 机制是:所有正在运行的 CUDA 进程(不管来自哪个 Pod、request 多少)在物理 GPU 上 平等分享时间片(round-robin context switching)。
request 值不影响比例:
Pod A request 8 → 占用 8 quota,但时间片不因此多得。
Pod B request 16 → 占用 16 quota,时间片 还是平等。

配置过程
1、创建配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: time-slicing-config
  namespace: gpu-operator
data:
  default: |                     # 集群默认:不共享(独占模式)
    version: v1
    flags:
      migStrategy: none
    sharing: {}                  # 空 = 无 sharing
  rtx-5090-sharing: |-
		version: v1
    flags:
      migStrategy: none          # 5090 不支援 MIG,一定 none
    sharing:
      timeSlicing:
        renameByDefault: true    # 建議開啟,資源名稱會變成 nvidia.com/gpu.shared
        failRequestsGreaterThanOne: false
        resources:
          - name: nvidia.com/gpu
            replicas: 8

说明:

  • rtx-5090-sharing这里相当把每个GPU配置8个副本,如果一台8卡的5090,那就能切分出64个副本
  • failRequestsGreaterThanOne: false(默认值):允许 pod 请求任意多个 nvidia.com/gpu(比如 limits: nvidia.com/gpu: 10、20、甚至 100)。但实际效果:即使请求了 10 个,驱动层仍然只按活跃 CUDA 进程数平分时间,不会给你更多计算时间或比例(所有请求者平分)。

2、给节点打标签,指定配置
kubectl label node gpu-prod-01 nvidia.com/device-plugin.config=rtx-5090-sharing --overwrite

3、告诉gpu-operator用这个配置

方法一:直接 patch ClusterPolicy(推薦,幾乎所有新版都這樣做)
kubectl -n gpu-operator patch clusterpolicy/cluster-policy --type merge -p '{
  "spec": {
    "devicePlugin": {
      "config": {
        "name": "time-slicing-config"
      }
    }
  }
}'

方法二:如果是用 Helm 安裝/升級時就指定
helm upgrade gpu-operator nvidia/gpu-operator -n gpu-operator \
  --set devicePlugin.config.name=time-slicing-config

4、验证

驗證資源是否出現
共享的那台機器應該看到很多 nvidia.com/gpu.shared(或 nvidia.com/gpu 看 renameByDefault)
kubectl describe node gpu-prod-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值