当前位置: 首页 > 工具软件 > MLflow > 使用案例 >

MLflow教程-快速入门

封德华
2023-12-01

MLflow教程-快速入门

安装 MLflow

您可以通过运行以下命令安装 MLflow:

pip install mlflow

要使用某些 MLflow 模块和功能(ML 模型持久性/推理、工件存储选项等),您可能需要安装额外的库。

MLflow skinny 还需要为某些 MLflow 模块和功能安装额外的依赖项。例如, mlflow.set_tracking_uri("sqlite:///my.db")需要.pip install mlflow-skinny sqlalchemy alembic sqlparse

使用跟踪 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 a parameter (key-value pair)
    log_param("param1", randint(0, 100))## 参数值

    # Log a metric; metrics can be updated throughout the run
    log_metric("foo", random())## 性能指标epoch 统计指标
    log_metric("foo", random() + 1)
    log_metric("foo", random() + 2)

    # Log an artifact (output file)
    if not os.path.exists("outputs"):
        os.makedirs("outputs")
    with open("outputs/test.txt", "w") as f:
        f.write("hello world!")
    log_artifacts("outputs")#日志文件

运行 MLflow 项目

MLflow 允许您将代码及其依赖项打包为一个项目,该项目可以在其他数据上以可重现的方式运行。每个项目都包含其代码和一个MLproject定义其依赖项(例如 Python 环境)的文件,以及可以在项目中运行哪些命令以及它们采用哪些参数。
您可以使用以下命令轻松运行现有项目,该命令从本地目录或 GitHub URI 运行项目:mlflow run
MLproject

name: tutorial
conda_env: conda.yaml
entry_points:
  main:
    parameters:
      alpha: float
      l1_ratio: {type: float, default: 0.1}
    command: "python train.py {alpha} {l1_ratio}"

conda.yaml

name: tutorial
channels:
  - defaults
dependencies:
  - numpy>=1.14.3
  - pandas>=1.0.0
  - scikit-learn=0.19.1
  - pip
  - pip:
    - mlflow

train.py

import os
import warnings
import sys

import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.linear_model import ElasticNet

import mlflow
import mlflow.sklearn


def eval_metrics(actual, pred):
    rmse = np.sqrt(mean_squared_error(actual, pred))
    mae = mean_absolute_error(actual, pred)
    r2 = r2_score(actual, pred)
    return rmse, mae, r2



if __name__ == "__main__":
    warnings.filterwarnings("ignore")
    np.random.seed(40)

    # Read the wine-quality csv file (make sure you're running this from the root of MLflow!)
    wine_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "wine-quality.csv")
    data = pd.read_csv(wine_path)

    # Split the data into training and test sets. (0.75, 0.25) split.
    train, test = train_test_split(data)

    # The predicted column is "quality" which is a scalar from [3, 9]
    train_x = train.drop(["quality"], axis=1)
    test_x = test.drop(["quality"], axis=1)
    train_y = train[["quality"]]
    test_y = test[["quality"]]

    alpha = float(sys.argv[1]) if len(sys.argv) > 1 else 0.5
    l1_ratio = float(sys.argv[2]) if len(sys.argv) > 2 else 0.5

    with mlflow.start_run():
        lr = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, random_state=42)
        lr.fit(train_x, train_y)

        predicted_qualities = lr.predict(test_x)

        (rmse, mae, r2) = eval_metrics(test_y, predicted_qualities)

        print("Elasticnet model (alpha=%f, l1_ratio=%f):" % (alpha, l1_ratio))
        print("  RMSE: %s" % rmse)
        print("  MAE: %s" % mae)
        print("  R2: %s" % r2)

        mlflow.log_param("alpha", alpha)#参数
        mlflow.log_param("l1_ratio", l1_ratio)
        mlflow.log_metric("rmse", rmse)#性能指标
        mlflow.log_metric("r2", r2)
        mlflow.log_metric("mae", mae)
        mlflow.sklearn.log_model(lr, "model")

RUN

