CentOS 9 下 MLFlow 官方 Totorial 详解 : (四) 部署模型 Serve
我们通过 MLflow Models(
https://mlflow.org/docs/latest/models.html)来部署模型。一个 MLflow Model 是一种打包机器学习模型的标准格式,可以被用于多种下游工具,比如实时推理的 REST API 或者批量推理的 Apache Spark 。
示例:离线训练模型发布 (mlflow 2.22.0)
在
examples/sklearn_elasticnet_wine/train.py 中,这行代码用于保存模型(称为artifact):
mlflow.sklearn.log_model(lr, "model")
模型训练:
python examples/sklearn_elasticnet_wine alpha=0.42
通过调用 mlflow.sklearn.log_model 产生文件,位于类似目录
/home/your_name/mlflow/mlflow/mlruns/0/b53f1fed5fee458bb5e48d7f5df4fea0/artifacts/model。
├── conda.yaml
├── MLmodel
├── model.pkl
├── python_env.yaml
└── requirements.txt
- MLmodel元数据文件是告诉MLflow如何加载模型。
- model.pkl文件是训练好的序列化的线性回归模型。
运行Serve命令,可以将模型部署成本地REST服务。
# 需要替换成你自己的目录
mlflow models serve -m /home/s2402561/mlflow/mlflow/mlruns/0/b53f1fed5fee458bb5e48d7f5df4fea0/artifacts/model -p 1234 --no-conda
由于记录模型时,没有提供conda.yaml,这里我们使用--no-conda参数,直接使用现有conda环境。若没有提供conda.yaml,mlflow会尝试新建pyenv虚拟环境,本地没有安装pyenv,会报错:
mlflow.exceptions.MlflowException: Could not find the pyenv binary. See https://github.com/pyenv/pyenv#installation for installation instructions.
这里我们可以用 mlflow models serve -m
/home/s2402561/mlflow/mlflow/mlruns/0/b53f1fed5fee458bb5e48d7f5df4fea0/artifacts/model -p 1234 --no-conda
部署好服务之后,可以通过curl命令发送json序列化的pandas DataFrame来测试下。模型服务器接受的数据格式可以参考MLflow deployment tools documentation.
MLflow 2.0 及以上版本要求预测请求的 JSON 数据必须包含以下四个字段之一:
- instances:适用于非表格数据(如张量、数组)。
- dataframe_split:适用于表格数据(Pandas DataFrame 拆分格式)。
- inputs:通用输入字段(部分场景使用)。
- dataframe_records:表格数据的另一种格式(按记录列表传递)。
curl -X POST -H "Content-Type:application/json" \
--data '{"columns":["alcohol", "chlorides", "citric acid", "density", "fixed acidity", "free sulfur dioxide", "pH", "residual sugar", "sulphates", "total sulfur dioxide", "volatile acidity"],"data":[[12.8, 0.029, 0.48, 0.98, 6.2, 29, 3.33, 1.2, 0.39, 75, 0.66]]}' \
http://127.0.0.1:1234/invocations
服务器会返回类似输出:
{"predictions": [5.814644095729717]}
在发送请求前,确保 MLflow 模型服务器已正确启动并监听指定端口(如 127.0.0.1:1234)。可通过以下命令检查:
curl http://127.0.0.1:1234/health # 健康检查接口,正常应返回 {"status": "healthy"}