Tutoriel : Suivre les dépenses liées aux modèles de fondation par utilisateur, équipe ou projet
Bêta
Cette fonctionnalité est en bêta. Les administrateurs de compte peuvent gérer l'accès à cette fonctionnalité depuis la page Aperçus de la console de compte. Voir Gérer les prévisualisations Databricks.
Dans ce tutoriel, vous analysez ce qui influence vos dépenses liées aux modèles de fondation avec Unity AI Gateway. Vous attribuez les coûts par utilisateur sur les services de modèle que vous gérez, puis ajoutez des tags pour suivre les dépenses par équipe, projet ou cas d'utilisation à l'aide des tables système :
system.billing.usage: Consommation Databricks en unités Databricks (DBU) pour les modèles fournis par Databricks.system.billing.list_prices: liste des prix pour convertir les DBU en dollars.system.ai_gateway.usage: utilisation des requêtes et des jetons pour chaque requête.system.ai_gateway.external_model_spend: coût estimé en USD pour les modèles de fournisseurs externes.
Prérequis
- L'aperçu de Unity AI Gateway est activé pour votre compte. Voir Gérer les aperçus Databricks.
- Un ou plusieurs services de modèle Unity AI Gateway avec du trafic. Voir Créer et gérer des services de modèle.
- La table système d’utilisation facturable activée pour votre compte. Voir Activer les tables système.
- Accès aux tables système listées ci-dessus, ce qui nécessite default les rôles d'administrateur de compte et de métastore. Voir Accorder l'accès aux tables système.
Les estimations en dollars dans ce tutoriel sont basées sur le prix catalogue . Elles excluent les remises négociées et les crédits de facturation. Utilisez-les pour l’attribution et l’analyse des tendances, ainsi que votre relevé de facturation pour le rapprochement.
Étape 1 : voir quels utilisateurs génèrent des dépenses
Genie Code (mode Agent) peut le faire pour vous. Essayez cet exemple d'invite :
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 > Usage Dashboard > Cost analyse , qui détaille les dépenses par modèle fourni par Databricks ou par un fournisseur externe, par Endpoint et par utilisateur sans écrire de SQL. Le graphique Top Users by Cost (USD) sous Cost Breakdown classe les principaux utilisateurs en termes de dépenses.
Alternativement, query directement les tables système pour voir qui consomme le plus et où. La table que vous query dépend du type de modèle :
- Databricks-provided models
- External models
query system.billing.usage et joignez system.billing.list_prices pour convertir l'utilisation de DBU en dollars. Le champ identity_metadata.run_by identifie le principal qui a émis chaque requête :
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;
Pour les requêtes acheminées vers des fournisseurs externes via des services de fournisseur de modèle, Databricks estime le coût en USD à partir de l'utilisation des jetons et des prix publiés par le fournisseur, capturés dans system.ai_gateway.external_model_spend. Cette query renvoie la même répartition que la query fournie par Databricks pour les services de fournisseur de modèle :
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 : configurer le suivi de l’utilisation et des dépenses par équipe ou par projet
Les dépenses par utilisateur vous indiquent qui , mais pas quelle équipe ou quel projet . Pour attribuer l’utilisation des jetons à une équipe ou à un projet, étiquetez votre trafic en fonction de la manière dont vos services de modèle sont mappés aux équipes ou aux projets :
- Balises de service (endpoint) : lorsque chaque équipe ou projet possède son propre service de modèle. La balise s'applique à chaque requête acheminée via ce service de modèle, vous ne la définissez donc qu'une seule fois.
- Tags 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, ce qui vous permet d’attribuer l’utilisation au sein d’un service partagé.
- Service tags
- Request tags
Ajoutez un tag tel que team ou project au service de modèle. Chaque requête acheminée via celui-ci hérite du tag.
- Dans l'interface utilisateur du workspace, accédez à AI Gateway et ouvrez le service de modèle.
- Sur la page Overview du service de modèle, dans la section Tags , ajoutez un tag tel que
team=ml-platform.
Les tags de service apparaissent dans le champ endpoint_tags dans system.ai_gateway.usage et se propagent vers le champ custom_tags dans system.billing.usage. Pour plus de détails sur la création et la configuration des services de modèle, consultez Créer et gérer des services de modèle.
Attachez un tag tel que project aux requêtes individuelles avec l'en-tête HTTP Databricks-Ai-Gateway-Request-Tags, un objet JSON mappant des clés de chaîne à des valeurs de chaîne :
Databricks-Ai-Gateway-Request-Tags: {"project": "chatbot", "team": "ml-platform"}
Les tags de requête apparaissent dans le champ request_tags dans system.ai_gateway.usage. Pour des exemples de définition de l’en-tête avec le SDK OpenAI, le SDK Anthropic et l’API REST, consultez Taguer les requêtes pour le suivi de l’utilisation.
Le tag à utiliser pour l'attribution des coûts dépend du modèle :
- Modèles fournis par Databricks : utilisez des service tags . Seuls les service tags se propagent vers
system.billing.usage. - Modèles de fournisseur externe : utilisez des tags de service ou de requête . Les deux se propagent vers
system.ai_gateway.external_model_spend, qui capture les estimations de dépenses des modèles externes.
Étape 3 : analyser l’utilisation par équipe ou par projet
Genie Code (mode Agent) peut le faire pour vous. Essayez cet exemple d'invite :
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 tags en place, agrégez l'utilisation dans system.ai_gateway.usage, qui capture les indicateurs de requête et de jeton pour chaque requête acheminée vers les modèles fournis par Databricks et les modèles de fournisseurs externes . Grouper par endpoint_tags['team'] pour les tags de service, ou par request_tags['project'] pour les tags de requête :
- 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;
Pour explorer l'une ou l'autre répartition sans SQL, utilisez les filtres de tags sur la page d'analyse des coûts.
Étape 4 : Analyser les dépenses en dollars par équipe ou par projet
Genie Code (mode Agent) peut le faire pour vous. Essayez cet exemple d'invite :
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.
Une fois les tags en place, attribuez les dépenses en USD à une équipe ou à un projet. Pour regrouper les dépenses par tag sans écrire de SQL, accédez à AI Gateway > Govern > Usage Dashboard > Cost analyse et utilisez la section Tag-based Cost analyse . Filtrer par tag d'endpoint ou tag de requête pour voir Cost by Endpoint Tag Groups et Estimated Cost by Request Tag Groups .
Pour attribuer les dépenses avec SQL, la table que vous query dépend du type de modèle :
- Databricks-provided models
- External models
Les balises de service se propagent vers le champ custom_tags dans system.billing.usage, afin que vous puissiez attribuer les dépenses au prix catalogue en USD à une équipe de la même manière que vous avez classé les utilisateurs à l'étape 1. Joignez 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;
Pour les modèles externes, system.ai_gateway.external_model_spend enregistre déjà le coût estimé en USD et inclut à la fois des tags de service et des tags de requête dans custom_tags, vous pouvez donc grouper par custom_tags.request_tags pour attribuer les dépenses entre les services par projet ou par é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 par projet
Genie Code (mode Agent) peut le faire pour vous. Essayez cet exemple d'invite :
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 vous indiquent où le budget a été alloué, mais pas si vous payez un tarif équitable. Le suivi des dépenses d'inférence sous forme de coût par million de jetons vous permet de comparer les modèles de destination, de détecter les régressions après un changement de routage ou de justifier le transfert du trafic vers un modèle moins coûteux. Joignez la table des coûts à system.ai_gateway.usage sur le service de modèle, le modèle de destination et l'équipe. Les deux onglets sont regroupés par le tag de service team, de sorte que les résultats correspondent à l'étape 3 :
- Databricks-provided models
- External models
Agrégez les dépenses au prix catalogue et les jetons sur toute la fenêtre, puis effectuez une jointure sur le service de modèle, le modèle de destination et l’équipe. Joignez system.billing.list_prices pour convertir l’utilisation de 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;
Agrégez les dépenses et les jetons sur toute la fenêtre, puis effectuez une jointure sur le service de fournisseur de 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 ne nécessite pas de 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 tags de requête pour l'attribution d'équipe, remplacez custom_tags.endpoint_tags['team'] par custom_tags.request_tags['team'] et endpoint_tags['team'] par request_tags['team'] dans le cumul des jetons.
Unity AI Gateway n’enregistre pas l’utilisation des jetons pour les réponses non-streaming et non-embedding supérieures à 1 Mio ; le coût par jeton peut donc paraître élevé là où ces réponses sont courantes. Comparez les taux au sein d’une même charge de travail plutôt qu’entre des charges sans rapport.