mlflow run sklearn_elasticnet_wine -P alpha=0.5
mlflow run https://github.com/mlflow/mlflow-example.git -P alpha=5.0

默认情况下,mlflow run使用conda安装所有依赖项。要运行一个项目而不使用conda,你可以为mlflow运行提供——no-conda选项。在这种情况下,您必须确保在您的Python环境中已经安装了必要的依赖项。

保存和服务模型

MLflow包含一个通用的MLmodel格式,用于以不同的方式保存来自各种工具的模型。例如,许多模型都可以作为Python函数使用,因此MLmodel文件可以声明如何将每个模型解释为Python函数,以便让各种工具为其服务。MLflow还包括用于在本地运行这些模型的工具,并将它们导出到Docker容器或商业服务平台。

为了说明此功能,MLFlow.sklearn软件包可以将Scikit-Learn模型作为MLFLOW伪像将其记录到Scikit-Learn模型中,然后再次加载它们以进行服务。Sklearn_logistic_regression/train.py中有一个示例培训应用程序,您可以按照以下方式运行:
train.py

import numpy as np
from sklearn.linear_model import LogisticRegression

import mlflow
import mlflow.sklearn

if __name__ == "__main__":
    X = np.array([-2, -1, 0, 1, 2, 1]).reshape(-1, 1)
    y = np.array([0, 0, 1, 1, 1, 0])
    lr = LogisticRegression()
    lr.fit(X, y)
    score = lr.score(X, y)
    print("Score: %s" % score)
    mlflow.log_metric("score", score)
    mlflow.sklearn.log_model(lr, "model")# 将 scikit-learn 模型记录为当前运行的 MLflow 工件。参数 sk_model – 要保存的 scikit-learn 模型。 artifact_path – 运行相关的工件路径。 conda_env –
    print("Model saved in run %s" % mlflow.active_run().info.run_uuid)

conda.yaml

name: sklearn-example
channels:
  - conda-forge
dependencies:
  - python=3.7
  - pip
  - pip:
    - mlflow>=1.0
    - scipy
    - scikit-learn

MLproject

name: sklearn_logistic_example
conda_env: conda.yaml
entry_points:
  main:
    command: "python train.py"

RUN

python sklearn_logistic_regression/train.py

运行示例时,它将为该实验输出MLFLOW运行ID。如果您查看MLFlow UI,您还将看到运行保存了一个包含MLMODEL描述文件和腌制Scikit-Learn模型的模型文件夹。您可以将运行ID和模型的路径传递到工件目录(此处“模型”)中的各种工具。例如,MLFLOW包含一个用于基于Python的模型的简单REST服务器:

mlflow models serve -m runs:/<RUN_ID>/model

默认情况下,服务器在端口 5000 上运行。如果该端口已被使用,请使用–port选项指定不同的端口。例如:mlflow models serve -m runs:/<RUN_ID>/model --port 1234

启动服务器后,您可以将一些示例数据传递给它并查看预测。

面的例子使用curl向模型服务器发送一个json序列化的pandas DataFrame。有关pyfunc模型服务器接受的输入数据格式的更多信息

curl -d '{"columns":["x"], "data":[[1], [-1]]}' -H 'Content-Type: application/json; format=pandas-split' -X POST localhost:5000/invocations

在远程机器上启动跟踪服务器

在远程机器上启动跟踪服务器。

然后,您可以通过将环境变量设置为服务器的 URI 或将以下内容添加到程序的开头来登录到远程跟踪服务器:MLFLOW_TRACKING_URI

import mlflow
mlflow.set_tracking_uri("http://YOUR-SERVER:4040")
mlflow.set_experiment("my-experiment")

登录 Databricks 社区版

或者,注册Databricks 社区版,这是一项包含托管跟踪服务器的免费服务。请注意,Community Edition 旨在用于快速试验而不是生产用例。注册后,运行为 MLflow 创建凭据文件,指定 https://community.cloud.databricks.com作为主机。databricks configure

要登录到 Community Edition 服务器,请将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")

参考

https://www.mlflow.org/docs/latest/quickstart.html

 类似资料: