Pular para o conteúdo principal

Consultar rastreamentos MLflow armazenados no Unity Catalog

info

Beta

Este recurso está em versão Beta. Os administradores do espaço de trabalho podem controlar o acesso a este recurso na página de Pré-visualizações . Veja as prévias do Gerenciador Databricks.

Ao armazenar dados de rastreamento no formato OpenTelemetry no Unity Catalog, você pode consultar os rastreamentos usando o SDK Python MLflow ou por meio Databricks SQL utilizando as tabelas e visualizações Unity Catalog .

Pré-requisitos

Rastreamento de consultas usando o SDK Python do MLflow

Utilize o SDK Python do MLflow para pesquisar e carregar objetos de rastreamento.

Python
import os
import mlflow
from mlflow.entities.trace_location import UnityCatalog

# Specify the name of a catalog and schema containing traces
catalog_name = "<UC_CATALOG>"
schema_name = "<UC_SCHEMA>"
table_prefix = "<UC_TABLE_PREFIX>"

mlflow.set_tracking_uri("databricks")
mlflow.set_experiment(
experiment_name="...",
trace_location=UnityCatalog(
catalog_name=catalog_name,
schema_name=schema_name,
table_prefix=table_prefix,
), # optional for existing experiments
)

# Specify the ID of a Databricks SQL warehouse for executing search queries
os.environ["MLFLOW_TRACING_SQL_WAREHOUSE_ID"] = "<SQL_WAREHOUSE_ID>"

traces = mlflow.search_traces(
filter_string="trace.status = 'OK'",
order_by=["timestamp_ms DESC"],
include_spans=False,
)
print(traces)

Para carregar o rastreamento encontrado:

Python
import os
import mlflow

mlflow.set_tracking_uri("databricks")

# Specify the name of a catalog and schema containing traces
catalog_name = "<UC_CATALOG>"
schema_name = "<UC_SCHEMA>"
table_prefix = "<UC_TABLE_PREFIX>"
# Specify the trace UUID (example: "13ffa97d571048d69d21da12240d5863")
trace_uuid = "<TRACE_UUID>"

# Specify the ID of a Databricks SQL warehouse for executing search queries
os.environ["MLFLOW_TRACING_SQL_WAREHOUSE_ID"] = "<SQL_WAREHOUSE_ID>"

trace = mlflow.get_trace(
trace_id=f"trace:/{catalog_name}.{schema_name}.{table_prefix}/{trace_uuid}"
)
print(trace)

Rastreamento de consultas usando Databricks SQL

Embora os dados subjacentes sejam armazenados em formatos de tabela compatíveis com OpenTelemetry, o serviço MLflow cria automaticamente uma visualização Databricks SQL em paralelo a eles. Essas visualizações transformam os dados do OpenTelemetry no formato MLflow .

Para grandes volumes de rastreamento, o desempenho das consultas nessas visualizações pode ser prejudicado. Para manter o desempenho, crie uma viewmaterializada sobre eles e atualize view a incrementalmente. Para melhor desempenho no uso recente de dados, a API para consultar rastreamentos.

Databricks recomenda consultar a visualização ou usar a API em vez de depender das tabelas subjacentes, pois os esquemas dessas tabelas podem mudar com o tempo.

{table_prefix}_trace_unified

Esta view oferece uma visão unificada de todos os dados de rastreamento agrupados por cada ID de rastreamento. Cada linha contém os dados brutos do intervalo e os metadados de informações de rastreamento. Os metadados incluem tags MLflow, metadados e avaliações.

Esquema

Python
trace_id: STRING
client_request_id: STRING
request_time: TIMESTAMP
state: STRING
execution_duration_ms: DECIMAL(30,9)
request: STRING
response: STRING
trace_metadata: MAP<STRING, STRING>
tags: MAP<STRING, STRING>
spans: LIST<STRUCT>
trace_id: STRING
span_id: STRING
trace_state: STRING
parent_span_id: STRING
flags: INT
name: STRING
kind: STRING
start_time_unix_nano: BIGINT
end_time_unix_nano: BIGINT
attributes: MAP<STRING, STRING>
dropped_attributes_count: INT
events: LIST<STRUCT>
time_unix_nano: BIGINT
name: STRING
attributes: MAP<STRING, STRING>
dropped_attributes_count: INT
dropped_events_count: INT
links: LIST<STRUCT>
trace_id: STRING
span_id: STRING
trace_state: STRING
attributes: MAP<STRING, STRING>
dropped_attributes_count: INT
flags: INT
dropped_links_count: INT
status: STRUCT
message: STRING
code: STRING
resource: STRUCT
attributes: MAP<STRING, STRING>
dropped_attributes_count: INT
resource_schema_url: STRING
instrumentation_scope: STRUCT
name: STRING
version: STRING
attributes: MAP<STRING, STRING>
dropped_attributes_count: INT
span_schema_url: STRING
assessments: LIST<STRUCT>
assessment_id: STRING
trace_id: STRING
assessment_name: STRING
source: STRUCT
source_id: STRING
source_type: STRING
create_time: TIMESTAMP
last_update_time: TIMESTAMP
expectation: STRUCT
value: STRING
serialized_value: STRUCT
serialization_format: STRING
value: STRING
stack_trace: STRING
feedback: STRUCT
value: STRING
error: STRUCT
error_code: STRING
error_message: STRING
stack_trace: STRING
rationale: STRING
metadata: MAP<STRING, STRING>
span_id: STRING
overrides: STRING
valid: STRING

