使用 MLflow Ray Serve 插件部署并扩缩容 Iris 分类模型
2026/9/13 4:41:01 网站建设 项目流程

使用 MLflow Ray Serve 插件部署并扩缩容 Iris 分类模型

【免费下载链接】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 开源仓库中以 examples/ray_serve 示例为蓝本,完成"训练模型 → 注册到 Model Registry → 通过 Ray Serve 部署 → 在线预测 → 横向扩容 → 清理下线"的完整闭环。读者将掌握 MLflow 部署插件(mlflow deployments命令族)在 Ray Serve 目标上的实战用法,理解-t-m--config等参数背后的解析逻辑,并学会用一套命令完成模型服务的全生命周期管理。

示例概览与整体流程

本示例的核心路径如下,全程使用 MLflow 官方提供的部署插件机制,无需手写任何服务端代码:

  1. sklearn训练一个用于分类 Iris(鸢尾花)数据集的GradientBoostingClassifier模型;
  2. 通过mlflow.sklearn.autolog()自动记录训练信息,并把模型注册进 Model Registry,注册名为RayMLflowIntegration
  3. 启动 Ray 集群与 Ray Serve,将注册模型models:/RayMLflowIntegration/1部署为名为iris:v1的服务实例;
  4. input.json中的样本花萼/花瓣尺寸发起预测,得到[0][1][2]三个类别索引之一;
  5. 通过num_replicas=2将服务扩容为 2 个副本提升吞吐;
  6. 删除部署实例并关闭 Ray 集群。

该流程涵盖了模型服务化部署中最常见的操作,且每一步都有对应的mlflow deployments子命令支撑,方便读者直接照搬用于自己的模型。

环境准备与插件安装

示例假定你已安装 MLflow 以及mlflow[deployments]相关依赖。Ray Serve 部署能力由社区插件mlflow-ray-serve提供,需按插件仓库的安装指引单独安装(可通过pip install mlflow-ray-serve一类的包管理器安装)。安装后,MLflow 会通过 entry point 自动发现该插件,无需额外配置。

验证插件是否生效,可以运行:

mlflow deployments --help

如果插件安装成功,mlflow deployments的帮助信息中会列出当前已安装的部署目标(supported targets),其中应包含ray-serve。这一行为由 mlflow/deployments/cli.py 中的逻辑决定:CLI 启动时会读取插件注册表,把已注册的 target 名称拼进帮助文案。

训练模型并注册到 Model Registry

首先进入示例目录并运行训练脚本:

cd examples/ray_serve python train_model.py

examples/ray_serve/train_model.py 的内部流程如下:

  1. 设置 Tracking URI 为本地 SQLite 数据库sqlite:///mlruns.db,并开启mlflow.sklearn.autolog()自动记录超参数、指标与模型产物;
  2. 加载 Iris 数据集,使用shuffle打乱后按 100/50 划分训练集与验证集;
  3. 训练GradientBoostingClassifier,打印验证集 MSE 与三类目标名称:
    MSE: 1.04 Target names: ['setosa' 'versicolor' 'virginica']
  4. 通过mlflow.last_active_run()拿到当前 run_id,将自动记录的模型以runs:/<run_id>/model为 URI 注册为RayMLflowIntegration,并打印注册名与版本号(通常为 1)。
model_uri = f"runs:/{run_id}/model" registered_model_name = "RayMLflowIntegration" mv = mlflow.register_model(model_uri, registered_model_name) print(f"Name: {mv.name}") print(f"Version: {mv.version}")

这一步是本示例的关键:后续部署命令使用的models:/RayMLflowIntegration/1正是"注册模型名 + 版本号"形式的 Model URI,它让部署目标无需关心模型文件的具体存储位置,只认注册中心里的模型版本。

启动 Ray 集群与 Ray Serve

训练完成后,设置 Tracking URI 环境变量,使部署命令能访问存放 Model Registry 的数据库:

export MLFLOW_TRACKING_URI=sqlite:///mlruns.db

注意:train_model.py内部已经把 Tracking URI 写死为sqlite:///mlruns.db,因此这里的export主要是为了让后续的mlflow deployments命令行进程也能定位到同一个注册库。示例中的mlruns.db是一个相对路径,实际使用时应替换为你自己的注册库位置。

接着启动单节点 Ray 集群,再在该集群上启动常驻的 Ray Serve 实例:

ray start --head serve start

ray start --head会在本机启动一个 head 节点(分布式场景下可再添加 worker 节点);serve start则向该集群提交一个常驻的 Serve 控制器,此后 Serve 即可接收部署请求。

部署模型到 Ray Serve

使用mlflow deployments create创建部署实例:

mlflow deployments create -t ray-serve -m models:/RayMLflowIntegration/1 --name iris:v1

参数含义:

