Pular para o conteúdo principal

Consultar rastreamentos MLflow usando SQL MLflow Databricks SQL

info

Visualização

O armazenamento de rastreamentos MLflow no Unity Catalog está em versão beta.

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.

  • Use a variável de ambiente MLFLOW_TRACING_SQL_WAREHOUSE_ID para especificar um data warehouseDatabricks SQL para executar consultas de pesquisa.
  • Use o argumento locations de mlflow.search_traces para especificar um ou mais experimentos do MLflow ou esquemas do Unity Catalog que contenham rastreamentos.
  • Você pode especificar o nome de um esquema do Unity Catalog ou o ID de um experimento do MLflow vinculado a um esquema do Unity Catalog. Consulte Configuração: Criar tabelas UC e vincular um experimento.
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>"

# 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(
locations=[f"{catalog_name}.{schema_name}"],
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>"
# 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}/{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 . Em grandes volumes de dados, as consultas nessas visualizações não manterão o mesmo desempenho e deverão ser materializadas incrementalmente.

Para obter melhor desempenho no uso recente de dados, a API para consultar rastreamentos e consulte considerações de desempenho para orientação.

mlflow_experiment_trace_unified

Esta view fornece uma view 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

mlflow_experiment_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 registro de log do MLflow

Os dados das entidades de rastreamento MLflow como metadados, tags, avaliações e links para execução, são armazenados na tabela de logs do OpenTelemetry. Esses dados são armazenados como registros de log com um event_name correspondente, e seus campos são armazenados na coluna de atributos. A tabela de logs é somente para acréscimo, portanto, você deve remover as duplicatas de cada um desses eventos ao recuperá-los, garantindo que a versão mais recente esteja atualizada. Todos os atributos são serializados como valores de string a partir de seu tipo original.

Metadados do MLflow

Existe apenas um desses eventos por registro.

Python
event_name: "genai.trace.metadata"
trace_id: STRING
time_unix_nano: BIGINT
attributes: STRUCT
client_request_id: STRING
trace_metadata: STRING (JSON-serialized metadata map)

tagsMLflow

Cada atualização tag é serializada como um registro de log separado. Você pode remover duplicados dentro de cada rastreamento usando o atributo key .

Python
event_name: "genai.trace.tag"
trace_id: STRING
time_unix_nano: BIGINT
attributes: STRUCT
key: STRING
value: STRING
deleted: STRING (boolean "true"/"false")

Avaliações do MLflow

O MLflow serializa cada atualização de avaliação como um registro de log separado. Você pode remover duplicados dentro de cada rastreamento usando o atributo assessment_id .

Python
event_name: "genai.assessments.snapshot"
trace_id: STRING
span_id: STRING
time_unix_nano: BIGINT
attributes: STRUCT
assessment_id: STRING
assessment_name: STRING
source.source_id: STRING
source.source_type: STRING
create_time: STRING (serialized decimal number)
last_update_time: STRING (serialized decimal number)
expectation.value: STRING
expectation.serialized_value.serialization_format: STRING
expectation.serialized_value.value: STRING
feedback.value: STRING
feedback.error.error_code: STRING
feedback.error.error_message: STRING
feedback.error.stack_trace: STRING
rationale: STRING
metadata.<key>: STRING (one attribute per metadata key)
overrides: STRING
valid: STRING (boolean "true"/"false")

Representa uma ligação entre um rastreamento e uma execução do MLflow. Pode ser desduplicado por trace_id usando o atributo run_id .

Python
event_name: "genai.run.link"
trace_id: STRING
time_unix_nano: BIGINT
attributes: STRUCT
run_id: STRING
deleted: STRING (boolean "true"/"false", true if the run link was removed)

Considerações sobre desempenho

  • À medida que o tamanho dos dados de rastreamento ultrapassa 2 TB, as consultas na visualização Databricks SQL específica do MLflow podem não manter o desempenho e devem ser materializadas incrementalmente.

  • Se as consultas de pesquisa estiverem lentas ou expirando, considere otimizar as tabelas OpenTelemetry subjacentes usando Z-ordering

    Para habilitar Z-ordering, programe um Job para executar a seguinte consulta em suas tabelas. O trabalho deve ser executado pelo menos a cada hora. Para tabelas grandes que exigem acesso em tempo real, considere executá-las continuamente. Como Z-ordering é incremental, a primeira execução pode demorar mais do que as execuções subsequentes.

    SQL
    OPTIMIZE catalog.schema.mlflow_experiment_trace_otel_logs ZORDER BY (time_unix_nano, trace_id);
    OPTIMIZE catalog.schema.mlflow_experiment_trace_otel_spans ZORDER BY (start_time_unix_nano, trace_id);

Analisar o desempenho da consulta

Para diagnosticar consultas lentas, você pode inspecionar os perfis de consulta no histórico de consultas 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 longo: Se o tempo de programação for alto, suas consultas estão aguardando devido ao uso intenso do seu data warehouse. Considere mudar para um SQL warehouse diferente usando o menu suspenso na interface do usuário MLflow ou configurando um repositório diferente em seu cliente.
  • Desempenho geral da consulta: Para consultas consistentemente lentas, considere usar um SQL warehouse maior com mais recursos compute , incluindo limites superiores e inferiores mais rigorosos em trace.timestamp_ms em sua consulta e removendo outros predicados de filtro.