如何定义完整 GPU 成本模型

此操作步骤会将 NVIDIA 整体 GPU 分配和项目配额用量注册为计费项。它不会测量 GPU 利用率百分比。

此配置提供的内容

  • 分配:每个已分配的 GPU UUID 计为一个 GPU,然后按 GPU-hours 累计。
  • 项目配额(可选):需要按项目配额计费时,可将项目的 requests.nvidia.com/gpu hard quota 按 GPU-hours 累计。
  • 模型定价:分配记录会保留 modelName,因此不同的 GPU model 可以采用不同价格。
  • 项目配额定价:配额记录不包含 GPU model,因此请使用一个项目级基础价格。

1. 创建记录规则

INFO

应用此配置的位置

应用前,请确认 GPU exporter target 状态正常,并且其源指标包含 UUIDmodelNamenamespace 标签。

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: alauda-gpu-billing-recording
  namespace: kube-system
  labels:
    prometheus: kube-prometheus
spec:
  groups:
    - name: alauda.billing.gpu
      interval: 30s
      rules:
        - record: alauda_gpu_allocated_count
          expr: |
            count by (UUID, label_modelName, namespace) (
              label_replace(
                DCGM_FI_DEV_GPU_UTIL{
                  namespace!="kube-system",
                  pod!~"nvidia-dcgm-exporter.*",
                  container!="nvidia-dcgm-exporter"
                },
                "label_modelName",
                "$0",
                "modelName",
                ".*"
              )
            )
        - record: alauda_gpu_project_quota_count
          expr: |
            avg by (project, cluster) (
              avg_over_time(
                cpaas_project_resourcequota{
                  resource="requests.nvidia.com/gpu",
                  type="project-hard"
                }[5m]
              )
            )

第一条规则会为每个已分配的 GPU UUID 发出一个值为 1 的序列。第二条规则会发出项目的 GPU 配额。第二条规则是可选的:不需要按项目配额计费时,请移除该规则以及相应的项目配额采集和显示条目。如果环境中的 exporter 或配额指标名称不同,请替换源表达式。

在 Prometheus 中验证规则:

alauda_gpu_allocated_count
alauda_gpu_project_quota_count

继续之前,两个查询都必须返回预期的非空序列。

开始排查记录规则前,请确认活动 Prometheus 实例中的 GPU exporter target 状态正常。

2. 创建采集配置

INFO

应用此配置的位置

在运行 Cost Management Agent 的 GPU 集群中应用此 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: slark-agent-gpu-config
  namespace: cpaas-system
  labels:
    cpaas.io/slark.collection.config: "true"
data:
  config: |
    - kind: GPU
      category: GPU
      item: gpuAllocationHours
      period: Hourly
      usage:
        query: alauda_gpu_allocated_count
        step: 5m
        mappers:
          name: UUID
          namespace: namespace
          cluster: ""
          project: ""
      labels:
        query: alauda_gpu_allocated_count
        mappers:
          name: UUID
          namespace: namespace
          cluster: ""
          project: ""
    - kind: Project
      category: GPU
      item: projectGPUQuotaHours
      period: Hourly
      usage:
        query: alauda_gpu_project_quota_count
        step: 5m
        mappers:
          name: project
          namespace: ""
          cluster: cluster
          project: project

Prometheus 标签源中必须使用 label_ 前缀。Cost Management 会将 label_modelName 存储为计费标签 modelName

应用 ConfigMap 后,重新加载 Cost Management Agent,使其读取新的采集配置:

kubectl -n cpaas-system delete pod \
  -l service_name=slark-agent

3. 创建显示配置

INFO

应用此配置的位置

在运行 Cost Management Server 的 Global 集群中应用此 ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: slark-display-config-for-gpu
  namespace: kube-public
  labels:
    cpaas.io/slark.display.config: "true"
data:
  config: |
    - name: GPU
      displayname:
        zh: "整卡 GPU"
        en: "Whole GPU"
      methods:
        - name: Allocation
          displayname:
            zh: "分配量"
            en: "Allocation Usage"
          item: gpuAllocationHours
          divisor: 1
          unit:
            zh: "卡时"
            en: "GPU-hours"
        - name: ProjectQuota
          displayname:
            zh: "项目配额"
            en: "Project Quota"
          item: projectGPUQuotaHours
          divisor: 1
          unit:
            zh: "卡时"
            en: "GPU-hours"

应用 ConfigMap 后,重新加载 Cost Management Server,使其读取新的显示配置:

kubectl -n cpaas-system delete pod \
  -l service_name=slark-server

4. 将价格添加到成本模型

在平台控制台中,打开 Metering and Billing > Cost Models,创建或编辑与 GPU 集群关联的成本模型。

添加以下计费项:

计费项方法单位价格规则
整体 GPUAllocation UsageGPU-hours默认价格,可选的 modelName 覆盖
整体 GPUProject QuotaGPU-hours项目级默认价格
WARNING

Project Quota 是可选项。仅在需要按项目配额计费时添加此方法。Project Quota 数据没有 GPU model 维度,因此不要为此方法配置 modelName 价格覆盖。

如需为不同模型设置分配价格,请添加标签覆盖:

Key: modelName
Value: <the exact value reported by the GPU exporter>
Price: <price per GPU-hour>

标签值区分大小写。请使用以下内容确认标签值:

count by (UUID, label_modelName) (alauda_gpu_allocated_count)

5. 验证结果

等待至少一个小时计费窗口,并等待采集和计费流程完成。请按以下顺序验证结果:

  1. 用量:确认预期集群、命名空间和 GPU UUID 的 GPU 用量记录存在。
  2. 账单:确认系统根据该用量记录生成账单,并应用了预期价格。
  3. 控制台:确认成本详情和统计信息中显示了相同的项目和金额。

请确认:

  • Allocation Usage 包含已分配的 GPU UUID,以及在可用时包含 modelName
  • Project Quota 包含项目和集群维度;
  • 分配记录应用了预期的特定模型价格;
  • 项目配额记录使用项目级基础价格。

如需了解常见问题,请参阅 FAQ