Token 用量分摊计费

简介

本指南通过遵循平台的 自定义成本模型 工作流,为 AI Gateway token 用量定义一个自定义成本模型。其结构与官方的 vGPU (Hami) 成本模型 指南一致:先在 Cost Management agent 集群上添加采集配置,再在 Cost Management server 集群上添加展示/存储配置,然后在平台控制台中为该成本模型添加价格。

Cost Management 会消费由 Metering Token Usage 收集的 OpenTelemetry GenAI token 指标,并以 user_namespace 标签为键,将其转换为按命名空间计费的账单。在多集群部署中,Cost Management server 和 Cost Management agent 可能位于不同集群;下面每一步都会注明其必须执行的集群。

使用场景

  • 按命名空间或租户对其消耗的 AI Gateway token 进行计费。
  • 按模型设置单价,使更昂贵的模型每个 token 的成本更高。
  • 使用与仪表盘相同的指标生成可审计的分摊计费报告。

前提条件

  1. 已配置 Metering Token UsagePodMonitor 正在收集 token 指标,且控制器将 x-user-namespace:user_namespace 映射到系列上,使其携带 user_namespace 标签。请确认可以从 agent 集群的平台 Prometheus(或 Thanos)中查询到该指标:

    # In Prometheus, this must return a non-empty vector:
    #   sum by (user_namespace) (increase({__name__="gen_ai.client.token.usage_token_sum"}[1h]))
  2. 已安装 Cost Management:server 集群上安装了 cost-servercost-api,每个需要计费其 AI Gateway 流量的集群上安装了 cost-agent。参见 Cost Management 安装

  3. 具有访问两个集群的 kubectl 权限,并拥有在 cpaas-system(agent 集群)和 kube-public(server 集群)中写入 ConfigMap 的权限。

步骤

添加采集配置

集群: Cost Management agent 集群——即运行 AI Gateway 且安装了 cost-agent 的集群。cost-agent 组件以 slark-agent 工作负载的形式部署,下面的重启命令会作用于该工作负载。

创建一个 ConfigMap,用于告诉 Cost Management agent 应评估哪个 Prometheus 查询,以及如何将其标签映射到 Cost Management 维度。agent 会发现位于 cpaas-system 中、带有 cpaas.io/slark.collection.config: "true" 标签的配置。

apiVersion: v1
kind: ConfigMap
metadata:
  name: slark-agent-aigateway-config
  namespace: cpaas-system
  labels:
    cpaas.io/slark.collection.config: "true"
data:
  config: |
    - kind: AIGateway
      category: AIGatewayToken
      item: AIGatewayTokenUsage
      period: Hourly
      usage:
        query: |
          sum by (user_namespace, "gen_ai.request.model") (
            increase({__name__="gen_ai.client.token.usage_token_sum"}[5m])
          )
        step: 5m
        mappers:
          name: gen_ai.request.model
          namespace: user_namespace
          cluster: ""
          project: user_namespace

字段说明:

  • kind:Cost Management collector 的类型,同时也是 collector 的名称(在采集配置中必须保持唯一)。Pod 保留给 OpenCost 输出的 pod 指标,Project 保留给平台内置的 CPU/Memory/Storage 配额 collector。AI Gateway token 用量使用专用的自定义类型 AIGateway,与 vGPU/NPU/pGPU 自定义类型模式一致——这是在集群上验证、用于将 cost.usage 填充为 AIGatewayTokenUsage 行的值。应用此配置后,请先确认已出现对应行(参见 Troubleshooting 中的 cost.usage 检查),再继续下一步。
  • categoryitem:用于将此采集配置与下一步中的展示/存储配置关联起来的标识符。两个值都必须与展示/存储配置中的相应字段一致。
  • period:聚合周期。按小时计费请使用 Hourly
  • usage.query:agent 每个 step 执行一次的 PromQL 查询。平台会将该指标以保留点号的 OpenTelemetry UTF-8 名称存储,因此应使用 {__name__="gen_ai.client.token.usage_token_sum"} 选择它,并使用带引号的 UTF-8 语法引用带点的 gen_ai.request.model 标签。通过 header 映射得到的 user_namespace 标签是按命名空间计费的键。
  • usage.step:查询的评估间隔。
  • usage.mappers:将 PromQL 标签映射到 Cost Management 的标准维度(namenamespaceclusterproject)。将 cluster 设为空字符串,这样 agent 会自动填入自己的集群身份;如果将其设置为某个标签名(例如 cluster),则只有当源指标暴露了该标签时才会生效,否则每一行都会被丢弃且不会留下日志。

应用 YAML 后,重启 slark-agent 工作负载(即 cost-agent 组件)以重新加载配置:

kubectl -n cpaas-system delete pod \
  -l service_name=slark-agent --grace-period=0 --force
kubectl -n cpaas-system rollout status deploy/slark-agent
# if slark-agent is installed as a DaemonSet in your environment, use instead:
#   kubectl -n cpaas-system rollout status daemonset/slark-agent

添加展示配置

集群: Cost Management server 集群——即安装了 cost-server 的集群(通常是全局控制平面)。cost-server 组件以 slark-server 工作负载的形式部署,下面的重启命令会作用于该工作负载。

创建一个 ConfigMap,在平台控制台中注册计费项及其计费方式。server 会发现位于 kube-public 中、带有 cpaas.io/slark.display.config: "true" 标签的配置。

