Tutorial: rastrear gastos com modelos básicos por usuário, equipe ou projeto
Beta
Este recurso está em Beta. Os administradores da account podem gerenciar o acesso a este recurso na página Previews do console da account. Consulte Gerenciar prévias do Databricks.
Neste tutorial, você analisa o que está impulsionando seus gastos com modelos de fundação com o Unity AI Gateway. Você atribui custos por usuário nos serviços de modelo que governa e, em seguida, adiciona tags para rastrear gastos por equipe, projeto ou caso de uso usando tabelas do sistema:
system.billing.usage: consumo do Databricks em unidades Databricks (DBUs) para modelos fornecidos pelo Databricks.system.billing.list_prices: preços de lista para converter DBUs em dólares.system.ai_gateway.usage: uso de requisição e de tokens para cada solicitação.system.ai_gateway.external_model_spend: custo estimado em USD para modelos de provedores externos.
Pré-requisitos
- A prévia do Unity AI Gateway habilitada para sua account. Consulte Gerenciar prévias do Databricks.
- Um ou mais serviços de modelo do Unity AI Gateway com tráfego. Consulte Criar e gerenciar serviços de modelo.
- A tabela do sistema de uso faturável habilitada para sua account. Consulte Habilitar tabelas do sistema.
- Acesso às tabelas do sistema listadas acima, o que requer funções de administrador de account e de metastore por default. Consulte Conceder acesso às tabelas do sistema.
As estimativas em dólares neste tutorial baseiam-se no preço de tabela . Eles excluem descontos negociados e créditos de faturamento. Use-os para atribuição e análise de tendências, e seu extrato de faturamento para reconciliação.
O passo 1: Veja quais usuários estão gerando gastos
Genie Code (modo Agente) pode fazer isso por você. Experimente este exemplo de prompt:
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.
Vá para AI Gateway > Govern > Usage Dashboard > Cost análise , que detalha os gastos por modelo fornecido pela Databricks ou por provedor externo, Endpoint e usuário sem escrever SQL. O gráfico Top Users by Cost (USD) em Cost Breakdown classifica os maiores gastadores.
Alternativamente, query as tabelas do sistema diretamente para ver quem está consumindo mais e onde. A tabela que você query depende do tipo de modelo:
- Databricks-provided models
- External models
Faça query de system.billing.usage e join de system.billing.list_prices para converter o uso de DBU em dólares. O campo identity_metadata.run_by identifica o principal que emitiu cada solicitação:
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;
Para solicitações encaminhadas a provedores externos por meio de serviços de provedor de modelos, o Databricks estima o custo em USD a partir do uso de tokens e dos preços publicados pelo provedor, capturados em system.ai_gateway.external_model_spend. Esta query retorna o mesmo detalhamento que a query fornecida pelo Databricks para serviços de provedor de modelos:
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;
O passo 2: Configurar o acompanhamento de uso e gastos por equipe ou projeto
O gasto por usuário informa quem , mas não qual equipe ou projeto . Para atribuir o uso de tokens a uma equipe ou projeto, marque seu tráfego com base em como seus serviços de modelo são mapeados para equipes ou projetos:
- Tags de serviço (endpoint) : quando cada equipe ou projeto tem seu próprio serviço de modelo. A tag se aplica a cada solicitação encaminhada por meio desse serviço de modelo, portanto, você a define uma vez.
- Tags de solicitação : quando muitas equipes ou projetos compartilham o mesmo serviço de modelo. O chamador define a tag por solicitação, para que você atribua o uso dentro de um serviço compartilhado.
- Service tags
- Request tags
Adicione uma tag como team ou project ao serviço de modelo. Toda solicitação encaminhada por ele herda a tag.
- Na interface do usuário do workspace, vá para AI Gateway e abra o serviço de modelo.
- Na página Visão geral do serviço de modelo, na seção Tags , adicione uma tag como
team=ml-platform.
As tags de serviço aparecem no campo endpoint_tags em system.ai_gateway.usage e se propagam para o campo custom_tags em system.billing.usage. Para obter detalhes sobre a criação e configuração de serviços de modelo, consulte Criar e gerenciar serviços de modelo.
Anexe uma tag como project a solicitações individuais com o cabeçalho HTTP Databricks-Ai-Gateway-Request-Tags, um objeto JSON que mapeia keys de strings para valores de strings:
Databricks-Ai-Gateway-Request-Tags: {"project": "chatbot", "team": "ml-platform"}
As tags de solicitação aparecem no campo request_tags em system.ai_gateway.usage. Para exemplos que definem o cabeçalho com o SDK da OpenAI, o SDK da Anthropic e a API REST, consulte Adicionar tags a solicitações para acompanhamento de uso.
Qual tag usar para atribuição de custos depende do modelo:
- Modelos fornecidos pelo Databricks : use tags de serviço . Apenas as tags de serviço são propagadas para
system.billing.usage. - Modelos de fornecedores externos : use tags de serviço ou de solicitação . Ambos são propagados para
system.ai_gateway.external_model_spend, que captura estimativas de gastos com modelos externos.
O passo 3: Analisar o uso por equipe ou projeto
Genie Code (modo Agente) pode fazer isso por você. Experimente este exemplo de prompt:
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.
Com as tags definidas, agregue o uso em system.ai_gateway.usage, que captura métricas de solicitação e de tokens para toda solicitação encaminhada para modelos fornecidos pelo Databricks e por provedores externos . Agrupe por endpoint_tags['team'] para tags de serviço, ou por request_tags['project'] para tags de solicitação:
- 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;
Para explorar qualquer uma das divisões sem SQL, use os filtros de tags na página de análise de custos.
O passo 4: Analisar gastos em dólares por equipe ou projeto
Genie Code (modo Agente) pode fazer isso por você. Experimente este exemplo de prompt:
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.
Com as tags definidas, atribua os gastos em USD a uma equipe ou projeto. Para agrupar gastos por tag sem escrever SQL, vá para AI Gateway > Govern > Usage Dashboard > Cost Análise e use a seção Tag-based Cost Análise . Filtre por tag de endpoint ou tag de solicitação para ver Cost by Endpoint Tag Groups e Estimated Cost by Request Tag Groups .
Para atribuir gastos com SQL, a tabela que você query depende do tipo de modelo:
- Databricks-provided models
- External models
As tags de serviço se propagam para o campo custom_tags em system.billing.usage, para que você possa atribuir os gastos de preço de lista em USD a uma equipe da mesma forma que classificou os usuários no passo 1. Faça o join de system.billing.list_prices para converter o uso de DBU em dólares:
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;
Para modelos externos, o system.ai_gateway.external_model_spend já registra o custo estimado em USD e inclui tanto tags de serviço quanto tags de solicitação em custom_tags, para que você possa agrupar por custom_tags.request_tags para atribuir gastos entre serviços por projeto ou equipe:
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;
o passo 5: Analisar o custo por tokens por equipe ou projeto
Genie Code (modo Agente) pode fazer isso por você. Experimente este exemplo de prompt:
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.
O gasto total informa para onde o orçamento foi, mas não se você está pagando uma taxa justa por ele. O acompanhamento dos gastos de inferência como custo por 1M de tokens permite comparar modelos de destino, identificar regressões após uma alteração de roteamento ou justificar a mudança de tráfego para um modelo mais barato. Faça join da tabela de custos com system.ai_gateway.usage no serviço de modelo, modelo de destino e equipe. Ambas as tab agrupam pela tag de serviço team, portanto, os resultados se alinham com o passo 3:
- Databricks-provided models
- External models
Agregue o gasto de preço de lista e os tokens durante toda a janela e, em seguida, faça o join no serviço de modelo, no modelo de destino e na equipe. Faça o join de system.billing.list_prices para converter o uso de DBU em dólares:
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;
Agregue gastos e tokens durante toda a janela e, em seguida, faça o join no serviço de provedor de modelos, no modelo de destino e na equipe. Ambas as tabelas cobrem as mesmas solicitações, portanto, um total em nível de período não precisa de uma key de tempo no join:
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;
Se você estiver usando tags de solicitação para atribuição de equipe, substitua custom_tags.endpoint_tags['team'] por custom_tags.request_tags['team'] e endpoint_tags['team'] por request_tags['team'] no rollup de tokens.
O Unity AI Gateway não registra o uso de tokens para respostas que não sejam de transmissão ou de incorporação (embedding) maiores que 1 MiB, portanto, o custo por token pode parecer alto onde essas respostas são comuns. Compare as taxas dentro de uma carga de trabalho em vez de entre cargas não relacionadas.