Press "Enter" to skip to content

MLflow 快速入门

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

 

安装

 

使用一下命令即可安装 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:/<RUN_ID>/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:/<RUN_ID>/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/<your-username>/my-experiment'. See
# https://docs.databricks.com/user-guide/workspace.html for more info.
mlflow.set_experiment("/my-experiment")

 

参考文档

MLflow quickstart
MLflow Projects

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。