Consultar rastreamentos MLflow usando SQL MLflow Databricks SQL
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
- Armazene os rastreamentos nas tabelas Unity Catalog e gere os rastreamentos. Consulte Armazenar rastreamentos MLflow no Unity Catalog.
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_IDpara especificar um data warehouseDatabricks SQL para executar consultas de pesquisa. - Use o argumento
locationsdemlflow.search_tracespara 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.
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:
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
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
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.
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 .
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 .
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")
Links de execução do MLflow
Representa uma ligação entre um rastreamento e uma execução do MLflow. Pode ser desduplicado por trace_id usando o atributo run_id .
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.
SQLOPTIMIZE 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 :
- Acesse a página SQL Warehouse no seu workspace Databricks .
- Selecione seu SQL warehouse e clique na tab Histórico de consultas .
- Procure por consultas que especifiquem MLflow como a origem.
- 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_msem sua consulta e removendo outros predicados de filtro.