MLflow是一个 管理ML生命周期 的开源平台


前言

MLflow是一个简化机器学习开发的平台,包括跟踪实验,将代码打包成可重复的运行,以及分享和部署模型。MLflow提供了一套轻量级的API,可以与任何现有的机器学习应用程序或库(TensorFlow、PyTorch、XGBoost等)一起使用,无论你目前在哪里运行ML代码(例如在笔记本、独立的应用程序或云中)。MLflow目前的组件是:

组件 说明
MLflow Tracking 一个用于记录机器学习实验中的参数、代码和结果的API,并使用交互式UI进行比较。
MLflow Projects 一个使用Conda和Docker的可重复运行的代码打包格式,因此你可以与他人分享你的ML代码。
MLflow Models 一种模型打包格式和工具,让你轻松地将同一个模型(来自任何ML库)部署到Docker、Apache Spark、Azure ML和AWS SageMaker等批处理和实时处理平台上。
MLflow Model Registry 一个集中的模型存储中心、API集合和UI界面,以协同管理MLflow模型的整个生命周期。

1. MLFlow部署

需要将 conda 配置到环境变量中

  1. pip install mlflow

打开MLFlow的UI页面:http://127.0.0.1:5000
【注意】:不建议从MLflow的克隆中运行 mlflow ui 这样做会从源代码中运行开发UI。我们建议从一个不同的工作目录中运行UI,并通过 —backend-store-uri 选项指定一个后端存储。

  1. mlflow ui
  • —backend-store-uri:数据库连接,需要手动建库
  • —default-artifact-root:元数据存储目录,创建文件夹mlruns,用于保存机器学习模型和其他工件
    1. # 数据库用户名:root,数据库密码:123456,mlflow为数据库名
    2. mlflow ui --backend-store-uri mysql://root:123456@localhost/mlflow --default-artifact-root file:D:\workspace\program_space\mlflow\mlruns -h 0.0.0.0 -p 8000
    在命令行执行样例程序 python mlflow_test.py,执行 MLFlow 任务,在UI页面查看 ```powershell

    mlflow_test.py文件

    import os from random import random, randint from mlflow import log_metric, log_param, log_artifacts

if name == “main“: print(“Running mlflow_tracking.py”)

  1. log_param("param1", randint(0, 100))
  2. log_metric("foo", random())
  3. log_metric("foo", random() + 1)
  4. log_metric("foo", random() + 2)
  5. if not os.path.exists("outputs"):
  6. os.makedirs("outputs")
  7. with open("outputs/test.txt", "w") as f:
  8. f.write("hello world!")
  9. log_artifacts("outputs")
  1. <a name="XVwHj"></a>
  2. ## 2. MLFlow运行项目
  3. **mlflow **运行命令可以让你从 **本地路径 **或 **Git URI **中运行一个与 MLproject 文件打包的项目。
  4. ```powershell
  5. // 通过本地路径执行
  6. mlflow run examples/sklearn_elasticnet_wine -P alpha=0.4
  7. // 通过URI执行
  8. mlflow run https://github.com/mlflow/mlflow-example.git -P alpha=0.4

image.png

3. 模型保存和服务

为了说明模型管理,mlflow.sklearn 包可以将 scikit-learn 模型记录为 MLflow 工件,然后再次加载它们进行模型服务。在examples/sklearn_logistic_regression/train.py 中有一个训练应用的例子,你可以按如下方式运行:

  1. $ python examples/sklearn_logistic_regression/train.py
  2. Score: 0.666
  3. Model saved in run <run-id>
  4. $ mlflow models serve --model-uri runs:/<run-id>/model
  5. $ curl -d '{"columns":[0],"index":[0,1],"data":[[1],[-1]]}' -H 'Content-Type: application/json' localhost:5000/invocations

train.py文件的内容如下:

  1. import numpy as np
  2. from sklearn.linear_model import LogisticRegression
  3. import mlflow
  4. import mlflow.sklearn
  5. if __name__ == "__main__":
  6. X = np.array([-2, -1, 0, 1, 2, 1]).reshape(-1, 1)
  7. y = np.array([0, 0, 1, 1, 1, 0])
  8. lr = LogisticRegression()
  9. lr.fit(X, y)
  10. score = lr.score(X, y)
  11. print("Score: %s" % score)
  12. mlflow.log_metric("score", score)
  13. mlflow.sklearn.log_model(lr, "model")
  14. print("Model saved in run %s" % mlflow.active_run().info.run_uuid)

4. 生产环境部署

如果你想让 Tracking 服务器在重启后仍能正常运行,并且对故障有弹性,那么把它作为一个 systemd服务 运行是非常有用的。
你需要进入 /etc/systemd/system 文件夹,创建一个名为 mlflow-tracking.service 的新文件,内容如下:

  1. [Unit]
  2. Description=MLflow tracking server
  3. After=network.target
  4. [Service]
  5. Restart=on-failure
  6. RestartSec=30
  7. ExecStart=/bin/bash -c 'PATH=/path_to_your_conda_installation/envs/mlflow_env/bin/:$PATH exec mlflow server --backend-store-uri postgresql://mlflow:mlflow@localhost/mlflow --default-artifact-root file:/home/your_user/mlruns -h 0.0.0.0 -p 8000'
  8. [Install]
  9. WantedBy=multi-user.target

激活并启动服务:

  1. sudo systemctl daemon-reload
  2. sudo systemctl enable mlflow-tracking
  3. sudo systemctl start mlflow-tracking

检查服务状态是否正常:

  1. sudo systemctl status mlflow-tracking