您的位置:

MLflow:从实验到部署

MLflow是一个开源的平台,用于管理端到端的机器学习生命周期。它包括用于跟踪,管理和部署机器学习模型的工具。本文将从mlflow教程, mlflow tensorflow, mlflow部署, mlflow docker, mlflow代码解析, mlflow kubeflow, mlflow 模型发布, mlflow model docker部署等多个方面详细介绍MLflow的使用和部署。

一、MLflow教程

MLflow的目标是提供可重复性和可管理性的流程,使得机器学习模型的开发更加高效。首先,我们需要在机器上安装MLflow。其中,最简单的方法是使用pip install mlflow安装,如果你使用的是conda,则使用conda install -c conda-forge mlflow安装。

!pip install mlflow

接下来,我们可以进入到mlflow的UI页面,并查看相关信息。首先,我们需要在代码开始时引入mlflow库:

import mlflow
mlflow.set_experiment('test_experiment')

然后,通过使用with mlflow.start_run()可以方便地记录我们要追踪的指标。

with mlflow.start_run():
    mlflow.log_param('param1', 1)
    mlflow.log_metric('metric1', 2.5)
    mlflow.log_artifact('/path/to/artifact')

通过执行代码后,可以在mlflow的UI界面上查看记录的实验和相关的参数。

二、MLflow Tensorflow

MLflow对于各种机器学习框架都有良好的支持,其中,Tensorflow就是其中一个。在MLflow中使用Tensorflow,首先需要安装对应的MLflow Tensorflow插件:

!pip install mlflow tensorflow==1.15.2
!pip install mlflow-tensorflow

然后,在Tensorflow训练文件(例如train.py)中引入mlflow库,通过调用mlflow.tensorflow.autolog()来自动记录训练指标。

import mlflow.tensorflow

mlflow.tensorflow.autolog()

with mlflow.start_run(run_name='test run'):
    model.fit(X_train, y_train, epochs=10, batch_size=32)


运行完上述脚本,就可以在mlflow UI中看到所有的Tensorflow模型信息,以及它们的性能指标。

三、MLflow部署

部署一个机器学习模型的过程可能是非常繁琐的,因此,MLflow提供了一些工具来简化这个过程。例如,通过使用MLflow models API,可以将训练好的模型打包并使用MLflow部署API轻松部署到基于Docker的服务中。

import mlflow
import mlflow.tensorflow
from mlflow.models.signature import infer_signature

mlflow.tensorflow.log_model(
    tf_saved_model_dir=model_dir,
    tf_meta_graph_tags=['train'],
    tf_signature_def_key='predict_output',
    artifact_path='model'
)

# 部署部分
import os
import json
import requests

def predict(input_data_json):
    endpoint = 'http://localhost:5000/invocations'
    headers = {'Content-Type': 'application/json'}
    data = input_data_json

    response = requests.post(endpoint, headers=headers, data=data)
    return json.loads(response.content.decode('utf-8'))

运行完上述脚本后,即可在Docker中部署模型,并进行预测。

四、MLflow Docker

MLflow的Docker镜像可以通过Docker Hub下载。例如,我们可以使用docker run mlflow来启动一个包含MLflow的Docker容器。可以通过以下命令来启动MLflow本地服务器:

docker run -p 5000:5000 -e http_proxy=localhost:8000 mlflow server --backend-store-uri sqlite:///mlflow.db --default-artifact-root ./mlflow_artifacts

运行命令后,即可在本地的端口5000上访问MLflow的UI界面。

五、MLflow代码解析

MLflow的代码解析包括两部分,一是在MLflow中使用其他机器学习库,二是在模型存储和加载时使用MLflow。

对于第一部分,以XGBoost为例,我们需要通过MLflow来训练模型并记录实验以及结果。其中,XGBoost的代码略去,我们只列出MLflow部分的代码:

import mlflow
import xgboost as xgb

