MLflow MlflowClient 完整实战指南:以 CRUD 方式统一管理 Experiments、Runs、模型注册表与 Traces
2026/9/10 18:11:30 网站建设 项目流程

MLflow MlflowClient 完整实战指南:以 CRUD 方式统一管理 Experiments、Runs、模型注册表与 Traces

【免费下载链接】mlflowThe open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and optimize production-quality AI applications while controlling costs and managing access to models and data.项目地址: https://gitcode.com/GitHub_Trending/ml/mlflow

导读

mlflow.client是 MLflow 提供的Python 级低层 CRUD 接口,它不维护"当前活动 Run"这类全局状态,而是将每一个调用直接翻译为对 MLflow Tracking 服务与 Model Registry 服务的 REST API 请求。本文围绕 mlflow.client.rst 展开,结合 client.py 与 tracking/client.py 的源码实现,系统讲解MlflowClient的构造与 URI 解析规则、Experiments 与 Runs 的完整生命周期、指标/参数/标签/Artifact 的写入与检索、模型注册表的版本化治理,以及 Prompt Registry 与 Tracing 等 GenAI 能力。读完本文,你将掌握用纯代码方式编程式地管理 MLflow 后端所有核心对象的能力,并理解其与高层 fluent API 的边界。

一、mlflow.client:模块定位与 MlflowClient 的引入方式

1.1 一个极简但完整的模块

mlflow/client.py全文件仅十余行,其全部职责是导出唯一符号MlflowClient

""" The ``mlflow.client`` module provides a Python CRUD interface to MLflow Experiments, Runs, Model Versions, and Registered Models. This is a lower level API that directly translates to MLflow REST API calls. For a higher level API for managing an "active run", use the :py:mod:`mlflow` module. """ from mlflow.tracking.client import MlflowClient __all__ = [ "MlflowClient", ]

这段源码的 docstring 是本模块定位的权威说明,包含三层含义:

  • 职责范围:Experiments、Runs、Model Versions、Registered Models 四类对象的 CRUD;
  • 实现方式:直接对应 MLflow REST API 调用(低层 API);
  • 与高层 API 的边界:需要"活动 Run"自动管理时,请使用mlflow模块(即mlflow/tracking/fluent.py中的 fluent API,如mlflow.start_run())。

同时,MlflowClient也会在包顶层被导出(见 mlflow/init.py),因此下面两种写法完全等价:

from mlflow.client import MlflowClient from mlflow import MlflowClient # 更常用

1.2 统一入口背后的分层架构

从 tracking/client.py 的类定义可以看到,MlflowClient是一个"统一外观(Facade)",其内部由多个独立实现协作:

  • TrackingServiceClient:负责 Experiments、Runs、Metrics、Params、Tags、Artifacts 等追踪操作;
  • ModelRegistryClient:负责 Registered Models、Model Versions 等注册表操作,由_get_registry_client()懒加载创建;
  • WorkspaceProviderClient:负责工作区(Workspace)CRUD,同样懒加载;
  • TracingClient:负责 Trace/Span 的写入与查询。

这一分层结构提供了统一 API 的同时保留各子系统的独立实现,是理解MlflowClient内部调用链的关键。

二、构造 MlflowClient:三大 URI 与解析规则

2.1 构造函数签名

def __init__( self, tracking_uri: str | None = None, registry_uri: str | None = None, workspace_store_uri: str | None = None, ):

三个参数的含义与默认解析规则如下(源码见 tracking/client.py):

参数含义未指定时的解析顺序
tracking_uri本地或远端 Tracking Server 地址回落到mlflow.tracking.set_tracking_uri设定的服务
registry_uri本地或远端模型注册表服务地址先回落mlflow.tracking.set_registry_uri,仍未设置则使用 tracking_uri
workspace_store_uriWorkspace 提供方后端地址默认取 tracking_uri,也可单独指向专用 workspace store

常见 URI 形式包括本地文件存储./mlruns、SQLitesqlite:///mlruns.db、PostgreSQLpostgresql://user:pass@host:port/db、远端 HTTPhttp://host:port等。构造时会依次调用utils._resolve_tracking_uriregistry_utils._resolve_registry_uriworkspace_utils.resolve_workspace_store_uri完成解析。

