尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MLflow models Python API 全解:Flavor 模型格式、签名、评估与部署

MLflow models Python API 全解:Flavor 模型格式、签名、评估与部署 MLflow models Python API 全解Flavor 模型格式、签名、评估与部署【免费下载链接】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/mlflowMLflow 的mlflow.models模块是整个 MLflow 模型生命周期管理的中枢 API它定义了带 Flavor 的模型这一核心抽象并提供了模型记录logging、签名signature推断与校验、离线评估、无环境预测、Docker 镜像构建以及模型即代码model as code等一整套能力。本文基于当前仓库中 mlflow.models.rst 所挂接的 API 文档Sphinx autodoc结合 mlflow/models 目录下的真实源码实现系统讲解该模块的每个公开类与方法帮助你在训练脚本、CI 流水线和服务化部署中正确使用这些 API。说明mlflow.models.rst是一份 Sphinx autodoc 占位文档通过automodule指令把mlflow.models包内各成员Model、ModelInfo、evaluate、infer_signature等的 docstring 渲染成参考页。因此本文的内容骨架即这些 API 的官方语义细节均对照源码核实。模块定位以 Flavor 为核心的模型抽象mlflow.models模块的设计目标正如其包 docstring 所写提供一种以Flavor保存机器学习模型的 API使模型能够被不同的下游工具理解。所谓 Flavor就是同一份模型资产在不同生态下的呈现方式——例如同一个 sklearn 模型可以同时被python_functionpyfunc 通用接口、sklearn原生 sklearn 加载方式两种 Flavor 描述。从 mlflow/models/init.py 可以看到模块内置了以下 Flavor 子模块Flavor 模块适用框架mlflow.catboostCatBoostmlflow.dspyDSPymlflow.h2oH2Omlflow.langchainLangChainmlflow.lightgbmLightGBMmlflow.llama_indexLlamaIndexmlflow.onnxONNXmlflow.openaiOpenAImlflow.paddlePaddlePaddlemlflow.pmdarimapmdarimamlflow.prophetProphetmlflow.pyfunc任意 Python 可调用对象通用mlflow.pyspark.ml/mlflow.sparkPySpark / Sparkmlflow.pytorchPyTorchmlflow.sklearnscikit-learnmlflow.spacyspaCymlflow.statsmodelsstatsmodelsmlflow.tensorflowTensorFlow / Kerasmlflow.transformersHugging Face Transformersmlflow.xgboostXGBoost每个 Flavor 模块都实现了save_model/log_model/load_model三件套其中log_model在仓库中统一收敛到Model.log()/Model._log_v2()这两个类方法见 mlflow/models/model.py完成保存到临时目录 → 校验 serving input → 记录 artifacts → 关联 run → 注册 Model Registry的完整链路。除此之外__init__.py还向外部导出了evaluate、make_metric、ModelSignature、infer_signature、predict、build_docker、set_model、ModelConfig、Resource等一批顶层 API本文后续逐一展开。Model 与 ModelInfo模型元数据的一体两面Model类MLmodel 文件的面向对象表示Modelmlflow/models/model.py是一个可以支持多种 Flavor 的 MLflow 模型本质上是模型目录下MLmodelYAML 文件的编程式抽象。其构造参数与MLmodel文件字段一一对应字段含义备注artifact_path模型在 run 内的相对路径序列化时若为None会被剔除run_id关联的 run IDutc_time_created创建时间UTC默认取当前 UTC 时间并去除时区信息以保持与旧版本行为一致flavorsFlavor 名到如何以该 Flavor 服务模型的配置映射默认为空字典signature模型输入/输出/参数的 schema 定义不能设置为FalseFalse用于关闭自动推断saved_input_example_info保存的输入示例元信息如{artifact_path: input_example.json, type: dataframe, pandas_orient: split}model_uuid模型唯一标识默认由uuid.uuid4().hex生成mlflow_version记录模型时使用的 MLflow 版本默认取mlflow.version.VERSIONmetadata用户自定义元数据字典会被写入MLmodel文件model_size_bytes模型大小字节保存时自动计算resources服务模型所需的资源声明支持 YAML 文件路径或Resource对象列表auth_policy服务模型所需的鉴权策略与resources二选一model_id/prompts新式 LoggedModel 关联与 Prompt 关联Model的核心方法add_flavor(name, **params)为模型注册一种 Flavor 的服务方式返回self支持链式调用get_input_schema()/get_output_schema()/get_params_schema()读取签名中的输入、输出、参数 schemaget_serving_input(path)/load_input_example(path)读取随模型保存的 serving input 示例或原始 input exampleto_dict()/to_yaml()/to_json()/save(path)序列化序列化时会剔除空字段因为部分 Model Serving 消费方无法正确处理空值load(path)类方法从本地路径或远程 URI如s3://加载模型支持直接指向MLmodel文件或所在目录加载逻辑会解析models:/logged-model URI 并自动下载远端文件from_dict(model_dict)类方法从字典还原模型同时恢复signature与is_signature_from_type_hint等标志位。一个典型的MLmodel文件sklearn 模型形如artifact_path: sklearn-model flavors: python_function: env: conda.yaml loader_module: mlflow.sklearn model_path: model.pkl python_version: 3.8.10 sklearn: pickled_model: model.pkl serialization_format: cloudpickle sklearn_version: 0.24.1 mlflow_version: 3.x.x model_uuid: 39ca11813cfc46b09ab83972740b80ca run_id: 8ede7df408dd42ed9fc39019ef7df309 utc_time_created: 2022-01-12 05:17:31.634689ModelInfo类log_model 的返回值ModelInfomlflow/models/model.py是log_model系列 API 返回的元数据对象。各属性如下属性类型说明artifact_pathstr模型在 run 内的相对路径flavorsdictFlavor 名 → 服务配置的映射model_uristr形如runs:/run_id/artifact_path新式模型为models:/model_idmodel_uuidstr模型 UUID遗留字段run_idstr关联 run 的 IDsaved_input_example_infodict | None输入示例的元信息signatureModelSignature | None模型签名utc_time_createdstr创建时间UTCmlflow_versionstr记录时 MLflow 版本metadatadict | None用户自定义元数据env_varslist[str] | None记录模型过程中使用的环境变量registered_model_versionint | None若注册到 Model Registry则为版本号promptslist[str] | None关联的 Prompt URI 列表model_id/metrics/params/tags/name/creation_timestamp见源码新式 LoggedModel 关联字段get_model_info(model_uri)按 URI 获取模型元数据get_model_infomlflow/models/model.py接受任何受支持的模型 URI返回ModelInfo/Users/me/path/to/local/model本地路径relative/path/to/local/model相对路径s3://my_bucket/path/to/model对象存储runs:/mlflow_run_id/run-relative/path/to/modelrun 内路径models:/model_name/model_version或models:/model_name/stageModel Registrymlflow-artifacts:/path/to/modelMLflow Artifacts 服务官方示例摘自 docstring可在 mlflow/models/model.py 中查看import mlflow import mlflow.models import mlflow.sklearn from sklearn.ensemble import RandomForestRegressor with mlflow.start_run() as run: params {n_estimators: 3, random_state: 42} X [[0, 1]] y [1] signature mlflow.models.infer_signature(X, y) rfr RandomForestRegressor(**params).fit(X, y) mlflow.log_params(params) mlflow.sklearn.log_model(rfr, namesklearn-model, signaturesignature) model_uri fruns:/{run.info.run_id}/sklearn-model model_info mlflow.models.get_model_info(model_uri) model_signature model_info.signature assert model_signature signature签名系统ModelSignature、infer_signature 与 set_signature模型签名定义了模型输入、输出和推理参数的 schema是模型可复现、可校验、可安全服务的基础。签名相关代码集中在 mlflow/models/signature.py。ModelSignature输入/输出/参数的 schema 容器ModelSignature(inputs, outputs, params)由三个部分组成输入Schema、输出Schema和参数ParamSchema后两个可为None。构造时要求三者至少提供一个且inputs/outputs必须是Schema或 dataclassdataclass 会被自动转换为 schema。序列化接口包括to_dict()序列化为 JSON 可读字典输入输出 schema 以 JSON 字符串形式嵌入保证MLmodelYAML 的紧凑性from_dict()反序列化__eq__基于输入、输出、参数三部分逐项比较。infer_signature(model_input, model_output, params)自动推断签名infer_signaturemlflow/models/signature.py接受训练数据输入、模型预测输出与推理参数返回ModelSignature。支持的输入类型包括pandas.DataFrame/pandas.Seriesdict[str, numpy.ndarray]numpy.ndarraypyspark.sql.DataFrame其中DateType与TimestampType列都会被推断为datetime类型scipy.sparse.csr_matrix/scipy.sparse.csc_matrixJSON 可转换类型的字典或字典列表params用于描述推理时的可调参数例如 transformers 解码参数params { num_beams: 5, max_length: 30, do_sample: True, remove_invalid_values: True, }当输入示例与 params 一起传入时input_example(data, params)log_model/save_model会自动推断签名之后可以在 pyfunc 预测时直接传入result pyfunc_loaded.predict(data, paramsparams)从源码可见推断失败时输入/输出 schema 会降级为Schema([ColSpec(typeAnyType())])AnyType 类型在推理阶段不做数据校验并打印 warning因此签名推断是尽力而为的。基于类型注解的签名推断type hintssignature.py还实现了从 Python 函数类型注解推断签名的机制_infer_signature_from_type_hints见 mlflow/models/signature.py从predict函数的list[str]、list[dict[str, str]]等注解中解析出输入 schema输出注解不可用则回退到AnyType。若函数未使用mlflow.pyfunc.utils.pyfunc装饰器会提示decorate your function withmlflow.pyfunc.utils.pyfuncto enable auto data validation against model input type hints。set_signature(model_uri, signature)为已记录模型补写签名set_signaturemlflow/models/signature.py用于为已记录的模型 artifacts 设置签名流程为下载MLmodel文件 → 更新 signature → 回传覆盖。注意事项不支持models:/name/version这类 Model Registry URIRegistry artifacts 只读需要用runs:/或本地/对象存储路径若 artifact 仓库禁止覆盖写入该函数会失败官方示例加载 run 中的模型用测试集推断签名后回写import mlflow from mlflow.models import set_signature, infer_signature model_uri fruns:/{run_id}/models model mlflow.pyfunc.load_model(model_uri) predictions model.predict(test_df) signature infer_signature(test_df, predictions) set_signature(model_uri, signature)模型评估evaluate、make_metric、MetricThreshold模型评估 API 从mlflow.models.evaluation子包导出见 mlflow/models/evaluation/init.py主要成员包括evaluate(model, data, model_type, ...)对模型执行评估返回EvaluationResultmake_metric(...)把自定义评估函数包装为可插拔的EvaluationMetricMetricThreshold定义阈值如absolute_condition、greater_is_better用于模型验证model validationEvaluationArtifact/EvaluationResult评估过程中产生的 artifact 与评估结果容器list_evaluators()列出可用评估器如内置的回归、分类评估器。典型用法参考 examples/evaluation 下的示例import mlflow from mlflow.models import evaluate evaluate( modelmodels:/my-model/1, dataeval_df, # pandas DataFrame包含特征与真实标签列 model_typeregressor, # 或 classifier / question-answering 等 targetsy_true, )evaluate返回的EvaluationResult包含metrics指标字典、artifacts如混淆矩阵、ROC 曲线图等评估产物。结合 tests/evaluate 目录下的测试用例可以验证其行为例如自定义指标通过make_metric注册后会在评估结果中体现。预测与部署predict 与 build_dockermlflow.models.predict(model_uri, input_data, ...)免环境推理predictmlflow/models/python_api.py根据模型的requirements.txt/conda.yaml自动重建环境并生成 JSON 格式预测其参数参数默认值说明model_uri必填模型 URI本地路径、runs:/、s3://等input_dataNonepyfunc 模型可接受的输入数据input_pathNone指向输入文件的路径与input_data互斥content_typejsonjson或csvoutput_pathNoneJSON 结果输出文件缺省输出到 stdoutenv_managervirtualenvvirtualenv/uv/local/condainstall_mlflowFalse环境激活后安装与调用方同版本的 mlflowpip_requirements_overrideNone覆盖模型依赖用于测试依赖变更extra_envsNone注入额外环境变量仅 virtualenv/conda/uv 支持代码示例摘自 docstring见 mlflow/models/python_api.pyimport mlflow # 基础预测 mlflow.models.predict( model_urifruns:/{run_id}/model, input_data{x: 1, y: 2}, content_typejson, ) # 使用 uv 环境管理器性能显著更优 mlflow.models.predict( model_urifruns:/{run_id}/model, input_data{x: 1, y: 2}, env_manageruv, ) # 覆盖依赖 注入环境变量 mlflow.models.predict( model_urifruns:/{run_id}/model, input_data{x: 1, y: 2}, pip_requirements_override[scikit-learn0.23.2], extra_envs{OPENAI_API_KEY: some_value}, ) # 输出到文件 允许预发布版本 mlflow.models.predict( model_urifruns:/{run_id}/model, input_data{x: 1, y: 2}, env_manageruv, output_pathoutput.json, extra_envs{UV_PRERELEASE: allow}, )源码要点python_api.py使用uv时必须确保 PATH 中存在uv命令否则抛出MlflowException并提示安装方式不使用时会在日志中强烈推荐改用uvcontent_typejson时输入数据会经convert_input_example_to_serving_input序列化与校验csv时则转换为 DataFrame 的 CSV 表示底层通过get_flavor_backend(...).predict(...)调用 pyfunc 后端mlflow/models/flavor_backend_registry.py。mlflow.models.build_docker(...)构建服务镜像build_dockermlflow/models/python_api.py构建一个默认入口在8080 端口提供服务的 Docker 镜像pyfunc Flavor参数如下参数默认值说明model_uriNone模型 URI若省略需将模型目录挂载到容器/opt/ml/modelnamemlflow-pyfunc镜像名env_managervirtualenvvirtualenv/conda/localmlflow_homeNone本地 MLflow 克隆路径仅开发用install_javaFalse是否安装 Javajohnsnowlabs、h2o、sparkFlavor 会自动开启install_mlflowFalse环境激活后安装 mlflowbase_imageNone基础镜像缺省为ubuntu:24.04或python:{version}-slim镜像内默认启动 nginx 与 uvicorn 进程若部署到 Google Cloud Run 等平台可通过环境变量关闭 nginxdocker run -p 5001:8080 -e DISABLE_NGINXtrue my-image-name依赖管理infer_pip_requirements 与 update_model_requirementsinfer_pip_requirements(model_path, flavor, fallbackNone)通过加载模型反向推断其 pip 依赖返回按字母序排序的依赖列表可从 mlflow/utils/environment.py 查看实现。update_model_requirements(model_uri, operation, requirement_list)mlflow/models/model.py对模型的conda.yaml与requirements.txt执行添加/移除依赖流程为下载这两个文件 → 更新 → 回传覆盖。要点operation仅支持add或remove添加时若依赖已存在则覆盖版本否则追加移除时忽略版本说明符、只按包名删除不存在的包会被忽略不支持models:/name/versionRegistry URI因为 Registry artifacts 只读但runs:/和mlflow-artifacts:/可用配合predict(pip_requirements_override...)先验证新依赖确认后再更新可避免重新记录模型。模型即代码与配套工具函数set_model(model)模型即代码Model-as-Codeset_modelmlflow/models/model.py用于在模型即代码场景下指定要记录的模型对象支持的模型类型Python 函数或可调用对象PythonModel实例LangChain 模型Runnable或指向 LangChain 模型的路径LlamaIndex index 或对应路径。内部通过__mlflow_model__全局变量传递LangChain/LlamaIndex 类型分别由_validate_langchain_model/_validate_llama_index_model校验见 mlflow/models/model.py。配合示例 examples/pyfunc/model_as_code.py 与 examples/pyfunc/model_as_code_driver.py 可以了解完整用法。mlflow.models.utils中的工具函数从 mlflow/models/init.py 可见mlflow.models还导出了一批实用函数实现见 mlflow/models/utils.pyModelInputExample输入示例的类型别名DataFrame、ndarray、dict、list、稀疏矩阵、str、bytes、tupleconvert_input_example_to_serving_input(example)把训练阶段的输入示例转换为 serving 阶段的标准 JSON支持dataframe_split格式validate_schema(data, schema, paramsNone)按签名校验数据validate_serving_input(model_uri, serving_input)校验 serving 输入能否被模型接受add_libraries_to_model(model_uri, run_idNone, registered_model_nameNone)把模型运行所需库文件打包进模型wheel 化set_retriever_schema(...)来自dependencies_schemas为 RAG/检索类模型声明检索器 schema。此外ModelConfigmlflow/models/model_config.py提供模型配置文件解析能力——log_model时传入model_configJSON/YAML 路径或字典会被扁平化为/分隔的 params 记录到 run见 mlflow/models/model.py 的_flatten_nested_params逻辑Resource/ResourceTypemlflow/models/resources.py用于声明模型服务所需的资源如 UC 函数、向量索引从 YAML 文件或对象列表解析后写入MLmodel。源码验证与测试入口如果你想深入验证本文所述行为可以查看以下仓库路径模块导出清单与全部公开符号mlflow/models/init.py核心元数据实现Model/ModelInfo/get_model_info/update_model_requirementsmlflow/models/model.py签名推断与设置mlflow/models/signature.py预测与 Docker 构建mlflow/models/python_api.py评估 APImlflow/models/evaluation、测试见 tests/evaluateFlavor 后端注册mlflow/models/flavor_backend_registry.py端到端示例examples/evaluation、examples/pyfunc、examples/sklearn_autolog模块级测试tests/models 与 tests/pyfunc总结mlflow.models是 MLflow 模型管线的心脏Model定义标准的MLmodel资产格式ModelSignature/infer_signature保证输入输出可校验evaluate提供离线质量评估predict/build_docker打通从训练到推理的最后一步而set_model、ModelConfig、Resource等新 API 则把 MLflow 从传统 ML 扩展到了 Agent / LLM 应用场景。无论你使用 sklearn 等经典框架还是 LangChain / LlamaIndex 等 GenAI 栈都可以从这套统一的模型抽象中获益。【免费下载链接】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),仅供参考
返回列表