上一篇 下一篇 分享链接 返回 返回顶部

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

发布人:Minchunlin 发布时间:2025-08-04 21:28 阅读量:683


去年底,我在香港葵涌的数据中心值夜班。机房里是恒温 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 热力图和告警体系

相比泛泛的教程,这是真实机房里踩过坑后的解决方案。每次半夜听着风扇声,看到负载热力图逐渐均衡,我都知道这些工作值了。

目录结构
全文