MLflow快速入门
时间:2022-12-28 03:30:00
安装
使用命令安装 MLflow:
pip3 install mlflow # 或者 conda install mlflow
此外,使用一些 MLflow 模块和功能(如:ML 模型持久化/推理等。),您可能需要安装额外的库。 例如,mlflow.tensorflow
需要安装模块 TensorFlow。 详情请参考附加依赖项。
另外:MLflow skinny(轻量型 MLflow 也需要一些套件 MLflow 额外依赖于模块和功能安装。 例如,mlflow.set_tracking_uri("sqlite:///my.db")
需要 pip install mlflow-skinny sqlalchemy alembic sqlparse
。
下载快速入门代码
通过克隆 MLflow( git clone https://github.com/mlflow/mlflow
) 然后下载快速入门代码, cd 进入代码仓库examples子目录。 快速入门将使用此工作目录。
你应该避免直接从克隆 MLflow 项目运行,因为这将导致教程使用源代码 MLflow,而不是您的 PyPi 安装的 MLflow。
使用 Tracking API
MLflow Tracking API 允许您从数据科学代码中记录指标和产品(文件),并查看您的历史记录。 你可以写一个简单的 Python 试试脚本(这个例子也包含在内 quickstart/mlflow_tracking.py
中):
import os from random import random, randint from mlflow import log_metric, log_param, log_artifacts if __name__ == "__main__": # 记录一个参数(键) log_param("param1", randint(0, 100)) # 记录一个指标; 指标可以在整个运行过程中更新 log_metric("foo", random()) log_metric("foo", random() 1) log_metric("foo", random() 2) # 记录产品(输出文件) if not os.path.exists("outputs"): os.makedirs("outputs") with open("outputs/test.txt", "w") as f: f.write("hello world!") log_artifacts("outputs")
查看 Tracking UI
默认情况下,无论您在哪里操作程序,Tracking API 将数据写入本地 ./mlruns
在目录文件中。 然后,你可以操作 MLflow 的 Tracking UI:
mlflow ui
并通过 http://localhost:5000
查看。
运行 MLflow Projects
MLflow 允许您将代码及其依赖项打包为一个项目,该项目可以在其他数据上以可重现的方式运行。 每个项目都包含其代码和定义其依赖项(例如:Python 环境)的 MLproject 文件,以及可以在项目中运行哪些命令以及它们采用哪些参数。
您可以使用 mlflow run
命令轻松运行现有项目,该命令从本地目录或 GitHub URI 运行项目。
运行本地现有项目
项目结构:
示例项目中,包括一个指定其依赖项的 MLproject 文件。 如果您尚未配置跟踪服务,项目会将其 Tracking API 数据记录在本地 mlruns 目录中,以便您可以使用 mlflow ui
查看这些运行。
sklearn_elasticnet_wine
├── MLproject
├── conda.yaml
├── mlruns # 运行结果
│ └── 0
│ ├── 9cb64b2d6095423bab3d6e57698b3028
│ │ ├── artifacts
│ │ │ └── model
│ │ │ ├── MLmodel
│ │ │ ├── conda.yaml
│ │ │ ├── model.pkl
│ │ │ └── requirements.txt
│ │ ├── meta.yaml
│ │ ├── metrics
│ │ │ ├── mae
│ │ │ ├── r2
│ │ │ └── rmse
│ │ ├── params
│ │ │ ├── alpha
│ │ │ └── l1_ratio
│ │ └── tags
│ │ ├── mlflow.log-model.history
│ │ ├── mlflow.source.git.commit
│ │ ├── mlflow.source.name
│ │ ├── mlflow.source.type
│ │ └── mlflow.user
│ └── meta.yaml
├── train.ipynb
├── train.py
└── wine-quality.csv
运行本地现有项目:
mlflow run sklearn_elasticnet_wine -P alpha=0.5
执行过程:
2022/04/26 09:27:56 INFO mlflow.utils.conda: === Creating conda environment mlflow-7122f0cb71f385d249fbb61cc599afd8045ab238 ===
Collecting package metadata (repodata.json): done
Solving environment: done
Downloading and Extracting Packages
ncurses-6.3 | 915 KB | ######################################################### | 100%
openssl-3.0.2 | 2.5 MB | ######################################################### | 100%
...
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
Installing pip dependencies: | Ran pip subprocess with arguments:
['/Users/dev/miniconda3/envs/mlflow-7122f0cb71f385d249fbb61cc599afd8045ab238/bin/python', '-m', 'pip', 'install', '-U', '-r', '/Users/liguodong/work/github/mlflow/examples/sklearn_elasticnet_wine/condaenv.ycasruul.requirements.txt']
Pip subprocess output:
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting scikit-learn==0.23.2
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/8f/e4/d5d59e76f274c7bf82707bb45cda9b2f1ef2874e66f80d53a91bca17374c/scikit_learn-0.23.2-cp37-cp37m-macosx_10_9_x86_64.whl (7.2 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.2/7.2 MB 513.7 kB/s eta 0:00:00
Collecting mlflow>=1.0
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/89/cb/a38a8a57ab7d0b6fa07de9e32f2dbaab953474ef6954f6cc18301cc9fafa/mlflow-1.25.1-py3-none-any.whl (16.8 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.8/16.8 MB 523.3 kB/s eta 0:00:00
...
done
#
# To activate this environment, use
#
# $ conda activate mlflow-7122f0cb71f385d249fbb61cc599afd8045ab238
#
# To deactivate an active environment, use
#
# $ conda deactivate
2022/04/26 11:12:52 INFO mlflow.projects.utils: === Created directory /tmp/tmp5v50aesn for downloading remote URIs passed to arguments of type 'path' ===
2022/04/26 11:12:52 INFO mlflow.projects.backend.local: === Running command 'source /Users/dev/miniconda3/bin/../etc/profile.d/conda.sh && conda activate mlflow-7122f0cb71f385d249fbb61cc599afd8045ab238 1>&2 && python train.py 0.5 0.1' in run with ID '459cd111a9294eb9adcdf9be769f854d' ===
Elasticnet model (alpha=0.500000, l1_ratio=0.100000):
RMSE: 0.7460550348172179
MAE: 0.576381895873763
R2: 0.21136606570632277
2022/04/26 11:12:55 INFO mlflow.projects: === Run (ID '459cd111a9294eb9adcdf9be769f854d') succeeded ===
示例项目中,包括一个指定其依赖项的 MLproject 文件。 如果您尚未配置跟踪服务,Projects 会将其 Tracking API 数据记录在本地 mlruns 目录中,以便您可以使用 mlflow ui
查看这些运行。
实验记录:
制品信息:
注意:默认情况下,
mlflow run
使用 conda 安装所有依赖项。 要在不使用 conda 的情况下运行项目,您可以为mlflow run
提供--no-conda
选项。 在这种情况下,您必须确保您的 Python 环境中已经安装了必要的依赖项。
运行远程项目
项目结构:
运行远程项目:
# 指定不使用conda
sudo mlflow run https://github.com/mlflow/mlflow-example.git -P alpha=5.0 --no-conda
执行过程:
/Users/dev/miniconda3/envs/mlflow-1abc00771765dd9dd15731cbda4938c765fbb90b/lib/python3.7/site-packages/click/core.py:2322: FutureWarning: `--no-conda` is deprecated and will be removed in a future MLflow release. Use `--env-manager=local` instead.
value = self.callback(ctx, self, value)
2022/04/26 14:24:03 INFO mlflow.projects.utils: === Fetching project from https://github.com/mlflow/mlflow-example.git into /tmp/tmph6k2ulg3 ===
2022/04/26 14:24:06 INFO mlflow.projects.utils: === Created directory /tmp/tmpbaf4jior for downloading remote URIs passed to arguments of type 'path' ===
2022/04/26 14:24:06 INFO mlflow.projects.backend.local: === Running command 'python train.py 5.0 0.1' in run with ID '8270a2f5371849628c29b0e70620b873' ===
/Users/dev/miniconda3/envs/mlflow-1abc00771765dd9dd15731cbda4938c765fbb90b/lib/python3.7/site-packages/sklearn/utils/__init__.py:4: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working
from collections import Sequence
/Users/dev/miniconda3/envs/mlflow-1abc00771765dd9dd15731cbda4938c765fbb90b/lib/python3.7/site-packages/sklearn/model_selection/_split.py:18: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working
from collections import Iterable
/Users/dev/miniconda3/envs/mlflow-1abc00771765dd9dd15731cbda4938c765fbb90b/lib/python3.7/site-packages/sklearn/model_selection/_search.py:16: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3,and in 3.9 it will stop working
from collections import Mapping, namedtuple, defaultdict, Sequence
Elasticnet model (alpha=5.000000, l1_ratio=0.100000):
RMSE: 0.8594260117338262
MAE: 0.6480675144220314
R2: 0.046025292604596424
2022/04/26 14:24:35 INFO mlflow.projects: === Run (ID '8270a2f5371849628c29b0e70620b873') succeeded ===
制品信息:
保存模型和为模型服务(Serving)
MLflow 包括一个通用的 MLmodel 格式,用于保存来自不同风格的各种工具的模型。例如,许多模型可以通过 Python 函数提供服务;因此, MLmodel 文件可以声明每个模型应如何解释为 Python 函数,以便让各种工具为其提供服务。
MLflow 还包括在本地运行此类模型,并将其导出到 Docker 容器或商业服务平台的工具。
为了说明此功能,mlflow.sklearn
包可以将 scikit-learn 模型记录为 MLflow 制品,然后再次加载它们以进行服务。
sklearn_logistic_regression/train.py
中有一个示例训练应用程序,您可以按如下方式运行:
python sklearn_logistic_regression/train.py
运行结果:
Score: 0.6666666666666666
Model saved in run 5a18a8405039492996e279a856697be4
当您运行该示例时,它会为该实验输出一个 MLflow 运行 ID。
如果您查看 mlflow ui
,您还将看到该运行保存了一个模型文件夹,其中包含一个 MLmodel 描述文件和一个 pickled 格式的 scikit-learn 模型。您可以将制品目录(此处为“模型”)中模型的运行 ID 和路径传递给各种工具。例如,MLflow 为基于Python的模型提供了一个简单的 REST 服务:
# mlflow models serve -m runs://model
sudo mlflow models serve -m runs:/5a18a8405039492996e279a856697be4/model
启动过程:
2022/04/26 15:20:52 INFO mlflow.models.cli: Selected backend for flavor 'python_function'
2022/04/26 15:20:53 INFO mlflow.utils.conda: === Creating conda environment mlflow-ebf486fd20a81b49ec341c6920d3a887c7888556 ===
Collecting package metadata (repodata.json): done
Solving environment: done
==> WARNING: A newer version of conda exists. <==
current version: 4.10.3
latest version: 4.12.0
Please update conda by running
$ conda update -n base -c defaults conda
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
Installing pip dependencies: - Ran pip subprocess with arguments:
['/home/finance/miniconda3/envs/mlflow-ebf486fd20a81b49ec341c6920d3a887c7888556/bin/python', '-m', 'pip', 'install', '-U', '-r', '/home/finance/lgd/mlflow-code/mlflow/examples/mlruns/0/5a18a8405039492996e279a856697be4/artifacts/model/condaenv.401s9j59.requirements.txt']
Pip subprocess output:
Collecting mlflow
Using cached mlflow-1.25.1-py3-none-any.whl (16.8 MB)
Collecting cloudpickle==2.0.0
Using cached cloudpickle-2.0.0-py3-none-any.whl (25 kB)
Collecting scikit-learn==0.23.2
Using cached scikit_learn-0.23.2-cp37-cp37m-manylinux1_x86_64.whl (6.8 MB)
...
#
# To activate this environment, use
#
# $ conda activate mlflow-ebf486fd20a81b49ec341c6920d3a887c7888556
#
# To deactivate an active environment, use
#
# $ conda deactivate
2022/04/26 15:22:18 INFO mlflow.pyfunc.backend: === Running command 'source /home/finance/miniconda3/bin/../etc/profile.d/conda.sh && conda activate mlflow-ebf486fd20a81b49ec341c6920d3a887c7888556 1>&2 && exec gunicorn --timeout=60 -b 127.0.0.1:5000 -w 1 ${GUNICORN_CMD_ARGS} -- mlflow.pyfunc.scoring_server.wsgi:app'
[2022-04-26 15:22:18 +0800] [19174] [INFO] Starting gunicorn 20.1.0
[2022-04-26 15:22:18 +0800] [19174] [INFO] Listening at: http://127.0.0.1:5000 (19174)
[2022-04-26 15:22:18 +0800] [19174] [INFO] Using worker: sync
[2022-04-26 15:22:18 +0800] [19184] [INFO] Booting worker with pid: 19184
注意:
默认情况下,服务器在 5000 端口上运行。如果该端口已被使用,请使用
–port
选项指定不同的端口。 例如:mlflow models serve -m runs:/
。/model --port 1234
启动服务后,您可以将一些示例数据传递给它并查看预测。
下面使用 curl 将 JSON 序列化 DataFrame(pandas) 发送到模型服务。 有关 pyfunc 模型服务可以接收的输入数据格式的更多信息,请参阅 MLflow 部署工具文档。
curl -d '{"columns":["x"], "data":[[1], [-1]]}' -H 'Content-Type: application/json; format=pandas-split' -X POST localhost:5000/invocations
返回结果:
[1, 0]
记录到远程跟踪服务
在上面的示例中,MLflow 将数据记录到运行它的机器的本地文件系统中。 要集中管理结果或在团队中共享结果,您可以将 MLflow 配置为记录到远程跟踪服务。 要访问远程跟踪服务器:
在远程机器上启动跟踪服务
在远程机器上启动跟踪服务。然后,您可以通过将 MLFLOW_TRACKING_URI
环境变量设置为服务的 URI, 或通过在程序的开头添加以下内容来记录远程跟踪服务:
import mlflow
mlflow.set_tracking_uri("http://YOUR-SERVER:4040")
mlflow.set_experiment("my-experiment")
记录到 Databricks 社区版
首先,注册 Databricks 社区版,这是一项包含托管跟踪服务的免费服务。 注册后,运行 databricks configure
为 MLflow 创建凭据文件,指定 https://community.cloud.databricks.com
作为主机(host)。
注意:社区版旨在用于快速实验而不是生产场景。
要记录到社区版服务,请将 MLFLOW_TRACKING_URI
环境变量设置为“databricks”,或者将以下内容添加到程序的开头:
import mlflow
mlflow.set_tracking_uri("databricks")
# Note: on Databricks, the experiment name passed to set_experiment must be a valid path
# in the workspace, like '/Users//my-experiment'. See
# https://docs.databricks.com/user-guide/workspace.html for more info.
mlflow.set_experiment("/my-experiment")
参考文档
- MLflow quickstart
- MLflow Projects