生产环境中的追踪
机器学习项目并不会在首次发布后就结束。持续的监控和逐步改进对于长期成功至关重要。MLflow 追踪为您的生产应用程序提供可观测性,支持持续改进的迭代过程。
在生产环境监控方面,追踪还有许多额外的考量,例如可伸缩性、安全性和成本。此外,在实际软件运行中,仅监控机器学习模型是远远不够的。工程团队需要监控整个产品中的多个服务,并确保它能为最终用户带来预期价值。因此,MLflow 借助 OpenTelemetry 标准化的力量,支持与各种可观测性解决方案集成,如 Grafana、Datadog、New Relic 等。
自托管追踪服务器
当然,您可以继续使用 MLflow 追踪服务器存储生产环境的追踪数据。然而,追踪服务器针对离线体验进行了优化,通常不适合处理超大规模流量。因此,我们建议在生产环境监控场景中使用另外两种选项。
如果您选择在生产环境继续使用追踪服务器,我们强烈建议在可伸缩的数据库和制品存储之上使用基于 SQL 的追踪服务器,因为这对写入和查询性能至关重要。更多详情请参考追踪服务器设置指南。此外,追踪服务器默认对追踪数据使用无限期保留,因此建议使用 SDK 或 REST API 设置定期删除任务。
OpenTelemetry Collector
MLflow 生成的追踪数据兼容 OpenTelemetry 追踪规范。因此,MLflow 追踪数据可以导出到支持 OpenTelemetry 的各种可观测性解决方案。
默认情况下,MLflow 将追踪数据导出到 MLflow 追踪服务器。要启用将追踪数据导出到 OpenTelemetry Collector,请在开始任何追踪之前将 OTEL_EXPORTER_OTLP_ENDPOINT
环境变量(或 OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
)设置为 OpenTelemetry Collector 的目标 URL。
import mlflow
import os
# Set the endpoint of the OpenTelemetry Collector
os.environ["OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"] = "http://localhost:4317/v1/traces"
# Optionally, set the service name to group traces
os.environ["OTEL_SERVICE_NAME"] = "<your-service-name>"
# Trace will be exported to the OTel collector at http://localhost:4317/v1/traces
with mlflow.start_span(name="foo") as span:
span.set_inputs({"a": 1})
span.set_outputs({"b": 2})
MLflow 只将追踪数据导出到一个目的地。配置 OTEL_EXPORTER_OTLP_ENDPOINT
环境变量后,MLflow 将不会将追踪数据导出到 MLflow 追踪服务器,您也将在 MLflow UI 中看不到追踪数据。
同样,如果您将模型部署到启用追踪的 Databricks 模型服务,使用 OpenTelemetry Collector 将导致追踪数据不会记录在推理表中。
点击以下图标,了解如何为您的特定可观测性平台设置 OpenTelemetry Collector。
配置
MLflow 使用标准的 OTLP Exporter 将追踪数据导出到 OpenTelemetry Collector 实例。因此,您可以使用 OpenTelemetry 支持的所有配置。以下示例配置 OTLP Exporter 使用 HTTP 协议而不是默认的 gRPC,并设置自定义头部
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT="http://localhost:4317/v1/traces"
export OTEL_EXPORTER_OTLP_TRACES_PROTOCOL="http/protobuf"
export OTEL_EXPORTER_OTLP_TRACES_HEADERS="api_key=12345"
Databricks Managed MLflow
如果您正在使用 Databricks Managed MLflow 构建机器学习模型,生产环境追踪的设置很简单。将模型部署到 Databricks 模型服务端点时
- 勾选 “Enable Tracing”(启用追踪) 复选框或手动将
ENABLE_MLFLOW_TRACING
环境变量设置为True
。 - 为服务终端启用推理表。
这样一来,MLflow 会将追踪数据以及请求和响应日志导出到服务终端对应的表中。
由于推理表是由 Unity Catalog 管理的 Delta Table,它提供了极高的可伸缩性和细粒度的访问控制,是安全存储追踪数据的理想位置。有关此设置的更多详细信息,请参阅Databricks MLflow Tracing 文档。