参数说明
-t/--target部署目标,此处为ray-serve,对应已安装插件的注册名
-m/--model-uri模型 URI,models:/<注册名>/<版本>指向 Model Registry 中的某个模型版本
--name部署实例名称,示例中为iris:v1name:version风格)
-C/--config(可选)目标相关的键值对配置,形如-C num_replicas=2
-f/--flavor(可选)指定要部署的模型 flavor,缺省时自动推断

命令执行后终端会输出类似sklearn deployment iris:v1 is created的信息,其中 flavor 为sklearn

命令背后的插件解析机制

-t ray-serve的解析发生在 mlflow/deployments/utils.py 的parse_target_uri():无 scheme 的裸名称(如ray-serve)直接作为 target 名返回;而带 scheme 的 URI(如ray-serve:/suffix)则取其 scheme 部分。随后 mlflow/deployments/interface.py 的get_deploy_client()会到插件注册表中按该名称查找mlflow.deploymentsentry point 对应的插件模块,校验其实现了BaseDeploymentClient子类及必需的接口后,实例化并返回客户端对象,再由 CLI 调用其create_deployment方法。

插件注册发生在 mlflow/deployments/plugin_manager.py,DeploymentPlugins在初始化时通过register_entrypoints()遍历所有声明了mlflow.deploymentsentry point group 的已安装包完成自动注册——这就是安装插件后无需手工配置的原因。

发起在线预测

input.json中存放的是一条样本输入,包含一朵样本花的花萼长、花萼宽、花瓣长、花瓣宽四个特征:

[[4.6, 3.1, 1.5, 0.2]]

执行预测命令:

mlflow deployments predict -t ray-serve --name iris:v1 --input-path input.json

输出为[0][1][2],分别对应目标名称setosaversicolorvirginica三个类别。

CLI 实现中(mlflow/deployments/cli.py),predict子命令通过pandas.read_json(input_path)读取输入文件,调用插件客户端的predict方法,结果默认以 JSON 形式打印到标准输出;也可以用-O/--output-path将结果写入 JSON 文件。--name--endpoint二选一,同时指定或都不指定会报错。

水平扩容:增加副本数

无需重建服务,直接通过update命令把部署实例扩容为多个副本:

mlflow deployments update -t ray-serve --name iris:v1 --config num_replicas=2

num_replicas是 Ray Serve 插件识别并转发给 Ray Serve 的部署配置,用于控制该部署的副本数量。示例仅用了 2 个副本,实际可依据 Ray 集群可用 CPU 核数自由调整。扩容是提升在线服务吞吐量的常用手段——每个副本独立处理请求,多副本并行即可摊薄单副本负载。

update命令同时支持更新模型 URI 与 flavor(mlflow/deployments/cli.py),也就是说不仅可以横向扩容,还能在不停机的情况下把部署切换到 Model Registry 中的新模型版本。

删除部署与关闭集群

验证完毕后清理资源:

mlflow deployments delete -t ray-serve --name iris:v1 ray stop

delete命令会调用插件客户端的delete_deployment方法删除指定名称的部署实例,随后ray stop关闭整个 Ray 集群,释放计算资源。至此,从训练、注册、部署、预测、扩容到下线的完整生命周期全部走完。

常用部署命令速查

mlflow deployments是一个完整的子命令族(均定义于 mlflow/deployments/cli.py),除上述命令外还包含:

命令作用
mlflow deployments list -t ray-serve列出该目标下所有部署实例名称
mlflow deployments get -t ray-serve --name iris:v1打印指定部署的详细信息
mlflow deployments help -t ray-serve显示该目标插件支持的配置项与 URI 格式说明
mlflow deployments run-local -t ray-serve -m models:/RayMLflowIntegration/1 --name iris:v1本地试运行部署,便于调试(不可被 update/delete 管理)
mlflow deployments explain -t ray-serve --name iris:v1 --input-path input.json生成预测解释(输出格式因目标而异)

mlflow deployments create/update/delete/predict也提供了等价的 Python API:调用 mlflow/deployments/interface.py 的get_deploy_client("ray-serve")获得客户端后,即可直接调用create_deploymentpredictupdate_deploymentdelete_deployment等方法,便于在训练流水线中以代码方式编排部署。

小结

通过本示例可以确认:MLflow 的部署插件机制让"注册模型 → 远程部署 → 在线预测 → 动态扩缩容"完全可以通过 CLI 或 Python API 一键化完成,而具体的目标实现(如 Ray Serve 的副本管理、HTTP 暴露等)被插件封装在mlflow.deploymentsentry point 之后。示例中的 train_model.py、input.json 与部署插件解析逻辑(cli.py、interface.py、plugin_manager.py)共同构成了一条可复制、可扩展的模型服务化参考路径。

【免费下载链接】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),仅供参考

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

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

立即咨询