{table_prefix}_trace_metadata

Esta view contém apenas as tags, metadados e avaliações MLflow agrupadas por ID de rastreamento e tem um desempenho melhor do que a view unificada para recuperar dados MLflow .

Esquema

Python
trace_id: STRING
client_request_id: STRING
tags: MAP<STRING, STRING>
trace_metadata: MAP<STRING, STRING>
assessments: LIST<STRUCT>
assessment_id: STRING
trace_id: STRING
assessment_name: STRING
source: STRUCT
source_id: STRING
source_type: STRING
create_time: TIMESTAMP
last_update_time: TIMESTAMP
expectation: STRUCT
value: STRING
serialized_value: STRUCT
serialization_format: STRING
value: STRING
stack_trace: STRING
feedback: STRUCT
value: STRING
error: STRUCT
error_code: STRING
error_message: STRING
stack_trace: STRING
rationale: STRING
metadata: MAP<STRING, STRING>
span_id: STRING
overrides: STRING
valid: STRING

Formatos de dados de anotação do MLflow

Os dados para entidades de rastreamento MLflow como metadados, tags, avaliações e links para execução, são armazenados na tabela {table_prefix}_otel_annotations . Cada entidade é armazenada como uma única linha com um tipo annotation_type e seus campos são divididos em colunas de nível superior (name, value, comment, metadata). A tabela de anotação é somente de adição com exclusões lógicas, portanto você deve remover duplicados na recuperação, pegando a linha mais recente por annotation_id (ordenando por updated_at decrescente) e filtrando as linhas onde deleted_at está definido. As colunas value e metadata são VARIANT (JSON).

A tabela possui as seguintes colunas:

Python
annotation_id: STRING
target_type: STRING ("TRACE" or "SPAN")
target_id: STRING ("{trace_id}" for TRACE, "{trace_id}:{span_id}" for SPAN)
annotation_type: STRING ("METADATA", "TAG", "FEEDBACK", "EXPECTATION", "RUN_LINK")
name: STRING
value: VARIANT
comment: STRING
metadata: VARIANT
created_at: TIMESTAMP
created_by: STRING
updated_at: TIMESTAMP
updated_by: STRING
deleted_at: TIMESTAMP
deleted_by: STRING

Metadados do MLflow

Existe apenas uma dessas linhas por traço. A coluna value é uma estrutura JSON contendo o ID da solicitação do cliente do rastreamento, o mapa de metadados e as pré-visualizações de solicitação/resposta.

Python
annotation_type: "METADATA"
target_type: "TRACE"
name: "metadata"
value: VARIANT (includes `client_request_id`, `trace_metadata`, `request_preview`, `response_preview`)

tagsMLflow

Cada tag é armazenada como uma linha separada. Você pode remover duplicados dentro de cada rastreamento usando o atributo annotation_id , que é derivado deterministicamente do ID do rastreamento e key tag .

Python
annotation_type: "TAG"
target_type: "TRACE"
name: STRING (the tag key)
value: STRING (the tag value)

Avaliações do MLflow

Cada avaliação é armazenada como uma linha FEEDBACK ou EXPECTATION dependendo do seu tipo. Você pode remover duplicados dentro de cada rastreamento usando o atributo annotation_id , que corresponde ao ID da avaliação. A justificativa é armazenada na coluna de nível superior comment . Os metadados de avaliação fornecidos pelo usuário são armazenados na coluna metadata junto com os campos internos do MLflow-gerenciar (chave prefixada com mlflow.), que você deve ignorar ao ler os metadados do usuário.

Python
annotation_type: "FEEDBACK" | "EXPECTATION"
target_type: "TRACE"
name: STRING (the assessment name)
value: VARIANT (feedback value, expectation value, or JSON-serialized expectation string)
comment: STRING (the rationale)
metadata: VARIANT (user-supplied assessment metadata)

Cada ligação entre um rastreamento e uma execução do MLflow é armazenada como uma linha separada. Você pode remover duplicatas dentro de cada rastreamento usando o atributo annotation_id , que é derivado deterministicamente do ID do rastreamento e do ID da execução.

Python
annotation_type: "RUN_LINK"
target_type: "TRACE"
name: "run_link"
value: STRING (the run ID)

Analisar o desempenho da consulta

Para diagnosticar consultas lentas, inspecione os perfis de consulta no histórico de consultas do SQL warehouse :

  1. Acesse a página SQL Warehouse no seu workspace Databricks .
  2. Selecione seu SQL warehouse e clique na tab Histórico de consultas .
  3. Procure por consultas que especifiquem MLflow como a origem.
  4. Clique em uma consulta para view seu perfil.

No perfil da consulta, verifique o seguinte:

  • Tempo de programação : Se o tempo de programação for alto, suas consultas estão aguardando devido à alta carga no data warehouse. Alterne para um SQL warehouse diferente usando o menu suspenso na interface do usuário MLflow ou configure um repositório diferente em seu cliente.
  • Desempenho geral da consulta : Para consultas consistentemente lentas, use um SQL warehousemaior, reduza os limites superiores e inferiores em trace.timestamp_ms e remova outros predicados de filtro sempre que possível.