2.2 一个典型的初始化示例

import mlflow from mlflow import MlflowClient # 先通过 fluent API 设定全局 tracking uri,之后无需再传参 mlflow.set_tracking_uri("sqlite:///mlruns.db") client = MlflowClient() # tracking_uri 与 registry_uri 均回落为 sqlite:///mlruns.db print(client.tracking_uri) # 通过 tracking_uri 属性读取 print(client.get_workspace_store_uri()) # workspace store 地址(恒非空)

其中tracking_uri属性直接返回内部 TrackingServiceClient 的 URI(tracking/client.py);get_workspace_store_uri()恒返回非空值,因为未显式指定 workspace URI 时会回落为 tracking URI。

2.3 关于 lazy 初始化与异常

ModelRegistryClientWorkspaceProviderClient均采用懒加载:第一次调用注册表或工作区 API 时才实例化。若注册表 URI 指向不支持的后端(如 FileStore),会抛出MlflowException,错误信息会列出该 store 支持的 URI scheme(见 tracking/client.py);工作区后端不支持的场景同理(见 tracking/client.py)。

三、Experiments:实验的全生命周期管理

3.1 创建实验

create_experiment要求实验名唯一且大小写敏感,返回字符串形式的实验 ID:

from pathlib import Path from mlflow import MlflowClient client = MlflowClient() experiment_id = client.create_experiment( "Social NLP Experiments", artifact_location=Path.cwd().joinpath("mlruns").as_uri(), # 不传则由服务端决定默认位置 tags={"version": "v1", "priority": "P1"}, ) client.set_experiment_tag(experiment_id, "nlp.framework", "Spark NLP") experiment = client.get_experiment(experiment_id) print(f"Name: {experiment.name}") print(f"Experiment_id: {experiment.experiment_id}") print(f"Artifact Location: {experiment.artifact_location}") print(f"Tags: {experiment.tags}") print(f"Lifecycle_stage: {experiment.lifecycle_stage}")

源码与文档给出的典型输出(见 tracking/client.py):

Name: Social NLP Experiments Experiment_id: 1 Artifact Location: file:///.../mlruns Tags: {'version': 'v1', 'priority': 'P1', 'nlp.framework': 'Spark NLP'} Lifecycle_stage: active

注意tags字典会被转换为ExperimentTag实体随实验一起写入;实验名不支持复用,除非被数据库管理员永久删除。

3.2 检索实验

两个获取方法各有用处:

# 按 ID 获取,不存在则抛异常 exp = client.get_experiment(experiment_id) # 按名称获取(大小写敏感),不存在返回 None exp2 = client.get_experiment_by_name("Default") # 默认实验 ID 为 "0"

3.3 搜索实验:filter_string 与分页

search_experiments是筛选大量实验的推荐方式(tracking/client.py):

from mlflow.entities import ViewType client = MlflowClient() client.create_experiment("a", tags=None) client.create_experiment("b", tags=None) client.create_experiment("ab", tags={"k": "v"}) # 按名称精确匹配 experiments = client.search_experiments(filter_string="name = 'a'") # 仅查询已删除的实验 experiments = client.search_experiments(view_type=ViewType.DELETED_ONLY)

其参数语义:

  • view_typeViewType.ACTIVE_ONLY(默认)/DELETED_ONLY/ALL
  • max_results:单页最大条数(部分后端可能施加自身限制);
  • filter_string:支持namecreation_timelast_update_timetags.<tag_key>四类标识符;字符串属性与 tag 支持=!=LIKE(大小写敏感匹配)、ILIKE(大小写不敏感匹配);数值属性支持=!=<<=>>=;逻辑运算符支持AND。若 tag_key 含空格需用反引号包裹,如"tags.\extra key`"`;
  • order_by:可按experiment_idnamecreation_timelast_update_time排序,可附DESC/ASC后缀;未指定时默认["last_update_time DESC"](最近更新优先);
  • page_token:取上次返回PagedList.token属性继续翻页。

返回的PagedList[Experiment]通过token属性暴露下一页游标。

3.4 删除与恢复(软删除)

client.delete_experiment(experiment_id) # 软删除,lifecycle_stage 变为 deleted client.restore_experiment(experiment_id) # 恢复,除非已被永久删除

源码注释明确指出:删除是软删除,实验名不可复用,除非由数据库管理员做永久清除(见 tracking/client.py)。

四、Runs:以 CRUD 方式管理一次运行

4.1 创建与终止 Run(显式生命周期)

mlflow.start_run()不同,MlflowClient下的create_run只创建对象、不执行代码、也不改变全局"活动 Run"。因此使用它时必须显式调用set_terminated结束:

from mlflow import MlflowClient client = MlflowClient() tags = {"engineering": "ML Platform"} run = client.create_run("0", tags=tags, run_name="platform-run-24") print(f"Run tags: {run.data.tags}") print(f"Run id: {run.info.run_id}") print(f"Run name: {run.info.run_name}") print(f"lifecycle_stage: {run.info.lifecycle_stage}") print(f"status: {run.info.status}") # 显式终止,status 可取 FINISHED/KILLED/FAILED/RUNNING/SCHEDULED client.set_terminated(run.info.run_id, status="KILLED")

典型输出(见 tracking/client.py):

Run tags: {'engineering': 'ML Platform'} Experiment id: 0 Run id: 65fb9e2198764354bab398105f2e70c1 Run name: platform-run-24 lifecycle_stage: active status: RUNNING

create_runstart_time缺省取当前时间戳;set_terminatedstatus缺省为"FINISHED"(见 tracking/client.py)。

4.2 获取 Run 与父 Run

run = client.get_run(run.info.run_id) # 不存在则抛异常 parent = client.get_parent_run(child_run_id) # 不存在父 Run 返回 None

get_run返回的Run对象同时携带三类信息(见 tracking/client.py):

  • RunInfo:元数据(run_id、experiment_id、status、生命周期阶段等);
  • RunData:params、metrics、tags 集合;同一 key 多次记录的 metric,取最大 step 下最新记录值
  • RunInputs(实验性):该 Run 使用的数据集信息。

4.3 记录指标、参数、标签

log_metric的参数要点(tracking/client.py):

  • key:仅支持字母数字、_-.、空格、/,所有后端至少支持 250 长度;
  • value:float 值;不同 store 对+/-Inf的处理可能不同(如 SQLAlchemy store 会替换为最大/最小浮点数);
  • timestamp:缺省当前系统时间;step:训练步数,缺省 0;
  • synchronous(实验性):True阻塞直到写入成功;False异步写入并返回RunOperationsfuture;None时读取环境变量MLFLOW_ENABLE_ASYNC_LOGGING,缺省为 False。
client = MlflowClient() run = client.create_run("0") client.log_metric(run.info.run_id, "m", 1.5) client.log_param(run.info.run_id, "p", "p") # 参数值会被字符串化 client.set_tag(run.info.run_id, "s.release", "1.1.0-RC") client.set_terminated(run.info.run_id) run = client.get_run(run.info.run_id) print(run.data.metrics, run.data.params, run.data.tags) # 异步写入示例 client.log_metric(run.info.run_id, "m", 1.5, synchronous=False)

4.4 批量写入:log_batch 与 log_inputs

log_batch一次写入多组 metric/param/tag,内部会自动把 Param 的 value 字符串化(源码见 tracking/client.py):

import time from mlflow import MlflowClient from mlflow.entities import Metric, Param, RunTag timestamp = int(time.time() * 1000) client = MlflowClient() run = client.create_run("0") client.log_batch( run.info.run_id, metrics=[Metric("m", 1.5, timestamp, 1)], params=[Param("p", "p")], tags=[RunTag("t", "t")], ) client.set_terminated(run.info.run_id) run = client.get_run(run.info.run_id) print(run.data.metrics, run.data.params, run.data.tags, run.info.status)

log_inputs则用于登记 Run 使用的数据集(DatasetInput)或模型输入(LoggedModelInput),是后续数据集溯源的基础(见 tracking/client.py)。

4.5 搜索 Runs:跨实验筛选与排序

search_runs是批量分析 Run 的核心方法(tracking/client.py):

import mlflow from mlflow import MlflowClient from mlflow.entities import ViewType experiment_id = mlflow.create_experiment("Social NLP Experiments") with mlflow.start_run(experiment_id=experiment_id) as run: mlflow.log_metric("m", 1.55) mlflow.set_tag("s.release", "1.1.0-RC") with mlflow.start_run(experiment_id=experiment_id): mlflow.log_metric("m", 2.50) mlflow.set_tag("s.release", "1.2.0-GA") client = MlflowClient() # 按指标 m 降序排列全部 Run runs = client.search_runs(experiment_id, order_by=["metrics.m DESC"]) # 只查已删除的 Run,并用大小写不敏感模式匹配 tag filter_string = "tags.s.release ILIKE '%rc%'" runs = client.search_runs( experiment_id, run_view_type=ViewType.DELETED_ONLY, filter_string=filter_string )

参数要点:filter_string缺省搜索全部;order_by支持metrics.<name>params.<name>tags.<name>等字段并可选DESC/ASC后缀,未指定时默认按start_time DESC再按run_id排序;返回的PagedList[Run]同样通过token翻页。

4.6 删除与恢复 Run

client.delete_run(run_id) # 软删除,lifecycle_stage 变为 deleted client.restore_run(run_id) # 恢复

4.7 指标历史与标签操作

  • get_metric_history(run_id, key):返回该指标的全部历史记录列表(Metric(key, value, timestamp, step)),是绘制训练曲线的数据来源;
  • set_experiment_tag/delete_experiment_tag:实验级标签;
  • set_tag/delete_tag:Run 级标签;
  • update_run(run_id, status=None, name=None):更新 Run 状态或名称。

五、Artifacts:文件、文本、字典、图表与表格的上传下载

MlflowClient提供从单个文件到 DataFrame 表格的多种 artifact 写入能力:

5.1 文件与目录

import tempfile from pathlib import Path from mlflow import MlflowClient client = MlflowClient() run = client.create_run("0") with tempfile.TemporaryDirectory() as tmp_dir: path = Path(tmp_dir, "features.txt") path.write_text("rooms, zipcode, median_price, school_rating, transport") client.log_artifact(run.info.run_id, path) # 单个文件/目录 client.log_artifacts(run.info.run_id, "/path/to/dir") # 整个目录 for artifact in client.list_artifacts(run.info.run_id): print(f"artifact: {artifact.path}, is_dir: {artifact.is_dir}") # 下载到本地目录,返回目标路径 local_path = client.download_artifacts(run.info.run_id, "features.txt", dst_path="/tmp/ml")

注意源码中有防御性校验:以 trace 请求 ID 前缀开头的run_id会被拒绝(见 tracking/client.py)。

5.2 结构化内容

client.log_text(run.info.run_id, "Hello world!", "hello.txt") client.log_dict(run.info.run_id, {"state": "TX", "Available": 25}, "config.json") client.log_figure(run.info.run_id, fig, "plot.png") # 支持 matplotlib / plotly client.log_image(run.info.run_id, image_array, "img.png") # 支持 PIL 图像 / numpy 数组 # 表格(pandas DataFrame / dict 列表) client.log_table(run.info.run_id, data=df, artifact_file="mydata.json") df = client.load_table(run.info.run_id, "mydata.json") # 读回 DataFrame

5.3 流式写入

log_stream支持将迭代器/生成器流式写出到 artifact 文件,适合大文件场景(见 tracking/client.py)。

六、Logged Models:实验内模型对象的直接管理

除注册表之外,MlflowClient还提供对"实验内已记录模型"(Logged Model)的 CRUD,这在工作区模型治理中非常有用(源码位于 tracking/client.py 附近):

client.get_logged_model(model_id) # 按 ID 获取 client.delete_logged_model(model_id) # 删除 client.set_logged_model_tags(model_id, tags) # 打标签 client.delete_logged_model_tag(model_id, key) # 删标签 client.list_logged_model_artifacts(model_id) # 列出模型 artifact 文件

model_id_validate_model_id_specified校验;当目标模型可能不存在或权限不足时,set_logged_model_tags会给出明确的错误提示(提示可改用set_model_version_tag操作注册表版本)。

七、Model Registry:注册模型与模型版本治理

模型注册表相关方法全部经由懒加载的ModelRegistryClient执行,是团队协作中模型发布、版本化、Stage/Alias 流转的标准入口。

7.1 Registered Model 的 CRUD

import mlflow from mlflow import MlflowClient name = "SocialMediaTextAnalyzer" tags = {"nlp.framework": "Spark NLP"} desc = "This sentiment analysis model classifies the tone-happy, sad, angry." mlflow.set_tracking_uri("sqlite:///mlruns.db") client = MlflowClient() client.create_registered_model(name, tags, desc) # 创建(名称需唯一) rm = client.get_registered_model(name) # 获取 client.rename_registered_model(name, "NewName") # 重命名 client.update_registered_model(name, description="new") # 更新描述 client.delete_registered_model(name) # 删除 # 搜索:filter_string 支持 name、tags.<key> 等 models = client.search_registered_models(filter_string="name = 'SocialMediaTextAnalyzer'")

源码中的两个细节值得注意(见 tracking/client.py):create_registered_model会拒绝携带 prompt 标签的模型;delete_registered_model从模型注册表中移除模型。

7.2 创建 Model Version

create_model_version从给定 source 创建新版本(tracking/client.py):

import mlflow.sklearn from mlflow import MlflowClient from mlflow.models import infer_signature from sklearn.datasets import make_regression from sklearn.ensemble import RandomForestRegressor mlflow.set_tracking_uri("sqlite:///mlruns.db") X, y = make_regression(n_features=4, n_informative=2, random_state=0, shuffle=False) rfr = RandomForestRegressor(n_estimators=3, random_state=42).fit(X, y) signature = infer_signature(X, rfr.predict(X)) with mlflow.start_run() as run: mlflow.sklearn.log_model(rfr, artifact_path="sklearn-model", signature=signature) client = MlflowClient() client.create_registered_model("RandomForestRegression") # source 支持 run 相对 URI:runs:/<run_id>/<artifact_path> mv = client.create_model_version( name="RandomForestRegression", source=f"runs:/{run.info.run_id}/sklearn-model", run_id=run.info.run_id, description="v1 of the regressor", ) print(f"Version: {mv.version}, Status: {mv.status}")

参数要点:

  • source:run 相对 URI(runs:/<run_id>/<model_artifact_path>)、注册表 URI(models:/<model_name>/<version>)或其他后端支持的 URI(如s3://my_bucket/my/model);
  • run_id:生成该模型的 tracking run;
  • run_link:生成该模型的 run 链接;
  • await_creation_for:等待版本进入READY状态的秒数,默认等待约 5 分钟,传0None跳过等待;
  • model_id:从 Experiment 提升为注册表版本时的模型 ID(如适用)。

底层实现(_create_model_version,见 tracking/client.py)还包含 Databricks 场景的特殊处理:当 tracking 与 registry URI 分属不同 Databricks 工作区时,会自动将模型文件从源位置复制到注册表工作区并打印提示。

7.3 版本检索、流转与标签

mv = client.get_model_version(name, version) # 按 (name, version) 获取 client.get_latest_versions(name, stages=["Staging"]) # 获取指定阶段的最新版本 client.transition_model_version_stage(name, version, stage) # 阶段流转,如 "Staging" → "Production" client.update_model_version(name, version, description="...") client.delete_model_version(name, version) client.set_model_version_tag(name, version, key, value) client.delete_model_version_tag(name, version, key) # 获取下载 URI,便于后续部署拉取模型文件 uri = client.get_model_version_download_uri(name, version) # 搜索版本:支持 filter_string 与 order_by versions = client.search_model_versions(filter_string="name = 'RandomForestRegression'")

transition_model_version_stage是经典 MLflow 三阶段(Staging / Production / Archived)治理流程的关键方法;get_model_version_stages可查询某版本允许流转的阶段集合(见 tracking/client.py)。

7.4 别名(Alias):比 Stage 更灵活的指向

别名让团队可以为"当前应被生产使用的版本"起一个语义化名字:

client = MlflowClient() client.create_registered_model("RandomForestRegression") mv = client.create_model_version( name="RandomForestRegression", source=f"runs:/{run.info.run_id}/sklearn-model", run_id=run.info.run_id, ) # 给版本设置别名 client.set_registered_model_alias("RandomForestRegression", "champion", mv.version) client.get_model_version_by_alias("RandomForestRegression", "champion") # 按别名取版本 client.delete_registered_model_alias("RandomForestRegression", "champion") # 删除别名

注意别名规则:v<number>格式(如v9v42)被保留、不可作为别名设置(见 tracking/client.py)。

八、Prompt Registry:GenAI 提示词的版本化管理

MlflowClient内置对 Prompt Registry 的支持,用于对提示词模板做与模型同级的版本管理(源码见 tracking/client.py)。使用时需为客户端指定 registry URI:

from mlflow import MlflowClient # 提示词注册表需要显式指定 registry_uri client = MlflowClient(registry_uri="sqlite:///prompt_registry.db") # 注册文本型提示词:{{variable}} 双花括号为占位符 client.register_prompt( name="greeting_prompt", template="Respond to the user's message as a {{style}} AI.", response_format={"type": "string", "description": "A friendly response"}, ) # 注册 Chat 型提示词:多轮消息列表 client.register_prompt( name="assistant_prompt", template=[ {"role": "system", "content": "You are a helpful {{style}} assistant."}, {"role": "user", "content": "{{question}}"}, ], response_format={"type": "object", "properties": {"answer": {"type": "string"}}}, ) # 加载并格式化使用 prompt = client.load_prompt("greeting_prompt") final_text = prompt.format(style="friendly") # 同名再注册即生成新版本,支持 commit_message 与 tags prompt = client.register_prompt( name="greeting_prompt", template="Respond to the user's message as a {{style}} AI. {{greeting}}", commit_message="Add a greeting to the prompt.", tags={"author": "Bob"}, )

关联方法还包括:search_prompts(搜索)、set_prompt_alias/delete_prompt_alias(别名)、set_prompt_version_tag/delete_prompt_version_tag(版本标签)、link_prompt_version_to_run(将提示词版本关联到 Run)、link_prompt_versions_to_trace(关联到 Trace)、list_logged_prompts(列出 Run 上已登记的提示词)等,构成完整的提示词治理闭环。

九、Workspace 与 Tracing:现代 MLflow 的两项扩展能力

9.1 Workspace 工作区管理

MlflowClient通过配置的 workspace provider 暴露工作区 CRUD(见 tracking/client.py):

workspaces = client.list_workspaces() # 列出当前用户可用的工作区 ws = client.create_workspace( name="my-workspace", description="...", default_artifact_root="s3://my-bucket/artifacts", trace_archival_config=..., # TraceArchivalConfig,可空 ) client.update_workspace(name, ...) client.delete_workspace(name, mode="RESTRICT") # 删除模式默认 RESTRICT

delete_workspacemode默认取WorkspaceDeletionMode.RESTRICT,用于防止误删。若配置的 workspace URI 不受支持,_get_workspace_client会抛出带错误码FEATURE_DISABLEDMlflowException

9.2 Tracing:以代码命令式创建 Trace 与 Span

MlflowClient的 Tracing 方法是命令式(imperative)API,区别于@mlflow.trace装饰器与mlflow.start_span()上下文管理器——它需要手动维护 Span 生命周期(见 tracking/client.py):

from mlflow import MlflowClient client = MlflowClient() # 1. 启动 trace(创建根 span) root_span = client.start_trace("my_trace") trace_id = root_span.trace_id # 2. 创建子 span child_span = client.start_span("child_span", trace_id=trace_id, parent_id=root_span.span_id) # 做一些业务处理... client.end_span(trace_id=trace_id, span_id=child_span.span_id) # 3. 必须显式结束 trace,否则不会落库! client.end_trace(trace_id) # 4. 查询 trace = client.get_trace(trace_id) traces = client.search_traces(experiment_ids=["0"], max_results=10) # 5. 标签与删除 client.set_trace_tag(trace_id, "key", "value") client.delete_trace_tag(trace_id, "key") client.delete_traces(trace_ids=[trace_id])

两个关键注意点(均有源码佐证):

  • start_trace会在全局上下文中已存在活动 trace(即正在使用 fluent API 创建 span)时抛出MlflowException,以避免产生意外嵌套;
  • 使用MlflowClient.start_trace()开启的 trace必须调用end_trace(trace_id)结束,否则不会记录。

start_trace的参数还包括span_type(默认SpanType.UNKNOWN)、inputsattributestagsexperiment_id(缺省按mlflow.set_experimentMLFLOW_EXPERIMENT_NAMEMLFLOW_EXPERIMENT_ID→ 服务端默认实验的顺序解析)、start_time_nsrun_id(关联到某 Run)与links

十、与 fluent API 的对照:何时用 MlflowClient

为帮助读者快速决策,下表对照了两种 API 的典型差异(fluent API 实现位于 mlflow/tracking/fluent.py 的start_run等函数):

场景推荐 API说明
在脚本内训练并自动记录mlflow.start_run()+mlflow.log_metric(...)fluent API 自动维护活动 Run、自动设置系统标签
服务/调度任务中编程式创建 RunMlflowClient().create_run()只创建对象,不改变全局上下文,需显式set_terminated
查询/检索历史数据MlflowClient().search_runs()search_experiments()支持 filter_string、分页与排序
模型注册表治理MlflowClient().create_model_version()注册表方法仅存在于客户端 API
提示词、Trace、WorkspaceMlflowClient()对应方法均为客户端级命令式 API

从测试代码也能印证这一分工:在 tests/tracking/test_tracking.py 中,测试先用start_run()创建活动 Run,再用MlflowClient().log_batch(...)做批量写入,最后用client.get_run()校验,展示了两种 API 在同一流程中的典型配合方式。

十一、最佳实践与注意事项

  1. URI 先行:构造MlflowClient前先用mlflow.set_tracking_uri()/mlflow.set_registry_uri()设定全局地址,或在构造时显式传入,避免因隐式回落产生歧义。
  2. 显式管理生命周期:使用create_run后必须set_terminated;使用start_trace后必须end_trace,否则数据不会落库。
  3. 软删除语义:experiment 与 run 的删除均为软删除,删除后名称不可复用,可通过restore_*恢复;彻底清理需数据库层操作。
  4. 异步写入可选:对吞吐敏感的场景,可开启synchronous=False或环境变量MLFLOW_ENABLE_ASYNC_LOGGING,获取RunOperationsfuture 统一等待。
  5. 别名优于 Stage:面向现代 MLOps 流程,优先使用模型别名(Alias)指向"当前冠军版本",而非依赖有限的 Stage 枚举。
  6. 注意后端限制:模型注册表与 workspace 后端能力取决于 URI scheme(如 FileStore 不支持注册表),调用相关 API 前确认registry_uri/workspace_store_uri指向受支持的存储。

结语

MlflowClient将 MLflow Tracking 与 Model Registry 两大子系统的 REST 能力封装为一个统一的 Python CRUD 接口:从 Experiment/Run 的创建、检索、搜索与软删除,到 metric/param/tag/artifact 的写入与读取,再到注册模型、版本流转、别名管理,乃至 Prompt Registry、Workspace 与 Tracing 等新一代 GenAI 能力,全部可以脱离交互式环境、以纯代码方式编排。理解它的分层实现(TrackingServiceClient / ModelRegistryClient / WorkspaceProviderClient / TracingClient)与 fluent API 的分工边界,是在 MLflow 之上构建自动化 MLOps 平台的第一步。相关源码可进一步阅读 mlflow/tracking/client.py(约 7000 行完整实现)与 mlflow/tracking/fluent.py(高层 API 对照)。

【免费下载链接】mlflowThe open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and optimize production-quality AI applications while controlling costs and managing access to models and data.项目地址: https://gitcode.com/GitHub_Trending/ml/mlflow

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询