欢迎光临
我们一直在努力

如何利用 Kubernetes 的 GPU Share 机制让多个小模型共用一块 80G 显存而不互相干扰?

在处理大规模深度学习部署时,经常遇到这样的问题:一块拥有 80GB 显存的高端 GPU(如 NVIDIA A100/H100)运行着许多只需要 5GB 或 10GB 显存的小模型。传统的 GPU 调度机制要么独占整块 GPU,造成资源浪费,要么使用 time-slicing 机制,但无法隔离显存(VRAM),容易导致互相干扰甚至 OOM(显存溢出)。

解决这个问题的最佳方案是利用 NVIDIA 的 Multi-Instance GPU (MIG) 技术,结合 Kubernetes 的 Device Plugin,实现硬件级别的 VRAM 和计算资源隔离。

1. 什么是 NVIDIA MIG?

MIG 允许您将单个 A100/H100 GPU 物理划分为多达七个完全独立且安全的 GPU 实例。每个实例都有独立的显存、缓存和计算核心,它们在硬件层面是隔离的,完美解决了资源竞争和相互干扰的问题。

2. 环境与准备工作

要实现 K8s 中的 MIG 共享,需要满足以下条件:

  1. 硬件: NVIDIA A100 或 H100 系列 GPU(80G 显存卡通常属于此类)。
  2. 驱动: NVIDIA 驱动 450.80.02 及以上。
  3. 软件: Kubernetes 集群、NVIDIA Container Toolkit 和 Kubernetes Device Plugin(推荐 v1.8.0+)。

3. 配置 GPU 划分 (MIG Partitioning)

首先,在宿主机上,我们使用 nvidia-smi 命令来创建 MIG 实例。假设我们有一块 80GB 的 A100,计划将其划分为 7 个 10GB 的实例。

步骤 3.1:进入 MIG 模式并创建实例

注意:操作前请确认 GPU ID (通常为 0)。

# 1. 启用 MIG 模式
sudo nvidia-smi -i 0 -mig 1

# 2. 创建 GIMs (GPU Instance Profiles) 和 CIMs (Compute Instance Profiles)。
# 示例:创建一个 7x (2g.10gb) 的配置
# 这是一个常见的配置,代表 2个计算单元和 10GB 显存
# 配置编号可能因驱动版本而异,这里使用 profile ID 19 作为示例
# 实际操作中,需要查询可用的配置文件

sudo nvidia-smi mig -i 0 -cgi 19,19,19,19,19,19,19 -CIGM 1

# 3. 验证划分结果
nvidia-smi -L
# 预期输出将列出 7 个独立的 MIG 设备,例如:
# GPU 0: A100-SXM4-80GB (UUID: GPU-XXXXX)
#   MIG 1g.5gb Instance 0 (UUID: MIG-YYYY) 
#   ... 

一旦配置完成,Kubernetes Device Plugin 会自动识别这些新的、可调度的资源,例如 nvidia.com/mig-2g.10gb

4. 在 Kubernetes 中部署 Device Plugin

确保您的 Device Plugin 配置为支持 MIG。在 Kubernetes 中,Device Plugin 通常以 DaemonSet 形式运行。

示例:Device Plugin 部署(标准配置即可自动发现 MIG 资源)

# 部署最新的 NVIDIA Device Plugin
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.13.0/deployments/static/device-plugin.yml

# 验证节点上的资源
kubectl describe node <your-node-name> | grep 'nvidia.com/mig-'
# 预期输出将显示如:
# nvidia.com/mig-2g.10gb: 7

5. 调度和运行多模型工作负载

现在,每个模型 Pod 都可以请求一个特定的 MIG 实例,从而获得完全隔离的 10GB 显存。即使其中一个模型发生显存溢出,也不会影响到其他 Pods。

示例:请求一个 10GB 的 MIG 实例

我们部署两个 Pods,分别请求一个 nvidia.com/mig-2g.10gb 资源。

apiVersion: v1
kind: Pod
metadata:
  name: small-model-runner-1
spec:
  containers:
  - name: model-container-1
    image: nvcr.io/nvidia/cuda:11.7.1-base-ubuntu20.04
    command: ["sleep", "3600"]
    resources:
      limits:
        # 关键:请求一个 MIG 实例
        nvidia.com/mig-2g.10gb: 1
  # 推荐使用 nodeSelector 确保调度到支持 MIG 的节点
  nodeSelector:
    nvidia.com/mig.capable: "true"
---
apiVersion: v1
kind: Pod
metadata:
  name: small-model-runner-2
spec:
  containers:
  - name: model-container-2
    image: nvcr.io/nvidia/cuda:11.7.1-base-ubuntu20.04
    command: ["sleep", "3600"]
    resources:
      limits:
        # 关键:请求另一个 MIG 实例
        nvidia.com/mig-2g.10gb: 1
  nodeSelector:
    nvidia.com/mig.capable: "true"

通过上述配置,K8s 调度器会将这两个 Pod 分配到同一个物理 GPU 上的两个独立的 MIG 实例上,从而实现了 80GB 显存的安全、高效共享,同时保证了每个模型的 VRAM 隔离。

【本站文章皆为原创,未经允许不得转载】:汤不热吧 » 如何利用 Kubernetes 的 GPU Share 机制让多个小模型共用一块 80G 显存而不互相干扰?
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址