apiVersion: v1
kind: ConfigMap
metadata:
  name: slark-display-config-for-aigateway
  namespace: kube-public
  labels:
    cpaas.io/slark.display.config: "true"
data:
  config: |
    - name: AIGatewayToken
      displayname:
        zh: "AI Token"
        en: "AI tokens"
      methods:
        - name: Usage
          displayname:
            zh: "使用量"
            en: "Token Usage"
          item: AIGatewayTokenUsage
          unit:
            zh: "tokens"
            en: "tokens"
          divisor: 1

字段说明:

  • name:在成本模型表单中显示的计费项名称。必须与采集配置中的 category 值一致。
  • methods[].name:计费方式,在添加价格时会显示在计费项下方。
  • methods[].item:必须与采集配置中的 item 值一致,以便 server 能将按方式设置的单价与用量行关联起来。
  • divisor:用于显示用量时的单位换算因子。token 没有单位,因此设置为 1;对于字节级项目,使用 1073741824 以显示为 Gi-hours

下表总结了此配置注册的计费方式:

计费项计费方式来源项说明
AI tokensToken UsageAIGatewayTokenUsage每小时每个命名空间和模型消耗的输出 + 输入 token
WARNING

请勿修改平台预置的 slark-server-common-config(包含 CPU、Memory 和 Storage 的默认展示配置)。向其中添加自定义条目会导致 server 在启动时校验失败。请始终将自定义计费项作为单独的、带有 cpaas.io/slark.display.config: "true" 标签的 ConfigMap 添加。

应用 YAML 后,重启 slark-server 工作负载(即 cost-server 组件)以重新加载配置:

kubectl -n cpaas-system delete pod \
  -l service_name=slark-server --grace-period=0 --force
kubectl -n cpaas-system rollout status deploy/slark-server

向成本模型添加价格

集群: 任意集群——通过由 cost-api 提供服务的平台控制台进行操作。

在平台控制台中,进入 Administrator → Metering and Billing → Cost Model,然后创建或编辑一个成本模型。新注册的 AI tokens 计费项现在可以在价格表单中选择。

  1. Cost Model Name:任意标识符,例如 aml-cost-model
  2. Linked Clusters:选择该模型应对其 AI Gateway 流量计费的集群。即使留空也能成功保存,但不会匹配任何用量数据,也不会生成账单。
  3. Pricing rows
    • Billing ItemAI tokens
    • Billing MethodToken Usage
    • Default Price:按 token 计费的价格,使用平台币种。
    • Price By Label(可选):按模型覆盖价格,例如对 gen_ai.request.model="gpt-4o" 设置更高费率。
  4. 保存。

验证

cost-server worker 每五分钟运行一次。请通过 AI Gateway 发起几次已认证请求,并使用不同的 x-user-namespace 值,至少等待一个 worker 周期后刷新平台控制台。

  • Cost DetailsAdministrator → Metering and Billing → Cost Details)会显示按命名空间划分的 AI tokens 明细。可按命名空间或日期筛选以进一步查看。
  • Cost StatisticsAdministrator → Metering and Billing → Cost Statistics)会按集群、项目和时间范围汇总相同数据。

如需在打开 UI 之前进行服务端验证,可在 server 集群上查询 ClickHouse:

SELECT namespace, project, date, usage, cost
  FROM cost.bills
 WHERE item = 'AIGatewayTokenUsage'
 ORDER BY date DESC, cost DESC
 LIMIT 10;

预期结果是每个消耗 token 的(命名空间,小时)组合都有一行。cost 列存储的是平台的微货币单位,因此 usage × default_price × 1_000_000 应与显示值一致。

故障排查

症状可能原因与解决方法
一个 agent 周期后,cost.usage 中仍没有 AIGatewayTokenUsage确认采集 ConfigMap 位于 cpaas-system 中,并带有 cpaas.io/slark.collection.config: "true"。确认在 apply 之后已重启 cost-agent。确认 PromQL 在平台 Prometheus 上返回非空向量——使用下划线形式的指标名(gen_ai_client_token_usage_token_sum)不会匹配任何内容;请使用 {__name__="gen_ai.client.token.usage_token_sum"} 选择器。确认 mappers.cluster: "" 确实是空字符串。
AI tokens 计费项没有出现在成本模型表单中确认展示/存储 ConfigMap 位于 kube-public(而不是 cpaas-system)中,并带有 cpaas.io/slark.display.config: "true"。确认在 apply 之后已重启 cost-server。确认 methods[].item 与采集配置中的 item 完全一致。
cost.usage 有行,但 cost.bills 中没有 AIGatewayTokenUsage 对应记录在平台控制台中打开成本模型,确认 Linked Clusters 下至少选择了一个集群。worker 还会跳过在 cost.milestones 中已标记为 Done 的分组;如果要在模型变更后重新计算过去时间窗,请删除 cost.milestones 中相关行并等待下一个 worker 周期。
每次 tick 的 worker 日志都显示 Try to skip as no model {"group": "<cluster>/<window>"}成本模型的 Linked Clusters 不包含 agent 报告的集群。编辑该模型并添加该集群。

了解更多

下一步

在生成账单后,可在 Price By Label 下设置按模型的价格覆盖,以反映各模型的相对成本,并定期导出 cost.bills 用于财务报表。