Skip to content

算力池化架构

算力池化核心概念

算力池化(Compute Pooling)将分散的 GPU 资源统一纳管,形成共享算力池,按需分配给不同用户和任务。

传统模式(烟囱式):
  项目A → 专属 GPU 服务器(利用率 30%)
  项目B → 专属 GPU 服务器(利用率 20%)
  项目C → 专属 GPU 服务器(利用率 50%)
  平均利用率:33%,大量资源浪费

池化模式:
  项目A + 项目B + 项目C → 共享 GPU 池
  动态分配,平均利用率:70-80%
  节省硬件成本 50%+

技术架构

整体架构

┌─────────────────────────────────────────────────────────┐
│                    用户接入层                             │
│         Web 控制台 / REST API / SDK / CLI               │
├─────────────────────────────────────────────────────────┤
│                    调度与编排层                           │
│    资源调度器(Scheduler)| 队列管理 | 优先级控制          │
├──────────────┬──────────────┬───────────────────────────┤
│  训练调度     │  推理调度     │  Notebook 调度            │
│  (SLURM/K8s) │  (K8s+KServe)│  (JupyterHub)            │
├──────────────┴──────────────┴───────────────────────────┤
│                    资源抽象层                             │
│    GPU 虚拟化(MIG/vGPU)| 网络虚拟化 | 存储虚拟化        │
├─────────────────────────────────────────────────────────┤
│                    物理资源层                             │
│    GPU 服务器集群 | InfiniBand 网络 | 并行存储            │
└─────────────────────────────────────────────────────────┘

GPU 虚拟化(MIG)

NVIDIA MIG(Multi-Instance GPU)将单张 A100/H100 切分为多个独立实例:

A100 80GB MIG 切分方案:

方案1:7 个 1g.10gb 实例
  每实例:1/7 SM,10GB 显存
  适用:轻量推理、开发调试

方案2:3 个 2g.20gb 实例
  每实例:2/7 SM,20GB 显存
  适用:中等规模推理

方案3:1 个 3g.40gb + 1 个 4g.40gb
  适用:混合负载

方案4:1 个 7g.80gb(不切分)
  适用:大模型训练/推理
bash
# 配置 MIG 模式
nvidia-smi -i 0 -mig 1  # 开启 GPU 0 的 MIG 模式

# 创建 MIG 实例(7 个 1g.10gb)
nvidia-smi mig -cgi 1g.10gb,1g.10gb,1g.10gb,1g.10gb,1g.10gb,1g.10gb,1g.10gb -C

# 查看 MIG 实例
nvidia-smi -L

# 在 K8s 中使用 MIG 实例
# resources:
#   limits:
#     nvidia.com/mig-1g.10gb: 1

Kubernetes GPU 调度

GPU 资源请求

yaml
# Pod 申请 GPU 资源
apiVersion: v1
kind: Pod
metadata:
  name: gpu-training-job
spec:
  containers:
  - name: trainer
    image: pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime
    resources:
      limits:
        nvidia.com/gpu: 4          # 申请 4 张 GPU
        memory: "64Gi"
        cpu: "16"
    env:
    - name: NCCL_DEBUG
      value: "INFO"
    command: ["python", "train.py"]
  
  # GPU 节点亲和性
  nodeSelector:
    gpu-type: "a100"
  
  # 容忍 GPU 节点污点
  tolerations:
  - key: "nvidia.com/gpu"
    operator: "Exists"
    effect: "NoSchedule"

优先级与抢占

yaml
# 定义优先级类
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority-training
value: 1000
globalDefault: false
description: "高优先级训练任务"
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: low-priority-batch
value: 100
description: "低优先级批处理任务"
---
# 高优先级任务可抢占低优先级任务的 GPU
apiVersion: v1
kind: Pod
metadata:
  name: urgent-training
spec:
  priorityClassName: high-priority-training
  containers:
  - name: trainer
    resources:
      limits:
        nvidia.com/gpu: 8

Volcano 批处理调度

Volcano 是专为 AI 训练设计的 K8s 批处理调度器:

yaml
# Volcano Job:分布式训练
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
  name: pytorch-dist-training
spec:
  minAvailable: 8    # 最少需要 8 个 Pod 才启动(Gang Scheduling)
  schedulerName: volcano
  
  plugins:
    ssh: []          # 自动配置 SSH 免密登录
    svc: []          # 自动创建 Service
  
  tasks:
  - replicas: 8
    name: worker
    template:
      spec:
        containers:
        - name: pytorch
          image: pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime
          resources:
            limits:
              nvidia.com/gpu: 8
          command:
          - sh
          - -c
          - |
            torchrun \
              --nproc_per_node=8 \
              --nnodes=8 \
              --node_rank=${VK_TASK_INDEX} \
              --master_addr=${VC_WORKER_0_HOST} \
              --master_port=29500 \
              train.py

弹性伸缩

训练任务弹性

python
# 使用 PyTorch Elastic(torchelastic)支持弹性训练
# 节点可以动态加入/退出,训练不中断

# 启动命令(支持 4-8 个节点弹性)
# torchrun \
#   --nnodes=4:8 \          # 最少 4 节点,最多 8 节点
#   --nproc_per_node=8 \
#   --rdzv_backend=c10d \
#   --rdzv_endpoint=master:29500 \
#   train.py

推理服务弹性

yaml
# KServe InferenceService:自动扩缩容
apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: bert-classifier
spec:
  predictor:
    minReplicas: 1
    maxReplicas: 10
    scaleTarget: 5        # 每个副本处理 5 个并发请求
    scaleMetric: concurrency
    
    pytorch:
      storageUri: "pvc://models/bert-classifier"
      resources:
        limits:
          nvidia.com/gpu: 1
          memory: "8Gi"
        requests:
          nvidia.com/gpu: 1
          memory: "8Gi"

资源利用率优化

优化策略:

1. 时间复用(Time Sharing)
   - 推理服务:白天高峰,晚上低谷
   - 训练任务:晚上/周末批量运行
   - 通过调度策略实现错峰使用

2. 空间复用(Space Sharing)
   - MIG 切分:大 GPU 服务多个小任务
   - vGPU:多个推理服务共享一张 GPU

3. 预测性扩容
   - 基于历史数据预测负载
   - 提前扩容,避免冷启动延迟

4. Spot 实例
   - 利用空闲 GPU 资源
   - 价格低(正常价格 30%)
   - 可能被抢占(需要检查点支持)

褚成志的云与计算笔记