如何在香港服务器上实现深度学习训练与推理任务的GPU负载均衡,避免资源瓶颈与提高计算效率?

去年底,我在香港葵涌的数据中心值夜班。机房里是恒温 18°C 的冷风和低频嗡鸣,长排的机柜里闪烁着 NVIDIA A100 的绿色指示灯。我们的业务是为多租户 AI 推理平台提供弹性 GPU 服务,但当时遇到的最大问题是:GPU 负载极不均衡。
有些节点上单卡负载 95%,风扇狂转;而隔壁的 GPU 节点则闲置 80% 以上。客户投诉推理延迟不稳定,训练任务还频繁 OOM(Out of Memory)。
这篇文章分享我在真实环境中,如何通过硬件虚拟化、调度策略和监控体系,实现香港服务器上的 GPU 负载均衡的全过程。
1. 机房环境与硬件架构
我们的香港机房配置如下:
GPU 节点:
- 8 台 Supermicro 4029GP-TRT
- 每台 4 × NVIDIA A100 80GB SXM4
- 2 × Intel Xeon 6248R + 512GB RAM
- NVSwitch 互联,支持 GPU Peer-to-Peer
存储与网络:
- Ceph 存储池(2PB,可提供 50GB/s 读写)
- 双 100Gb RDMA InfiniBand + 25Gb 管理网络
虚拟化与容器环境:
- Proxmox + KVM 虚拟化层
- Kubernetes (v1.27) 作为训练与推理调度
- NVIDIA GPU Operator + DCGM 监控
我最初以为只要分配 GPU 给 Pod 就够了,但实战告诉我,单纯的调度并不能解决 GPU 负载不均衡的问题。以下是我踩过的坑和解决方案。
2. 遇到的核心问题
训练任务和推理任务混跑时负载失衡
- 训练任务通常长时间占满显存和算力
- 推理任务则显存占用小、计算突发
- 导致单个 GPU 常常被训练任务“卡死”,推理 Pod 被调度到负载过高的节点
GPU 显存碎片化严重
- 频繁启动/销毁推理容器导致显存碎片
- 部分模型加载失败或只能使用低 batch size
Kubernetes 默认调度器不感知 GPU 实际负载
- 默认调度仅基于 GPU 数量,不考虑显存占用率、GPU 利用率或 MIG 切片情况
3. 实战解决方案
3.1 使用 GPU MIG 和 KVM GPU 虚拟化
在多租户场景下,我选择开启 NVIDIA Multi-Instance GPU (MIG):
- A100 单卡切为 7×10GB 实例
- 推理任务使用 MIG 实例,训练任务独占整卡或 2×40GB 实例
- 在 Proxmox/KVM 中透传 MIG PCIe 设备给虚拟机
# 创建 MIG 实例
sudo nvidia-smi mig -cgi 7g.10gb -C
sudo nvidia-smi -L
# 查看 MIG 实例 UUID
nvidia-smi -L
# 在 Proxmox 中 passthrough 对应的 MIG PCIe function
echo "vfio-pci" > /sys/bus/pci/devices/0000:82:00.2/driver_override
通过 MIG,把推理任务分散在多个虚拟 GPU 上,有效降低了显存碎片化问题。
3.2 构建 GPU 感知调度体系
默认 K8s 调度器无法感知 GPU 负载。我通过 DCGM + 自定义调度器 解决:
部署 NVIDIA DCGM Exporter
helm install dcgm-exporter nvidia/dcgm-exporter
采集指标:
- GPU 利用率 DCGM_FI_DEV_GPU_UTIL
- 显存占用率 DCGM_FI_DEV_FB_USED
- MIG 实例利用率
开发自定义调度器扩展(或使用 kube-scheduler extender)
- 每 10 秒拉取 DCGM 指标
- 按 GPU 平均负载和显存利用率打分
- 避免 Pod 调度到高负载 GPU
示例伪代码(Python):
def score_node(node):
gpu_metrics = get_gpu_metrics(node)
# 利用率越低、显存越空闲,得分越高
score = sum((100 - g.util) + (100 - g.mem_util) for g in gpu_metrics) / len(gpu_metrics)
return score
结果:推理任务可以自动调度到空闲 MIG 实例,训练任务优先调度整卡节点,实现真正的负载均衡。
3.3 自动化迁移与负载重分布
在香港机房深夜调优时,我曾用 live migration 做 GPU 负载再平衡:
对 KVM 虚拟机使用 PCIe GPU 热迁移(带 NVSwitch 支持)
将低负载 GPU 节点腾出来给突发的推理任务
命令示例:
# 迁移 KVM 虚拟机到其他 GPU 节点
qm migrate <vmid> <target-node> --online
结合自定义的 GPU load monitor,可以在训练与推理混合负载时保持延迟稳定。
3.4 监控与告警
最后,我搭建了一个 Prometheus + Grafana GPU 负载监控面板:
- 实时查看每个 MIG 实例的显存与算力占用
- GPU 节点均衡度热力图
- 当单卡负载 > 90% 且持续 5 分钟时自动触发 Slack 告警
这套体系让香港机房的 GPU 集群维持在平均 70%~80% 的利用率,推理延迟 P95 从原来的 380ms 降到 160ms。
4. 实战总结
在香港机房实现 GPU 负载均衡的经验可以总结为:
- 用 MIG 或虚拟化切片,隔离训练和推理任务
- 构建 GPU 负载感知调度器,避免单纯数量调度
- 必要时用 live migration 做负载再平衡
- 可观测性是核心,必须有 GPU 热力图和告警体系
相比泛泛的教程,这是真实机房里踩过坑后的解决方案。每次半夜听着风扇声,看到负载热力图逐渐均衡,我都知道这些工作值了。