GPU虚拟化

背景

随着AI应用的日益普及,对GPU的需求也随之激增。GPU作为模型训练与推理任务的核心组件,其重要性不言而喻。然而,GPU成本高昂,如何在云原生环境下最大化其利用率,已成为业界关注的焦点。在实际应用中,常出现以下情况:对于小型工作负载,单个GPU可能造成资源浪费;而对于大型工作负载,单个GPU的算力又可能未被充分挖掘。

为应对这一挑战,Volcano通过提供强大的虚拟GPU (vGPU)调度能力,实现了物理GPU在多个容器和作业间的有效共享。这不仅能显著提升GPU利用率、降低运营成本,也为各类AI/ML工作负载带来了更灵活的资源调度方案。

Volcano致力于简化GPU虚拟化的复杂度,使用户能便捷地运用这些高级共享机制。用户只需在Pod或作业的配置中声明所需的GPU资源及期望的切分方式,Volcano便能自动完成底层的资源编排工作。

Volcano主要支持以下两种GPU共享模式,用以实现vGPU调度并满足不同的硬件能力与性能需求:


1. HAMI-core(基于软件的vGPU)

描述: 通过VCUDA (一种CUDA API劫持技术) 对GPU核心与显存的使用进行限制,从而实现软件层面的虚拟GPU切片。

使用场景: 适用于需要细粒度GPU共享的场景,兼容所有类型的GPU。

2. Dynamic MIG(硬件级GPU切片)

描述: 采用NVIDIA的MIG (Multi-Instance GPU)技术,可将单个物理GPU分割为多个具备硬件级性能保障的隔离实例。

使用场景: 尤其适用于对性能敏感的工作负载,要求GPU支持MIG特性(如A100、H100系列)。

Dynamic MIG的设计文档请参考:dynamic-mig

GPU共享模式属于节点级别的配置。Volcano支持异构集群,即集群中可同时包含采用HAMI-core模式的节点和采用Dynamic MIG模式的节点。更多配置及详情,请参阅volcano-vgpu-device-plugin


安装

若需启用vGPU调度功能,请根据所选模式配置以下组件:

通用要求

环境依赖

  • NVIDIA驱动 > 440
  • nvidia-docker > 2.0
  • Docker已配置nvidia为默认运行时
  • Kubernetes >= 1.16
  • Volcano >= 1.9

  • 安装Volcano

  • 安装设备插件

说明:vgpu设备插件的YAML文件中亦包含节点GPU模式MIG几何形状的相关配置。详情请参阅vgpu设备插件配置文档

  • 验证部署: 请确保节点的可分配资源(Allocatable Resources)中包含以下信息:

  volcano.sh/vgpu-memory: "89424"
  volcano.sh/vgpu-number: "8"
  • 更新调度器配置

kind: ConfigMap
apiVersion: v1
metadata:
  name: volcano-scheduler-configmap
  namespace: volcano-system
data:
  volcano-scheduler.conf: |
    actions: "enqueue, allocate, backfill"
    tiers:
    - plugins:
      - name: predicates
      - name: deviceshare
        arguments:
          deviceshare.VGPUEnable: true   # 启用vgpu插件
          deviceshare.SchedulePolicy: binpack  # 调度策略:binpack / spread

可通过以下命令检查:

kubectl get node {node-name} -o yaml

HAMI-core使用方法

Pod配置示例


metadata:
  name: hami-pod
  annotations:
    volcano.sh/vgpu-mode: "hami-core"
spec:
  schedulerName: volcano
  containers:
  - name: cuda-container
    image: nvidia/cuda:9.0-devel
    resources:
      limits:
        volcano.sh/vgpu-number: 1    # 请求1张GPU卡
        volcano.sh/vgpu-cores: 50    # (可选)每个vGPU使用50%核心
        volcano.sh/vgpu-memory: 3000 # (可选)每个vGPU使用3G显存

Dynamic MIG使用方法

  • 启用MIG模式

若需启用MIG (Multi-Instance GPU)模式,请在目标GPU节点上执行以下命令:

sudo nvidia-smi -mig 1
  • MIG实例规格配置(可选)

volcano-vgpu-device-plugin会自动生成一套初始MIG配置,并存储于kube-system命名空间下的volcano-vgpu-device-config ConfigMap中。用户可按需自定义此配置。更多详情请参阅vgpu设备插件YAML文件

  • 带MIG注解的Pod配置示例

metadata:
  name: mig-pod
  annotations:
    volcano.sh/vgpu-mode: "mig"
spec:
  schedulerName: volcano
  containers:
  - name: cuda-container
    image: nvidia/cuda:9.0-devel
    resources:
      limits:
        volcano.sh/vgpu-number: 1
        volcano.sh/vgpu-memory: 3000

注意:实际分配的显存大小取决于最匹配的MIG实例规格(例如:请求3GB显存,可能会分配到规格为5GB的MIG实例)。


调度器模式选择

  • 显式指定模式

    • 通过Pod注解volcano.sh/vgpu-mode来强制指定HAMI-core或MIG模式。
    • 若未指定该注解,调度器将依据资源匹配度及预设策略自动选择合适的模式。
  • 调度策略影响

    • 调度策略(如binpackspread)会影响vGPU Pod在节点间的分布。

总结表

模式 隔离级别 是否依赖MIG GPU 需注解指定模式 核心/显存控制方式 推荐应用场景
HAMI-core 软件 (VCUDA) 用户自定义 (核心/显存) 通用型工作负载
Dynamic MIG 硬件 (MIG) MIG实例规格决定 对性能敏感的工作负载

监控

  • 调度器监控指标

    curl http://<volcano-scheduler-ip>:8080/metrics
    
  • 设备插件监控指标

    curl http://<plugin-pod-ip>:9394/metrics
    

监控指标包括GPU利用率、各Pod的显存使用量及限制等。


问题和贡献