with mlflow.start_run():
    params = {'objective': 'reg:squarederror', 'colsample_bytree': 0.3, 'learning_rate': 0.1}

    dtrain = xgb.DMatrix(X_train, label=y_train)
    dtest = xgb.DMatrix(X_test, label=y_test)

    model = xgb.train(params, dtrain, evals=[(dtest, 'test')])
    mlflow.xgboost.log_model(model, 'model') 

对于第二部分,我们可以使用MLflow的API来存储和读取模型的信息。例如,我们可以在训练模型时使用MLflow来存储其参数:

import mlflow

mlflow.log_param("x", 1)
mlflow.log_param("y", 2)
mlflow.log_param("z", 3)

mlflow.log_metric("rmse", 0.53)
mlflow.log_metric("mae", 0.325)
mlflow.log_metric("r2", 0.83)

mlflow.log_artifact("model.pkl")

并且,在模型加载时,可以通过MLflow读取存储的信息。

import mlflow.sklearn

model_uri = "runs:/run_id/model"

model = mlflow.sklearn.load_model(model_uri=model_uri)
params = mlflow.sklearn.load_model(model_uri=model_uri)['_sklearn_argparse_spec']
artifacts = mlflow.sklearn.load_model(model_uri=model_uri, artifact_path="model.pkl")

六、MLflow Kubeflow

Kubeflow是一个用于机器学习工作流的开源生态系统,而MLflow模型在Kubeflow上部署非常方便。首先,我们需要先安装Kubeflow。然后,通过调用MLflow的Kubernetes Deploy API,我们可以将模型部署到Kubernetes平台上:

import mlflow
import mlflow.kubernetes

mlflow.kubernetes.deploy(app_name="my-model",
                          model_uri="runs:/run_id/model",
                          image="my-docker-image",
                          ports=[8000])

运行上述代码后,MLflow会为我们创建一个Kubernetes部署,并将模型部署到Kubernetes节点上。

七、MLflow模型发布

一旦我们在MLflow中开发了模型,发布这个模型也是非常容易的。我们首先可以将模型打包为.tar或.zip格式的文件,然后将其存储在MLflow的artifact store中来分享模型。随后,我们也可以将Artifact作为数据表来共享它们。

import mlflow.sagemaker as mfs

mfs.deploy(app_name="my-model",
           model_uri="runs:/run_id/model",
           app_entry_point="entry_point.py",
           mode="create", # "replace"
           region_name="us-west-2",
           execution_role_arn="arn:aws:iam::XXXXXXXXXXXX:role/SageMakerRole",
           instance_type="ml.m4.xlarge",
           instance_count=1,
           accelerator_type="ml.eia2.medium",
           endpoint_name="my-model-endpoint")

运行完上述脚本后,即可将模型部署到Amazon SageMaker中,并将该模型作为API调用。同时,MLflow也可以帮助我们记录模型的所有metric和parameter数据,以便在部署时使用。

MLflow model Docker部署

MLflow Model可以轻松打包为Docker,然后发布到任何支持Docker部署的地方,例如Kubernetes。我们需要定义一个Dockerfile,并包含以下内容:

FROM python:3.6
RUN pip install mlflow boto3
WORKDIR /app
COPY mlflowmodel.py /app
COPY requirements.txt /app
RUN pip install -r /app/requirements.txt
ENTRYPOINT ["python", "mlflowmodel.py"]

然后,我们可以运行以下命令将该模型打包成Docker镜像:

docker build -t mlflow-model .

最终,我们可以将该模型部署到Docker容器中,并进行使用:

docker run -it -p 5000:5000 mlflow-model

结论

总之,MLflow提供了一个全面的平台以管理从实验到部署的机器学习生命周期。我们可以通过使用MLflow追踪实验结果,使用MLflow Tensorflow记录模型的性能指标,MLflow部署API轻松部署模型,使用MLflow的API保存和加载模型等。通过以上的剖析,我们可以清楚地了解如何使用MLflow来管理端到端的机器学习生命周期。