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_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")
运行 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)
wine_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "wine-quality.csv")
data = pd.read_csv(wine_path)
train, test = train_test_split(data)
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")
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")
mlflow.set_experiment("/my-experiment")
参考
https://www.mlflow.org/docs/latest/quickstart.html
|