使用跟踪
从 3.2.0 版本开始,MLflow 默认会收集匿名化的使用数据。这些数据不包含任何敏感信息或个人身份信息。
根据 GDPR 和其他隐私法规,MLflow 不会收集任何包含个人信息的数据。作为 Linux 基金会项目,MLflow 遵循 LF 遥测数据收集与使用政策。该实施方案已通过 Linux 基金会的审查与批准,批准的建议书记录在官方政策的 已完成审查 (Completed Reviews) 部分。有关收集内容的详细信息,请参阅下方的 数据说明部分。
遥测功能仅在 开源版 MLflow 中启用。如果您通过托管服务或分发版使用 MLflow,请咨询您的供应商以确定在您的环境中是否启用了遥测功能。在任何情况下,您都可以按照我们文档中提供的指导选择退出。
为什么要收集数据?
MLflow 使用匿名遥测来了解功能的使用情况,这有助于指导开发优先级并改进库。这些数据有助于我们识别哪些功能最有价值,以及应重点关注哪些错误修复或功能增强。
GDPR 合规性
根据《通用数据保护条例》(GDPR),数据控制者和处理者有责任谨慎、透明且负责任地处理个人数据。
MLflow 通过以下方式遵守 GDPR:
- 不收集个人数据:收集的遥测数据已完全匿名化,不包含任何个人或敏感信息(例如用户名、IP 地址、文件名、参数或模型内容)。MLflow 为每个会话生成一个随机 UUID 用于聚合使用事件,该 ID 无法用于识别或追踪单个用户。
- 目的限制:数据仅用于根据聚合的功能使用模式来改进 MLflow 项目。
- 数据最小化:仅收集项目优先级所需的最低限度元数据(例如:功能开关状态、使用的 SDK/平台、版本信息)。
- 用户控制:用户可以随时通过设置环境变量 MLFLOW_DISABLE_TELEMETRY=true 或 DO_NOT_TRACK=true 来选择退出遥测。MLflow 会立即遵循这些设置,无需重启。
- 透明度:遥测端点和行为已公开记录,MLflow 用户可以检查或拦截相关的网络调用。
如有进一步咨询或数据保护相关问题,用户可以在 MLflow GitHub 仓库 上提交 issue。
收集哪些数据?
MLflow 仅收集非敏感的匿名数据,以帮助我们更好地了解使用模式。下文概述了此版本 MLflow 当前收集的数据。您可以查看 源代码 中确切的收集数据。
数据说明
| 数据元素 | 说明 | 示例 | 为何追踪此项 |
|---|---|---|---|
| 唯一会话 ID | 为每个会话(定义为每次导入 MLflow)创建一个随机生成的、不可识别个人的 UUID | 45e2751243e84c7e87aca6ac25d75a0d | 作为当前 MLflow 会话中数据的标识符 |
| 唯一安装 ID | 为每个安装(定义为首次导入 MLflow 时)创建一个随机生成的、不可识别个人的 UUID。于 MLflow 3.7.0 添加。 | 45e2751243e84c7e87aca6ac25d75a0d | 作为当前 MLflow 安装中数据的标识符 |
| 源 SDK | 当前使用的 SDK 名称 | mlflow | mlflow-skinny | mlflow-tracing | 了解不同 MLflow SDK 的采用情况并确定改进领域 |
| MLflow 版本 | 当前 SDK 版本 | 3.2.0 | 识别特定版本的使用模式,并支持错误修复或弃用决策 |
| Python 版本 | 当前 Python 版本 | 3.10.16 | 确保跨 Python 版本的兼容性,并指导测试或升级建议 |
| 操作系统 | MLflow 运行所在的操作系统 | macOS-15.4.1-arm64-arm-64bit | 了解平台特定的使用情况并检测平台依赖性问题 |
| 追踪 URI 方案 | 当前追踪 URI 的方案 | file | sqlite | mysql | postgresql | mssql | https | http | custom_scheme | None | 确定最常用的追踪后端并优化后端支持 |
| 事件名称 | 被追踪的事件名称(参见下表了解哪些事件被追踪) | create_experiment | 衡量功能使用情况和改进 |
| 事件状态 | 事件是否成功 | success | failure | unknown | 识别常见的故障点并提高可靠性和错误处理能力 |
| 时间戳(纳秒) | 事件发生的时间 | 1753760188623715000 | 作为事件的标识符 |
| 持续时间 | 事件调用所需的时间(毫秒) | 1000 | 监控性能趋势并检测响应时间的回归 |
| 参数(布尔值或枚举值) | 参见下表了解每个事件收集的参数 | create_logged_model 事件: {"flavor": "langchain"} | 更好地了解每个事件的使用模式 |
被追踪事件
不收集有关特定模型、代码或权重的详细信息。 仅记录 `Tracked Parameters`(被追踪参数)列下方的参数;对于 `Tracked Parameters` 列为 None 的事件,仅记录事件名称。如果存在 "MLFLOW_EXPERIMENT_ID" 环境变量,则将其作为参数追踪。如需获取完整的被追踪事件列表,请参阅 源代码。
| 事件名称 | 被追踪参数 | 示例 |
|---|---|---|
| create_experiment | 创建的实验 ID(随机 uuid 或整数) | {"experiment_id": "0"} |
| create_run | MODULES_TO_CHECK_IMPORT 中的包是否被导入;创建运行 (run) 时使用的实验 ID | {"imports": ["sklearn"], "experiment_id": "0"} |
| create_logged_model | 模型类型 (Flavor)(例如 langchain, sklearn) | {"flavor": "langchain"} |
| get_logged_model | MODULES_TO_CHECK_IMPORT 中的包是否被导入 | {"imports": ["sklearn"]} |
| create_registered_model | 无 | 无 |
| create_model_version | 无 | 无 |
| create_prompt | 无 | 无 |
| load_prompt | 是否使用了别名 | {"uses_alias": True} |
| start_trace | 无 | 无 |
| traces_received_by_server | 提交追踪的客户端类型(已脱敏)及接收到的已完成追踪的数量 | {"source": "MLFLOW_PYTHON_CLIENT", "count": 3} |
| log_assessment | 评估的类型和来源 | {"type": "feedback", "source_type": "CODE"} |
| 进行评估 | 无 | 无 |
| create_webhook | Webhook 的实体 | {"events": ["model_version.created"]} |
| genai_evaluate | 在 GenAI Evaluate 中使用的内置评分器 | {"builtin_scorers": ["relevance_to_query"]} |
| prompt_optimization | 优化器类型、Prompt 数量和评分器数量 | {"optimizer_type": True, "prompt_count": 5, "scorer_count": 1} |
| log_dataset | 无 | 无 |
| log_metric | 是否开启同步模式 | {"synchronous": False} |
| log_param | 是否开启同步模式 | {"synchronous": True} |
| log_batch | 关于是否记录了指标、参数或标签的信息,以及记录模式 | {"metrics": False, "params": True, "tags": False, "synchronous": False} |
| invoke_custom_judge_model | 判别模型 (Judge model) 提供商 | {"model_provider": "databricks"} |
| make_judge | 模型提供商(若格式为 provider,则从模型字符串中提取:model) | {"model_provider": "openai"} |
| align_judge | 提供的追踪数量和优化器类型 | {"trace_count": 100, "optimizer_type": "AlignmentOptimizer"} |
| autologging | 类型 (Flavor) 和元数据 | {"flavor": "openai", "log_traces": True, "disable": False} |
| ai_command_run | 命令键和调用上下文(cli 或 mcp) | {"command_key": "genai/analyze_experiment", "context": "cli"} |
| gateway_start | 无 | 无 |
| gateway_create_endpoint | 是否设置了回退配置、路由策略及模型配置数量 | {"has_fallback_config": true, "routing_strategy": "REQUEST_BASED_TRAFFIC_SPLIT", "num_model_configs": 2} |
| gateway_update_endpoint | 是否设置了回退配置、路由策略及模型配置数量(若未提供则为 null) | {"has_fallback_config": false, "routing_strategy": "ROUND_ROBIN", "num_model_configs": 1} |
| gateway_delete_endpoint | 无 | 无 |
| gateway_get_endpoint | 无 | 无 |
| gateway_list_endpoints | 是否按提供商进行过滤 | {"filter_by_provider": true} |
| gateway_create_secret | 提供商名称 | {"provider": "openai"} |
| gateway_update_secret | 无 | 无 |
| gateway_delete_secret | 无 | 无 |
| gateway_list_secrets | 是否按提供商进行过滤 | {"filter_by_provider": false} |
| gateway_invocation | 是否启用了流式传输以及调用类型 | {"is_streaming": true, "invocation_type": "mlflow_chat_completions"} |
| ui_event | UI 交互事件。有关各种元数据元素的描述,请参见下表 | { "eventType": "onClick", "componentViewId": "88fc9edd-5e9e-4a17-abd2-c543f505b8eb", "componentId": "mlflow.prompts.list.create", "componentType": "button", timestamp_ns: 1765784028467000000 } |
UI 交互元数据
下表描述了可能随特定 UI 交互日志一起收集的元数据列表。
| 元数据元素 | 说明 | 示例 |
|---|---|---|
| 交互式 UI 元素的组件 ID | UI 中交互式元素(例如按钮、开关、链接、输入字段)的 ID 字符串。当点击、键入或以其他方式与此类元素交互时,会生成一条日志。可以通过此搜索查询找到完整的组件 ID 值列表。 | mlflow.prompts.list.create(提示页面上“创建提示”按钮的标识符) |
| 事件类型 | 描述交互性质的枚举分类值 | onView, onClick, onValueChange |
| 组件类型 | 描述发生交互的组件类型的枚举分类值 | button, alert, banner, radio, input, ... |
| 组件视图 ID | 每次 UI 元素重新渲染时都会重新生成的随机 UUID | 774db636-5cfa-4ce8-8f56-7e7126dc3439 |
| 时间戳 | 交互发生时的客户端时间戳 | 1765789548484000. |
为什么 MLflow 遥测采用选择退出 (Opt-Out) 机制?
MLflow 使用选择退出 (Opt-Out) 的遥测模型,旨在根据真实使用模式帮助改进所有用户的平台。默认收集匿名使用数据使我们能够:
- 了解 MLflow 在广泛的环境和工作流程中是如何被使用的
- 更有效地识别常见痛点并确定功能改进领域
- 衡量变更的影响,并确保它们能为更广泛的社区改善体验
如果遥测采用选择加入 (Opt-In) 机制,则只有一小部分自选用户会被涵盖,从而导致偏差并可能导致优先级错位。我们致力于透明度和用户选择权。遥测已清晰记录、匿名化,并可通过配置随时轻松禁用。这种方法帮助我们将 MLflow 变得更好,同时让您拥有完全的控制权。有关更多信息,请查看 我们如何使用这些数据 部分。
如何选择退出?
MLflow 支持通过以下任一环境变量选择退出遥测:
- MLFLOW_DISABLE_TELEMETRY=true
- DO_NOT_TRACK=true
设置其中任何一个都将 立即禁用遥测,无需重新导入 MLflow 或重启会话。
MLflow 会自动在 某些 CI 环境 中禁用遥测。如果您需要对其他 CI 环境的支持,请 在我们的 GitHub 仓库上提交 issue。
- CI
- Github Actions
- CircleCI
- GitLab CI/CD
- Jenkins Pipeline
- Travis CI
- Azure Pipelines
- BitBucket
- AWS CodeBuild
- BuildKite
- ...
设置范围
- 该环境变量仅在明确设置或继承它的进程中生效。
- 如果您从干净的环境中启动子进程,这些子进程可能不会继承您的 shell 环境,导致遥测可能保持启用状态。例如:
subprocess.run([...], env={}) - 在运行
mlflow server之前设置此环境变量也会禁用所有 UI 遥测。
确保所有环境中均禁用遥测的建议:
- 将变量添加到您的 shell 启动文件 (~/.bashrc, ~/.zshrc 等):
export MLFLOW_DISABLE_TELEMETRY=true - 如果您正在使用子进程或隔离环境,请使用 dotenv 管理器或在启动时显式传递该变量。
如何验证遥测已禁用?
使用以下代码来验证遥测是否已禁用。
from mlflow.telemetry import get_telemetry_client
assert get_telemetry_client() is None, "Telemetry is enabled"
如何为您的组织选择退出?
除了设置上述环境变量外,组织还可以通过阻止对 mlflow-telemetry.io 域名的网络访问来选择退出遥测。当此域名无法访问时,遥测将被禁用。
退出 UI 遥测
如上所述,MLflow 服务器管理员可以设置 MLFLOW_DISABLE_TELEMETRY 或 DO_NOT_TRACK 环境变量,在服务器全局禁用 UI 遥测。但是,如果您不是管理员(即无法设置环境变量),您仍然可以通过访问 MLflow UI 中的“设置”页面个人选择退出 UI 遥测(引入于 MLflow 3.8.0)。
将开关设置为“关闭”将从您的设备禁用 UI 遥测,即使管理员未在服务器端选择退出。
我们如何使用这些数据?
我们聚合匿名使用数据,并计划通过公共仪表板与社区分享见解。您将能够了解 MLflow 功能的使用情况,并通过贡献帮助改进它们。