如何定义 HAMi 虚拟 GPU 成本模型

此操作步骤会将 HAMi 虚拟设备内存分配注册为计费项。该指标在 HAMi scheduler 层统一,并同时适用于 soft-slice 和 hard-slice 工作负载。

此配置提供的内容

  • 内存分配:由 scheduler 确认的虚拟内存分配量,按 GiB-hours 累计。
  • 项目配额(可选):项目虚拟内存配额,按 GiB-hours 累计。
  • 模型定价:分配记录保留 modelName,因此价格可以根据底层 accelerator 模型而变化。
  • 运行时指标:WebUI 或 device-plugin 使用量指标可用于监控,但不是默认的计费事实来源。

1. 创建记录规则

INFO

应用此配置的位置

在运行 HAMi 及其 scheduler metrics 的集群中应用此 PrometheusRule。应用前确认 scheduler exporter target 状态正常。

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: alauda-hami-billing-recording
  namespace: kube-system
  labels:
    prometheus: kube-prometheus
spec:
  groups:
    - name: alauda.billing.hami
      interval: 30s
      rules:
        - record: alauda_hami_virtual_memory_allocated_bytes
          expr: |
            label_replace(
              label_join(
                (
                  hami_vgpu_memory_allocated_bytes{namespace!="kube-system"}
                  * on (device_uuid) group_left (device_type)
                    (0 * max by (device_uuid, device_type) (hami_gpu_memory_limit_bytes) + 1)
                ),
                "virtual_device_id", "/", "device_uuid", "namespace", "pod", "container_index"
              ),
              "label_modelName", "$1", "device_type", "(.+)"
            )
        - record: alauda_hami_project_memory_quota_bytes
          expr: |
            avg by (project, cluster) (
              avg_over_time(
                cpaas_project_resourcequota{
                  resource="requests.nvidia.com/gpumem",
                  type="project-hard"
                }[5m]
              ) * 1048576
            )

hami_vgpu_memory_allocated_bytes 是 scheduler 分配事实。它不是容器当前实际使用的运行时内存。此规则会为每个设备、namespace、pod 和 container 分配创建唯一的 virtual_device_id

WARNING

resource="requests.nvidia.com/gpumem" selector 仅为示例。例如,HAMi Ascend 310P 环境可能会将 NPU 内存公开为 requests.huawei.com/Ascend310P-memory。HAMi NPU 内存资源通常特定于模型。请将 selector 替换为目标环境公开的确切内存资源 key;适用时还应包含 accelerator 模型。应用规则前,请在 Prometheus 中检查 resource label 以及 cpaas_project_resourcequota 的单位。如果资源 key 或单位不同,请相应更新 selector 和 MiB 到 bytes 的转换;否则 ProjectQuota 数据可能为空或缩放不正确。

项目配额规则是可选的。如果不需要项目配额计费,请将其移除。

在 Prometheus 中验证标准化指标:

alauda_hami_virtual_memory_allocated_bytes
alauda_hami_project_memory_quota_bytes

继续操作前,分配指标必须为 soft-slice 和 hard-slice 工作负载返回预期的 series。

2. 创建采集配置

INFO

应用此配置的位置

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

apiVersion: v1
kind: ConfigMap
metadata:
  name: slark-agent-hami-config
  namespace: cpaas-system
  labels:
    cpaas.io/slark.collection.config: "true"
data:
  config: |
    - kind: HAMi
      category: HAMi
      item: hamiVirtualMemoryAllocationGiBHours
      period: Hourly
      usage:
        query: alauda_hami_virtual_memory_allocated_bytes
        step: 5m
        mappers:
          name: virtual_device_id
          namespace: namespace
          cluster: ""
          project: ""
      labels:
        query: alauda_hami_virtual_memory_allocated_bytes
        mappers:
          name: virtual_device_id
          namespace: namespace
          cluster: ""
          project: ""
    - kind: Project
      category: HAMi
      item: projectVirtualDeviceMemoryGiBHours
      period: Hourly
      usage:
        query: alauda_hami_project_memory_quota_bytes
        step: 5m
        mappers:
          name: project
          namespace: ""
          cluster: cluster
          project: project

源值的单位是 bytes。Cost Management 以 byte-hours 存储数据,显示除数会将其转换为 GiB-hours。应用 ConfigMap 后重新加载 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-hami
  namespace: kube-public
  labels:
    cpaas.io/slark.display.config: "true"
data:
  config: |
    - name: HAMi
      displayname: {zh: "HAMi 虚拟设备", en: "HAMi Virtual Device"}
      methods:
        - name: MemoryAllocation
          displayname: {zh: "显存分配量", en: "Allocated vMemory"}
          item: hamiVirtualMemoryAllocationGiBHours
          divisor: 1073741824
          unit: {zh: "GiB·时", en: "GiB-hours"}
        - name: ProjectQuota
          displayname: {zh: "项目显存配额", en: "Project vMemory Quota"}
          item: projectVirtualDeviceMemoryGiBHours
          divisor: 1073741824
          unit: {zh: "GiB·时", en: "GiB-hours"}

divisor: 1073741824 表示 1 GiB(1024 x 1024 x 1024 bytes)。它会将 Cost Management 采集的 byte-hours 转换为用于显示和价格计算的 GiB-hours。请将源数据和采集数据保留为 bytes;不要在 Prometheus 中或在采集查询中、数据进入计量系统前对数值进行除法运算。这样可以保留精度,并将转换集中在一个位置。

应用 ConfigMap 后重新加载 Cost Management Server:

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

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

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

计费项方法单位价格规则
HAMi Virtual DeviceAllocated vMemoryGiB-hours默认价格,可选 modelName 覆盖
HAMi Virtual DeviceProject vMemory QuotaGiB-hours项目级默认价格
WARNING

Project Quota 是可选的,并且没有 accelerator 模型维度。不要为此方法配置 modelName 价格覆盖。

对于分配定价,请配置 HAMi scheduler label source 发出的确切 modelName 值。该值区分大小写。不得将底层物理设备 UUID 用作虚拟设备名称,因为多个虚拟设备可以共享同一物理卡。

5. 验证结果

等待至少一个每小时计费窗口。按以下顺序验证结果:

  1. 使用量:确认存在分配记录,其中包含预期的 virtual_device_id、namespace 以及 GiB-hours 转换结果。
  2. 账单:确认已生成账单,并且应用了预期的默认价格或特定模型价格。
  3. 控制台:确认相同的项目和金额出现在成本详情和统计信息中。

有关共享部署规则,请参阅Configuration Conventions