算力池化架构
算力池化核心概念
算力池化(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: 1Kubernetes 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: 8Volcano 批处理调度
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%)
- 可能被抢占(需要检查点支持)