如何定义 vGPU(Hami) 成本模型

目录

前提条件

在 GPU 集群中:

  • 已安装 Alauda Build of Hami
  • 已安装成本管理智能体

关于 Alauda Build of Hami

异构 AI 计算虚拟化中间件(HAMi),前称 k8s-vGPU-scheduler,是一个用于管理 k8s 集群中异构 AI 计算设备的“一体化”chart。它可以提供在任务间共享异构 AI 设备的能力。

Note
因为 Alauda Build of Hami 的发版周期与灵雀云容器平台不同,所以 Alauda Build of Hami 的文档现在作为独立的文档站点托管在

操作步骤

创建 PrometheusRule 以生成所需指标

在 Hami 集群中创建一个 PrometheusRule。

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  labels:
    prometheus: kube-prometheus
  name: hami-gpu-labels
  namespace: kube-system
spec:
  groups:
    - name: hami-gpu-labels.rules
      rules:
        - expr: |
            min by (podnamespace, deviceuuid, label_modelName, label_device) (
              vGPUCorePercentage
              * on (deviceuuid) group_left(label_modelName, label_device) (
                label_replace(
                  label_replace(
                    label_replace(
                      DCGM_FI_DEV_SM_CLOCK,
                      "deviceuuid", "$1", "UUID", "(.*)"
                    ),
                    "label_modelName", "$1", "modelName", "(.*)"
                  ),
                  "label_device", "$1", "device", "([a-zA-Z]+)[0-9]+$"
                )
              )
            )
          record: vgpu_core_labels

添加采集配置(成本管理智能体)

在运行成本管理智能体的 Hami 集群中创建一些 ConfigMap 来声明需要采集的内容。

注意:项目配额的 configmap 仅在 hami 2.7+ 版本支持。

apiVersion: v1
data:
  config: >
    - kind: vGPU
      category: vGPUCore
      item: vGPUCoreQuota
      period: Hourly
      labels:
        query: "vgpu_core_labels{}"
        mappers:
          name: deviceuuid
          namespace: podnamespace
          cluster: ""
          project: ""
      usage:
        query: sum by (deviceuuid,podnamespace) (avg_over_time(vGPUCorePercentage{}[5m]))
        step: 5m
        mappers:
          name: deviceuuid
          namespace: podnamespace
          cluster: ""
          project: ""
    - kind: vGPU
      category: vGPUMemory
      item: vGPURamBytesQuota
      period: Hourly
      labels:
        query: "vgpu_core_labels{}"
        mappers:
          name: deviceuuid
          namespace: podnamespace
          cluster: ""
          project: ""
      usage:
        query: sum by (deviceuuid,podnamespace) (avg_over_time(vGPU_device_memory_limit_in_bytes{}[5m]))
        step: 5m
        mappers:
          name: deviceuuid
          namespace: podnamespace
          cluster: ""
          project: ""
    - kind: vGPU
      category: vGPUCore
      item: vGPUCoreUsed
      period: Hourly
      labels:
        query: "vgpu_core_labels{}"
        mappers:
          name: deviceuuid
          namespace: podnamespace
          cluster: ""
          project: ""
      usage:
        query: sum by (deviceuuid,podnamespace) (avg_over_time(Device_utilization_desc_of_container{}[5m]))
        step: 5m
        mappers:
          name: deviceuuid
          namespace: podnamespace
          cluster: ""
          project: ""
    - kind: vGPU
      category: vGPUMemory
      item: vGPURamBytesUsed
      period: Hourly
      labels:
        query: "vgpu_core_labels{}"
        mappers:
          name: deviceuuid
          namespace: podnamespace
          cluster: ""
          project: ""
      usage:
        query: sum by (deviceuuid,podnamespace) (avg_over_time(vGPU_device_memory_usage_in_bytes{}[5m]))
        step: 5m
        mappers:
          name: deviceuuid
          namespace: podnamespace
          cluster: ""
          project: ""
kind: ConfigMap
metadata:
  labels:
    cpaas.io/slark.collection.config: "true"
  name: slark-agent-vgpu-namespace-config
  namespace: cpaas-system
---
# 注意:以下 configmap 仅在 hami 2.7+ 版本支持
apiVersion: v1
data:
  config: >
    - kind: Project
      category: vGPUCore
      item: vGPUCoresProjectQuota
      period: Hourly
      usage:
        query: avg by (project, cluster) (avg_over_time(cpaas_project_resourcequota{resource="limits.nvidia.com/gpucores", type="project-hard"}[5m]))
        step: 5m
        mappers:
          name: project
          namespace: ""
          cluster: cluster
          project: project
    - kind: Project
      category: vGPUMemory
      item: vGPURamBytesProjectQuota
      period: Hourly
      usage:
        query: avg by (project, cluster) (avg_over_time(cpaas_project_resourcequota{resource="limits.nvidia.com/gpumem", type="project-hard"}[5m]))
        step: 5m
        mappers:
          name: project
          namespace: ""
          cluster: cluster
          project: project
