使用 HAMi

通过 Kueue 使用 HAMi vGPU 资源

此页面演示了如何将 Kueue 与 HAMi(异构 AI 计算虚拟化中间件)结合使用, 以进行 vGPU 资源管理的工作负载运行。

当通过 HAMi 使用 vGPU 资源时,Pod 会请求每个 vGPU 的资源(nvidia.com/gpumemnvidia.com/gpucores)以及 vGPU 的数量(nvidia.com/gpu)。对于配额管理,你需要跟踪所有 vGPU 实例的总资源消耗。

下面我们将演示如何在 Kueue 中使用用于配额管理的资源转换来支持这一点。

本指南适用于对 Kueue 有基本了解的批处理用户。 有关更多信息,请参阅 Kueue 概述

在你开始之前

  1. Deployment 集成默认启用。

  2. 请按照使用自定义配置的安装说明配置带有 ResourceTransformation 的 Kueue。

  3. 确保你的集群已安装 HAMi 并拥有可用的 vGPU 资源。 HAMi 通过诸如 nvidia.com/gpunvidia.com/gpucoresnvidia.com/gpumem 等资源提供 vGPU 资源管理。

将 HAMi 与 Kueue 结合使用

在 Kueue 上运行请求 vGPU 资源的 Pod 时,请考虑以下方面:

a. 配置 ResourceTransformation

配置 Kueue 使用 ResourceTransformation 自动计算总的 vGPU 资源:

apiVersion: config.kueue.x-k8s.io/v1beta2
kind: Configuration
resources:
  transformations:
  - input: nvidia.com/gpucores
    strategy: Replace
    multiplyBy: nvidia.com/gpu
    outputs:
      nvidia.com/total-gpucores: "1"
  - input: nvidia.com/gpumem
    strategy: Replace
    multiplyBy: nvidia.com/gpu
    outputs:
      nvidia.com/total-gpumem: "1"

此配置告诉 Kueue 将每个 vGPU 资源值乘以 vGPU 实例的数量。 例如,如果一个 Pod 请求 nvidia.com/gpu: 2nvidia.com/gpumem: 1024, Kueue 将计算 nvidia.com/total-gpumem: 2048(1024 × 2)。

b. 配置 ClusterQueue

配置你的 ClusterQueue 以跟踪 vGPU 实例计数和总资源:

apiVersion: kueue.x-k8s.io/v1beta1
kind: ClusterQueue
metadata:
  name: vgpu-cluster-queue
spec:
  resourceGroups:
  - coveredResources: ["nvidia.com/gpu", "nvidia.com/total-gpucores", "nvidia.com/total-gpumem"]
    flavors:
    - name: default-flavor
      resources:
      - name: nvidia.com/gpu
        nominalQuota: 50
      - name: nvidia.com/total-gpucores
        nominalQuota: 1000
      - name: nvidia.com/total-gpumem
        nominalQuota: 10240

c. 队列选择

目标 本地队列 应当在 Pod 配置的 metadata.labels 部分指定。

metadata:
  labels:
    kueue.x-k8s.io/queue-name: vgpu-queue

d. 配置资源需求

工作负载的资源需求可以在 spec.containers 部分配置:

resources:
  limits:
    nvidia.com/gpu: "2"         # vGPU 数量
    nvidia.com/gpucores: "20"   # 每个 vGPU 的核心数
    nvidia.com/gpumem: "1024"   # 每个 vGPU 的内存(MiB)

Kueue 会自动将这些转换为总资源:

  • nvidia.com/total-gpucores: 40 (20 核心 × 2 vGPU)
  • nvidia.com/total-gpumem: 2048 (1024 MiB × 2 vGPU)

示例

这是一个示例:

apiVersion: kueue.x-k8s.io/v1beta2
kind: ResourceFlavor
metadata:
  name: hami-flavor
spec:
  nodeLabels:
    gpu: "on"
---
apiVersion: kueue.x-k8s.io/v1beta2
kind: ClusterQueue
metadata:
  name: hami-queue
spec:
  namespaceSelector: {}
  resourceGroups:
  - coveredResources:
    - nvidia.com/gpu
    - nvidia.com/total-gpucores
    - nvidia.com/total-gpumem
    flavors:
    - name: hami-flavor
      resources:
      - name: nvidia.com/gpu
        nominalQuota: 20
      - name: nvidia.com/total-gpucores
        nominalQuota: 600
      - name: nvidia.com/total-gpumem
        nominalQuota: 20480
---
apiVersion: v1
kind: Namespace
metadata:
  name: kueue-test
---
apiVersion: kueue.x-k8s.io/v1beta2
kind: LocalQueue
metadata:
  name: user-queue
  namespace: kueue-test
spec:
  clusterQueue: "hami-queue"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gpu-burn
  namespace: kueue-test
  labels:
    kueue.x-k8s.io/queue-name: user-queue
spec:
  replicas: 1
  selector:
    matchLabels:
      app-name: gpu-burn
  template:
    metadata:
      labels:
        app-name: gpu-burn
    spec:
      containers:
      - args:
        - while :; do /app/gpu_burn 300 || true; sleep 300; done
        command:
        - /bin/sh
        - -lc
        image: oguzpastirmaci/gpu-burn:latest
        imagePullPolicy: IfNotPresent
        name: main
        resources:
          limits:
            nvidia.com/gpu: "2"        # requesting 2 vGPU instances
            nvidia.com/gpucores: "30"  # 30 cores per vGPU
            nvidia.com/gpumem: "1024"  # 1024 MiB per vGPU

你可以使用以下命令创建 vGPU Deployment:

kubectl create -f https://kueue.sigs.k8s.io/examples/serving-workloads/sample-hami.yaml

要检查 ClusterQueue 中的资源使用情况,查看 status.flavorsReservation 字段:

kubectl get clusterqueue hami-queue -o yaml

status.flavorsReservation 显示了 nvidia.com/total-gpucoresnvidia.com/total-gpumem 的当前资源消耗:

status:
  flavorsReservation:
  - name: hami-flavor
    resources:
    - name: nvidia.com/total-gpucores
      total: "60"  # 当前使用情况 (30 cores × 2 vGPUs)
    - name: nvidia.com/total-gpumem
      total: "2048"  # 当前使用情况 (1024 MiB × 2 vGPUs)