Tutoriel : Suivre les dépenses du modèle de fondation par utilisateur, équipe ou projet

Dans ce tutoriel, vous analysez ce qui motive la dépense de votre modèle de base avec Unity AI Gateway. Vous attribuez le coût par utilisateur à l’ensemble des services modèles que vous gouvernez, puis ajoutez des tags pour suivre les dépenses par équipe, projet ou cas d’utilisation à l’aide de tables système :

Prerequisites

Note

Les estimations en dollars dans ce tutoriel sont basées sur le prix affiché. Ils excluent les remises négociées et les crédits de facturation. Utilisez-les pour l’attribution et l’analyse des tendances, et votre relevé de facturation pour le rapprochement.

Étape 1 : Identifiez quels utilisateurs génèrent des dépenses

Tip

Genie Code (mode Agent) peut le faire pour vous. Essayez cet exemple d’invite suivant :

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.

Accédez à AI Gateway > Govern > Tableau de bord d’utilisation >Analyse des coûts, qui ventile les dépenses par modèle fourni par Databricks ou par un fournisseur externe, point de terminaison et utilisateur, sans écrire de SQL. Le graphique des Meilleurs utilisateurs par coût (USD) sous la répartition des coûts classe les plus dépensiers.

Sinon, interrogez directement les tables système pour voir qui consomme le plus et où. Le tableau que vous interrogez dépend du type de modèle :

Modèles fournis par Databricks

Interrogez system.billing.usage et rejoignez system.billing.list_prices pour convertir l’utilisation des DBU en dollars. Le identity_metadata.run_by champ identifie le principal qui a émis chaque demande :

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;

Modèles externes

Pour les requêtes acheminées vers des fournisseurs externes via les services de fournisseurs modèles, Azure Databricks estime le coût en USD issu de l'utilisation des jetons et les prix publiés par le fournisseur, capturés dans system.ai_gateway.external_model_spend. Cette requête restitue la même répartition que la requête fournie par Azure Databricks pour les services fournisseurs de modèles :

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;

Étape 2 : Configurez le suivi de l’utilisation et des dépenses par équipe ou projet

Le coût par utilisateur vous indique qui, mais pas quelle équipe ou projet. Pour attribuer l’utilisation des jetons à une équipe ou un projet, identifiez votre trafic en fonction de la façon dont vos services de modèle correspondent aux équipes ou aux projets :

  • Balises de service (point de terminaison) : lorsque chaque équipe ou projet possède son propre modèle de service. Le tag s’applique à chaque requête acheminée via ce service modèle, donc vous le configurez une fois.
  • Étiquettes de requête : lorsque plusieurs équipes ou projets partagent le même service de modèle. L’appelant définit le tag par requête, donc vous attribuez l’utilisation au sein d’un service partagé.

Balises de service

Ajoutez une étiquette telle que team ou project au service modèle. Chaque requête acheminée par elle hérite du tag.

  1. Dans l’interface de l’espace de travail, allez dans AI Gateway et ouvrez le service de modèles.
  2. Sur la page Aperçu du service modèle, dans la section Tags , ajoutez une étiquette telle que team = ml-platform.

Les balises de service apparaissent dans le champ endpoint_tags dans system.ai_gateway.usage et sont propagées vers le champ custom_tags dans system.billing.usage. Pour plus de détails sur la création et la configuration des services modèles, voir Créer et gérer les API modèles (services modèles).

Étiquettes de requête

Attachez un tag tel que project pour des requêtes individuelles avec l’en-tête Databricks-Ai-Gateway-Request-Tags HTTP, un objet JSON associant les clés de chaîne aux valeurs de chaîne :

Databricks-Ai-Gateway-Request-Tags: {"project": "chatbot", "team": "ml-platform"}

Les balises de requête apparaissent dans le request_tags champ de system.ai_gateway.usage. Pour des exemples qui définissent l’en-tête avec le SDK OpenAI, le SDK Anthropic et l’API REST, voir Requêtes de balises pour le suivi d’utilisation.

Note

Le tag à utiliser pour l’attribution des coûts dépend du modèle :

  • Modèles fournis par Azure Databricks : utilisez les balises de service. Seules les balises de service se propagent vers system.billing.usage.
  • Modèles de fournisseurs externes : utilisez des balises de service ou de requête. Les deux se propagent vers system.ai_gateway.external_model_spend, ce qui capture les estimations de dépenses des modèles externes.