kind: ConfigMap
metadata:
  labels:
    cpaas.io/slark.collection.config: "true"
  name: slark-agent-project-config-vgpu
  namespace: cpaas-system

添加 yaml 后,需要重启智能体 Pod 以重新加载配置。

kubectl delete pods -n cpaas-system -l service_name=slark-agent

添加展示/存储配置(成本管理服务器)

在运行成本管理服务器的集群中创建 ConfigMap,声明计费项、计费方式、单位和展示名称,告诉服务器如何计费。

注意: 若不启用 GPU 超额配比,使用请求量计费没有意义。若使用请求量计费,请务必启用 GPU 超额配比。

apiVersion: v1
data:
  config: |
    - name: vGPUCore
      displayname:
        zh: "HAMi NVIDIA vGPU Cores"
        en: "HAMi NVIDIA vGPU Cores"
      methods:
        - name: Request
          displayname:
            zh: "请求量"
            en: "Request Usage"
          item: vGPUCoreQuota
          divisor: 1
          unit:
            zh: "core-hours"
            en: "core-hours"
        - name: Usage
          displayname:
            zh: "使用量"
            en: "Used Usage"
          item: vGPUCoreUsed
          divisor: 1
          unit:
            zh: "core-hours"
            en: "core-hours"
        - name: ProjectQuota
          displayname:
            zh: "项目配额"
            en: "Project Quota"
          item: vGPUCoresProjectQuota
          unit:
            zh: "core-hours"
            en: "core-hours"
          divisor: 1
    - name: vGPUMemory
      displayname:
        zh: "HAMi NVIDIA vGPU Memory"
        en: "HAMi NVIDIA vGPU Memory"
      methods:
        - name: Request
          displayname:
            zh: "请求量"
            en: "Request Usage"
          item: vGPURamBytesQuota
          divisor: 1073741824
          unit:
            zh: "Gi-hours"
            en: "Gi-hours"
        - name: Used
          displayname:
            zh: "使用量"
            en: "Used Usage"
          item: vGPURamBytesUsed
          divisor: 1073741824
          unit:
            zh: "Gi-hours"
            en: "Gi-hours"
        - name: ProjectQuota
          displayname:
            zh: "项目配额"
            en: "Project Quota"
          item: vGPURamBytesProjectQuota
          unit:
            zh: "Gi-hours"
            en: "Gi-hours"
          divisor: 1024 # Mi/1024
kind: ConfigMap
metadata:
  labels:
    cpaas.io/slark.display.config: "true"
  name: slark-display-config-for-vgpu
  namespace: kube-public

添加 yaml 后,需要重启服务器 Pod 以重新加载配置。

kubectl delete pods -n cpaas-system -l service_name=slark

为 vGPU 成本模型添加价格

如果 GPU 集群尚无成本模型,需要先创建新的成本模型。 然后可以为 GPU 集群的成本模型添加价格:

计费方式说明

计费项计费方式计费规则说明
vGPU使用量(Core-hours)按小时计算,使用 POD 过去一小时的平均使用量乘以 POD 实际运行时长(不足 5 分钟按 5 分钟计)。基于实际 vGPU 消耗
vGPU请求量(Core-hours)按小时计算,使用 POD 过去一小时的请求量乘以 POD 实际运行时长(不足 5 分钟按 5 分钟计)。基于 vGPU 资源请求
vGPU项目配额(Core-hours)按小时计算,使用项目分配的 CPU 配额限额乘以时间长度,配额变更时分段计算。基于项目级资源配额
vGPUMemory使用量(GiB-hours)按小时计算,使用 POD 过去一小时的平均使用量乘以 POD 实际运行时长(不足 5 分钟按 5 分钟计)。基于实际 vGPU 内存消耗
vGPUMemory请求量(GiB-hours)按小时计算,使用 POD 过去一小时的请求量乘以 POD 实际运行时长(不足 5 分钟按 5 分钟计)。基于 vGPU 内存资源请求
vGPUMemory项目配额(GiB-hours)按小时计算,使用项目分配的内存配额限额乘以时间长度,配额变更时分段计算。基于项目级资源配额

为成本模型添加价格

  1. 计费项 中选择 vGPUvGPUMemory

  2. 方式 中选择 Request Usage (core-hours)Used Usage (core-hours)Project Quota (core-hours)

  3. 设置 默认价格

  4. 配置 按标签定价(可选)。 目前仅支持两个键:modelNamedevice

    modelName:GPU 型号,例如 "Tesla P100-PCIE-16GB" 或 "Tesla T4"(通过运行 nvidia-smi 获得)。

    device:GPU 厂商,例如 "nvidia" 或 "ascend"。

成本明细与成本统计

最后,等待 1 小时或更长时间后,可以在 成本明细 中查看基于命名空间和卡 UUID 维度的成本详情。 同时,可以在 成本统计 中查看基于集群、项目和命名空间的总成本。