チュートリアル: ユーザー、チーム、またはプロジェクト別の基盤モデルの支出を追跡する
ベータ版
この機能はベータ版です。アカウント管理者は、アカウント コンソールの [プレビュー] ページからこの機能へのアクセスを管理できます。Databricksのプレビューを管理するを参照してください。
このチュートリアルでは、Unity AIゲートウェイを使用して、基盤モデルの支出要因を分析します。管理対象のモデルサービス全体でユーザーごとにコストを割り当て、システムテーブルを使用してチーム、プロジェクト、またはユースケース別に支出を追跡するためのタグを追加します:
system.billing.usage: Databricks が提供するモデルの Databricks ユニット (DBU) での Databricks 消費量。system.billing.list_prices:DBU をドルに換算するためのリスト価格。system.ai_gateway.usage: すべてのリクエストに対するリクエストおよびトークン使用量。system.ai_gateway.external_model_spend:外部プロバイダーモデルの推定コスト(USD)。
前提条件
- お客様のアカウントでUnity AI Gatewayのプレビュー版が有効になりました。「Databricks プレビューの管理」を参照してください。
- トラフィックが発生している 1 つ以上の Unity AI ゲートウェイモデルサービス。「モデルサービスの作成と管理」を参照してください。
- アカウントで有効になっている課金利用システムテーブル。システムテーブルを有効にするを参照してください。
- 上記システムテーブルへのアクセス。defaultでは、アカウント管理者ロールとメタストア管理者ロールの両方が必要です。システムテーブルへのアクセス権限の付与を参照してください。
このチュートリアルでの米ドル建ての見積もりは、 定価 に基づいています。これらには、交渉による割引や請求クレジットは含まれません。これらを属性付けや傾向分析に使用し、請求明細書を照合するために使用します。
ステップ 1: 支出を発生させているユーザーを確認する
Genie Code(エージェントモード)が、代わりに実行できます。このプロンプト例を試す:
Query system.billing.usage for MODEL_SERVING records from the past 30 days where usage_metadata.ai_gateway.endpoint_name is set. Convert DBUs to list-price USD using system.billing.list_prices at the price effective for each record, break down by model service, destination model, and requesting user, and sort by cost.
AI Gateway > Govern > Usage Dashboard > Cost Analysis に移動します。ここでは、SQLを記述することなく、Databricks提供または外部プロバイダーのモデル、Endpoint、ユーザーごとに支出の内訳を確認できます。「コストの内訳」の下にある「コスト別トップユーザー (USD)」チャートは、支出の多いユーザーをランク付けします。
あるいは、システムテーブルを直接クエリーして、誰がどこで最も消費しているかを確認することもできます。クエリー対象のテーブルはモデルタイプによって異なります。
- Databricks-provided models
- External models
system.billing.usageをクエリーし、system.billing.list_pricesを結合してDBU使用量をドルに換算します。identity_metadata.run_byフィールドは、各リクエストを発行したプリンシパルを識別します:
SELECT
u.usage_metadata.ai_gateway.endpoint_name AS model_service_name,
u.usage_metadata.ai_gateway.destination_model AS destination_model,
u.identity_metadata.run_by AS run_by,
SUM(u.usage_quantity * lp.pricing.effective_list.default) AS list_cost_usd
FROM system.billing.usage u
JOIN system.billing.list_prices lp
ON u.sku_name = lp.sku_name
AND u.cloud = lp.cloud
AND u.usage_unit = lp.usage_unit
AND u.usage_end_time >= lp.price_start_time
AND (lp.price_end_time IS NULL OR u.usage_end_time < lp.price_end_time)
WHERE u.billing_origin_product = 'MODEL_SERVING'
AND u.usage_metadata.ai_gateway.endpoint_name IS NOT NULL
AND u.identity_metadata.run_by IS NOT NULL
AND u.usage_unit = 'DBU'
AND lp.currency_code = 'USD'
AND u.usage_date >= current_date() - INTERVAL 30 DAYS
GROUP BY model_service_name, destination_model, run_by
ORDER BY list_cost_usd DESC;
モデルプロバイダーサービスを通じて外部プロバイダーにルーティングされるリクエストについて、Databricks はトークンの使用量とプロバイダーが公開している価格から USD でのコストを推定し、system.ai_gateway.external_model_spend に記録します。このクエリーは、モデルプロバイダーサービスに対して Databricks が提供するクエリーと同じ内訳を返します:
SELECT
usage_metadata.endpoint_name AS model_provider_service_name,
identity_metadata.run_by AS run_by,
SUM(usage_quantity) AS estimated_provider_cost_usd
FROM system.ai_gateway.external_model_spend
WHERE identity_metadata.run_by IS NOT NULL
AND usage_start_time >= current_timestamp() - INTERVAL 30 DAYS
GROUP BY run_by, model_provider_service_name
ORDER BY estimated_provider_cost_usd DESC;
ステップ 2: チームまたはプロジェクト別の使用量と支出の追跡を設定する
ユーザー別の支出では 誰が 使用したかはわかりますが、 どのチームやプロジェクト かはわかりません。トークンの使用量をチームやプロジェクトに帰属させるには、モデルサービスがチームやプロジェクトにどのようにマッピングされるかに基づいてトラフィックにタグを付けます:
- サービス(Endpoint)タグ :各チームまたはプロジェクトが独自のモデルサービスを持つ場合。このタグは、そのモデルサービスを経由してルーティングされるすべてのリクエストに適用されるため、一度設定するだけで済みます。
- リクエストタグ :多くのチームやプロジェクトが同じモデルサービスを共有する場合。呼び出し元がリクエストごとにタグを設定するため、共有サービス 内 での利用状況を割り当てることができます。
- Service tags
- Request tags
モデルサービスにteamやprojectなどのタグを追加します。それを経由してルーティングされるすべてのリクエストは、そのタグを継承します。
- ワークスペースUIで、 AI Gateway に移動し、モデルサービスを開きます。
- モデルサービスの 概要 ページで、 タグ セクションの下に
team=ml-platformのようなタグを追加します。
サービスタグは system.ai_gateway.usage の endpoint_tags フィールドに表示され、system.billing.usage の custom_tags フィールドに伝播します。モデルサービスの作成と設定の詳細については、モデルサービスの作成と管理を参照してください。
project などのタグを Databricks-Ai-Gateway-Request-Tags HTTP ヘッダーを持つ個々のリクエストに添付します。これは、文字列のキーを文字列の値にマッピングする JSON オブジェクトです:
Databricks-Ai-Gateway-Request-Tags: {"project": "chatbot", "team": "ml-platform"}
リクエストタグは、system.ai_gateway.usageのrequest_tagsフィールドに表示されます。OpenAI SDK、Anthropic SDK、およびREST APIを使用してヘッダーを設定する例については、使用状況追跡のためのリクエストのタグ付けを参照してください。
コスト配分にどのタグを使用するかは、モデルによって異なります:
- Databricks 提供モデル : サービス タグ を使用します。サービス タグのみが
system.billing.usageに伝播します。 - 外部プロバイダーモデル : サービスまたはリクエストのタグ を使用します。どちらも
system.ai_gateway.external_model_spendに伝播し、そこで外部モデルの推定支出が取得されます。
ステップ 3: チームまたはプロジェクト別の使用状況を分析する
Genie Code(エージェントモード)が、代わりに実行できます。このプロンプト例を試す:
Query system.ai_gateway.usage for the past 30 days to show request count and total tokens by the 'team' service tag in endpoint_tags, model service, and destination model. Sort by total tokens, highest first.
タグを設定すると、system.ai_gateway.usageで利用状況を集計できます。これには、 Databricksが提供するモデルおよび外部プロバイダーのモデルにルーティングされるすべてのリクエスト のリクエストメトリクスとトークンメトリクスが記録されます。サービスタグの場合はendpoint_tags['team']でグループ化し、リクエストタグの場合はrequest_tags['project']でグループ化します:
- Service tags
- Request tags
SELECT
endpoint_tags['team'] AS team,
endpoint_name,
destination_model,
COUNT(*) AS request_count,
SUM(total_tokens) AS total_tokens
FROM system.ai_gateway.usage
WHERE endpoint_tags['team'] IS NOT NULL
GROUP BY endpoint_tags['team'], endpoint_name, destination_model
ORDER BY total_tokens DESC;
SELECT
request_tags['project'] AS project,
endpoint_name,
destination_model,
COUNT(*) AS request_count,
SUM(total_tokens) AS total_tokens
FROM system.ai_gateway.usage
WHERE request_tags['project'] IS NOT NULL
GROUP BY request_tags['project'], endpoint_name, destination_model
ORDER BY total_tokens DESC;
SQLを使用せずにいずれかの内訳を探索するには、コスト分析ページのタグフィルターを使用します。
ステップ 4:チームまたはプロジェクト別のドル建て支出を分析する
Genie Code(エージェントモード)が、代わりに実行できます。このプロンプト例を試す:
Query system.billing.usage for MODEL_SERVING records from the past 30 days where usage_metadata.ai_gateway.endpoint_name is set. Convert DBUs to list-price USD using system.billing.list_prices at the price effective for each record, group by the 'team' service tag in custom_tags, and sort by cost.
タグを設定することで、USDでの支出をチームまたはプロジェクトに配分できます。SQLを記述せずにタグ別に支出をグループ化するには、 AI Gateway > Govern > Usage Dashboard > Cost Analysis に移動し、 Tag-based Cost Analysis セクションを使用します。Endpointタグまたはリクエストタグでフィルタリングして、 Cost by Endpoint タグ グループ および Estimated Cost by Request タグ グループ を表示します。
SQLを使用して支出を配分する場合、クエリー対象のテーブルはモデルタイプによって異なります。
- Databricks-provided models
- External models
サービスタグは system.billing.usage の custom_tags フィールドに反映されるため、ステップ 1 でユーザーをランク付けしたのと同じ方法で、リスト価格の USD 支出をチームに割り当てることができます。DBU の使用量をドルに換算するには system.billing.list_prices を結合してください:
SELECT
u.custom_tags['team'] AS team,
SUM(u.usage_quantity * lp.pricing.effective_list.default) AS list_cost_usd
FROM system.billing.usage u
JOIN system.billing.list_prices lp
ON u.sku_name = lp.sku_name
AND u.cloud = lp.cloud
AND u.usage_unit = lp.usage_unit
AND u.usage_end_time >= lp.price_start_time
AND (lp.price_end_time IS NULL OR u.usage_end_time < lp.price_end_time)
WHERE u.billing_origin_product = 'MODEL_SERVING'
AND u.usage_metadata.ai_gateway.endpoint_name IS NOT NULL
AND u.custom_tags['team'] IS NOT NULL
AND u.usage_unit = 'DBU'
AND lp.currency_code = 'USD'
AND u.usage_date >= current_date() - INTERVAL 30 DAYS
GROUP BY team
ORDER BY list_cost_usd DESC;
外部モデルの場合、system.ai_gateway.external_model_spendはすでに推定コストを米ドルで記録しており、custom_tagsにサービスタグとリクエストタグの両方が含まれているため、custom_tags.request_tagsでグループ化してプロジェクトまたはチームごとにサービス全体の支出を配分できます:
SELECT
custom_tags.request_tags['team'] AS team,
SUM(usage_quantity) AS estimated_provider_cost_usd
FROM system.ai_gateway.external_model_spend
WHERE custom_tags.request_tags['team'] IS NOT NULL
AND usage_date >= current_date() - INTERVAL 30 DAYS
GROUP BY team
ORDER BY estimated_provider_cost_usd DESC;
ステップ 5: チームまたはプロジェクトごとのトークンあたりのコストを分析する
Genie Code(エージェントモード)が、代わりに実行できます。このプロンプト例を試す:
Query system.billing.usage and system.ai_gateway.usage for the past 30 days to show list-price USD per million tokens by model service, destination model, and the 'team' service tag. Convert DBUs to dollars using system.billing.list_prices at the price effective for each record, and join the two tables on usage date.
総支出は予算がどこに使われたかを示しますが、適正な料金を支払っているかどうかまでは示しません。推論の支出を100万トークンあたりのコストとして追跡することで、宛先モデルの比較、ルーティング変更後の回帰の特定、またはより安価なモデルへのトラフィック移行の正当化が可能になります。コストテーブルを、モデルサービス、宛先モデル、およびチームに基づいてsystem.ai_gateway.usageに結合します。両方のtabはteamサービスタグでグループ化されるため、結果はステップ3と一致します:
- Databricks-provided models
- External models
全期間にわたってリスト価格の支出とトークンを集計し、モデルサービス、宛先モデル、およびチームで結合します。system.billing.list_prices を結合して、DBU 使用量をドルに変換します:
WITH cost AS (
SELECT
u.usage_metadata.ai_gateway.endpoint_name AS endpoint_name,
u.usage_metadata.ai_gateway.destination_model AS destination_model,
u.custom_tags['team'] AS team,
SUM(u.usage_quantity * lp.pricing.effective_list.default) AS list_cost_usd
FROM system.billing.usage u
JOIN system.billing.list_prices lp
ON u.sku_name = lp.sku_name
AND u.cloud = lp.cloud
AND u.usage_unit = lp.usage_unit
AND u.usage_end_time >= lp.price_start_time
AND (lp.price_end_time IS NULL OR u.usage_end_time < lp.price_end_time)
WHERE u.billing_origin_product = 'MODEL_SERVING'
AND u.usage_metadata.ai_gateway.endpoint_name IS NOT NULL
AND u.custom_tags['team'] IS NOT NULL
AND u.usage_unit = 'DBU'
AND lp.currency_code = 'USD'
AND u.usage_date >= current_date() - INTERVAL 30 DAYS
GROUP BY ALL
),
tokens AS (
SELECT
endpoint_name,
destination_model,
endpoint_tags['team'] AS team,
SUM(total_tokens) AS total_tokens
FROM system.ai_gateway.usage
WHERE endpoint_tags['team'] IS NOT NULL
AND endpoint_name IS NOT NULL
AND event_time >= current_timestamp() - INTERVAL 30 DAYS
GROUP BY ALL
)
SELECT
c.endpoint_name,
c.destination_model,
c.team,
c.list_cost_usd,
t.total_tokens,
1000000 * c.list_cost_usd / NULLIF(t.total_tokens, 0) AS list_cost_usd_per_1m_tokens
FROM cost c
JOIN tokens t
ON c.endpoint_name = t.endpoint_name
AND c.destination_model = t.destination_model
AND c.team = t.team
ORDER BY list_cost_usd_per_1m_tokens DESC;
全期間にわたって支出とトークンを集計し、モデルプロバイダーサービス、宛先モデル、およびチームで結合します。両方のテーブルが同じリクエストをカバーしているため、期間レベルの合計には結合時の時間キーは必要ありません:
WITH spend AS (
SELECT
usage_metadata.endpoint_name AS endpoint_name,
usage_metadata.model AS destination_model,
custom_tags.endpoint_tags['team'] AS team,
SUM(usage_quantity) AS estimated_provider_cost_usd
FROM system.ai_gateway.external_model_spend
WHERE custom_tags.endpoint_tags['team'] IS NOT NULL
AND usage_date >= current_date() - INTERVAL 30 DAYS
GROUP BY ALL
),
tokens AS (
SELECT
endpoint_name,
destination_model,
endpoint_tags['team'] AS team,
SUM(total_tokens) AS total_tokens
FROM system.ai_gateway.usage
WHERE endpoint_tags['team'] IS NOT NULL
AND destination_model IS NOT NULL
AND event_time >= current_timestamp() - INTERVAL 30 DAYS
GROUP BY ALL
)
SELECT
s.endpoint_name,
s.destination_model,
s.team,
s.estimated_provider_cost_usd,
t.total_tokens,
1000000 * s.estimated_provider_cost_usd / NULLIF(t.total_tokens, 0) AS estimated_cost_usd_per_1m_tokens
FROM spend s
JOIN tokens t
ON s.endpoint_name = t.endpoint_name
AND s.destination_model = t.destination_model
AND s.team = t.team
ORDER BY estimated_cost_usd_per_1m_tokens DESC;
チームの属性付けにリクエストタグを使用している場合は、トークンロールアップ内で custom_tags.endpoint_tags['team'] を custom_tags.request_tags['team'] に、endpoint_tags['team'] を request_tags['team'] に置き換えてください。
Unity AI Gateway は、1 MiB を超える非ストリーミングかつ非埋め込みのレスポンスに対するトークン使用量を記録しないため、そのようなレスポンスが一般的な環境ではトークンあたりのコストが高く表示される場合があります。関連のないワークロード間ではなく、ワークロード内の料金を比較してください。