GPU 调度策略指的是在系统中如何分配、管理和协调 GPU 资源给多个任务或进程使用的一套规则与机制。它的目标是:
在有限的 GPU 资源下,提高利用率、降低延迟、保证公平性和满足不同任务的需求。
下面从概念、常见策略、典型场景三个层面来解释。
一、为什么需要 GPU 调度策略?
GPU 和 CPU 不同:
- GPU 是高度并行的计算设备
- 通常多个任务共享同一块 GPU
- 深度学习、推理、图形渲染等任务对 GPU 的需求差异很大
如果没有调度策略,容易出现:
- 某个任务占满 GPU,其他任务饿死
- GPU 利用率低
- 任务排队时间过长
- 显存被耗尽导致 OOM
二、GPU 调度策略的核心维度
1. 时间调度(Time Slicing)
按时间片轮流使用 GPU:
- 类似 CPU 的时间片轮转
- GPU 上下文切换代价较高(不如 CPU 轻量)
✅ 适合:
❌ 缺点:
2. 空间调度(Spatial Sharing)
多个任务同时运行在同一 GPU 上:
✅ 常见方式:
- CUDA MPS(Multi-Process Service)
- 多进程直接并发
✅ 适合:
3. 显存调度(Memory-aware Scheduling)
根据显存需求进行调度:
✅ 关键问题:
✅ 常见策略:
4. 优先级调度(Priority Scheduling)
根据任务优先级决定执行顺序:
- 高优先级任务优先获得 GPU
- 低优先级任务被抢占或延迟
✅ 典型场景:
5. 抢占与回收(Preemption)
强制中断低优先级任务:
⚠️ GPU 原生对抢占支持有限,通常需要:
- 框架层支持
- 检查点(checkpoint)
- 任务可中断设计
三、常见的 GPU 调度策略类型
| 调度策略 | 说明 | 适用场景 |
|---|
| FIFO | 先到先服务 | 简单任务队列 |
| 公平调度 | 每个任务平均分配资源 | 多用户共享 |
| 优先级调度 | 按优先级分配 | 在线/离线混合 |
| 装箱调度 | 尽量填满 GPU | 提高利用率 |
| Gang 调度 | 多 GPU 任务一次性调度 | 大模型训练 |
| 弹性调度 | 动态增减 GPU 使用 | 云环境 |
四、典型系统中的 GPU 调度策略
1. Kubernetes + GPU
- 使用 Device Plugin 管理 GPU
- 调度策略由 kube-scheduler 控制
- 常见扩展:
- GPU 共享(vGPU)
- 显存调度
- 拓扑感知调度(NVLink)
✅ 插件示例:
- NVIDIA GPU Operator
- Volcano(批调度)
- HAMi(GPU 虚拟化)
2. 深度学习框架
- PyTorch / TensorFlow 本身不调度 GPU
- 但会影响调度效果:
- DataLoader
- CUDA stream
- 显存缓存机制
3. NVIDIA 提供的能力
- CUDA Stream:任务并发
- CUDA MPS:多进程共享 GPU
- Multi-Instance GPU(MIG):硬件级隔离(A100/H100)
五、总结一句话
GPU 调度策略就是:
决定“谁、在什么时间、以什么方式、使用多少 GPU 资源”的规则体系。
如果你愿意,我可以:
- 用图解方式讲 GPU 调度
- 对比 K8s vs YARN vs Slurm 的调度策略
- 讲 大模型训练中的 GPU 调度问题
- 或结合你具体场景(推理 / 训练 / 云 / 本地)深入说明