Étape 3 : Analyser l’utilisation par équipe ou projet

Tip

Genie Code (mode Agent) peut le faire pour vous. Essayez cet exemple d’invite suivant :

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.

Une fois les balises en place, consultez l’utilisation agrégée dans system.ai_gateway.usage, qui regroupe les métriques relatives aux requêtes et aux jetons pour chaque requête acheminée vers des modèles fournis par Azure Databricks ainsi que vers des modèles de fournisseurs externes. Regrouper par endpoint_tags['team'] pour les tags de service, ou par request_tags['project'] pour les tags de requête :

Balises de service

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;

Étiquettes de requête

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;

Pour explorer l’une ou l’autre des deux répartitions sans SQL, utilisez les filtres d’étiquettes sur la page d’analyse des coûts.

Étape 4 : Analyser les dépenses en dollars par équipe ou projet

Tip

Genie Code (mode Agent) peut le faire pour vous. Essayez cet exemple d’invite suivant :

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.

Avec les tags en place, attribuez les dépenses en USD à une équipe ou un projet. Pour regrouper les dépenses par tag sans écrire SQL, allez dans AI > Gateway Govern > Usage > Cost Analysis et utilisez la section Analyse des coûts basée sur les tags. Filtrez par tag de terminaison ou tag de requête pour voir le coût par groupes de tags de terminaison et le coût estimé par groupes de tag de requête.

Pour attribuer la dépense avec SQL, la table que vous interrogez dépend du type de modèle :

Modèles fournis par Databricks

Les balises de service se propagent jusqu’au champ custom_tags dans system.billing.usage, ce qui vous permet d’attribuer à une équipe les dépenses au prix catalogue en USD de la même manière que vous avez classé les utilisateurs à l’étape 1. Rejoignez system.billing.list_prices pour convertir l’utilisation des DBU en dollars :

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;

Modèles externes

Pour les modèles externes, system.ai_gateway.external_model_spend il enregistre déjà le coût estimé en USD et inclut à la fois les étiquettes de service et les étiquettes de requête dans custom_tags, afin de pouvoir regrouper par custom_tags.request_tags groupe pour attribuer les dépenses entre services par projet ou équipe :

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;

Étape 5 : Analyser le coût par jeton par équipe ou projet

Tip

Genie Code (mode Agent) peut le faire pour vous. Essayez cet exemple d’invite suivant :

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.

Les dépenses totales indiquent où est allé le budget, mais pas si vous payez un tarif équitable. Suivre les dépenses d’inférence en fonction du coût par 1M de jetons permet de comparer les modèles de destination, de localiser les régressions après un changement de routage, ou de justifier le transfert du trafic vers un modèle moins cher. Effectuez une jointure entre la table des coûts et system.ai_gateway.usage sur le service de modèles, le modèle de destination et l’équipe. Les deux onglets sont regroupés par l’étiquette team de service, donc les résultats correspondent à l’étape 3 :

Modèles fournis par Databricks

Agréger les dépenses en prix listé et les jetons sur toute la fenêtre, puis rejoindre le service modèle, le modèle de destination et l’équipe. Rejoignez system.billing.list_prices pour convertir l’utilisation des DBU en dollars :

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;

Modèles externes

Agrégez les dépenses et les jetons sur toute la fenêtre, puis rejoignez le service du fournisseur modèle, le modèle de destination et l’équipe. Les deux tables couvrent les mêmes requêtes, donc un total au niveau de la période n’a pas besoin d’une clé temporelle dans la jointure :

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;

Si vous utilisez des balises de requête pour l’attribution de l’équipe, remplacez custom_tags.endpoint_tags['team'] par custom_tags.request_tags['team'], et endpoint_tags['team'] par request_tags['team'] dans le récapitulatif des jetons.

Note

Unity AI Gateway n’enregistre pas la consommation de jetons pour les réponses sans diffusion en continu et hors embeddings de plus de 1 Mio. Le coût par jeton peut donc paraître élevé dans les cas où ces réponses sont fréquentes. Comparez les tarifs au sein d’une charge de travail plutôt que sur des charges non liées.

Étapes suivantes