MLflow使用方法

1. MLflow介绍

直接copy官网上的介绍:

MLflow is an open source platform for managing the end-to-end machine learning lifecycle. It tackles three primary functions:

Tracking experiments to record and compare parameters and results (MLflow Tracking).

Packaging ML code in a reusable, reproducible form in order to share with other data scientists or transfer to production (MLflow Projects).

Managing and deploying models from a variety of ML libraries to a variety of model serving and inference platforms (MLflow Models).

简单说,MLflow设计出三个概念,解决ML开发过程中的三个痛点。

  • Tracking:模型参数、指标记录繁琐,Tracking可以记录模型的配置信息,并可视化展示
  • Projects:模型结果难以再现,Projects通过conda重现模型所需环境、依赖,使得模型结果可以复现
  • Models:开发的模型部署难,Models打包、封装模型,并提供部署
1572856548288.jpg

2. 安装MLflow

官网上说直接pip即可:

pip install mlflow

但是在mac上不行,官网上推荐了如下使用方法。


1572857232101.jpg

我这里直接用virtualenv,亲测可用,步骤如下:

  • 在某目录下新建mlflow文件夹
mdkir mlflow
cd mlflow
  • 创建一个干净的venv环境
virtualenv --no-site-packages venv
  • 安装mlflow、sklean等包
pip3 install mlflow
pip3 install sklearn

3. Tracking

这里根据官网上的QuickStart提供的例子,改装了一下,用我们熟悉的Iris作为demo,展示相关功能。

3.1 code

新建一个iris的文件夹,里面存放Iris.csv数据,新建train.py

import os
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__":
    np.random.seed(40)

    # Read the Iris csv file from the URL
    csv_url =\
        'Iris.csv'
    try:
        data = pd.read_csv(csv_url, sep=',')
        data.loc[data['Species'] == 'Iris-setosa','Species'] = 0
        data.loc[data['Species'] == 'Iris-versicolor','Species'] = 1
        data.loc[data['Species'] == 'Iris-virginica','Species'] = 2
        data['Species'] = data['Species'].astype('int')
    except Exception as e:
        print("Unable to download data, Error: %s", e)

    # 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(["Species", "Id"], axis=1)
    test_x = test.drop(["Species", "Id"], axis=1)
    train_y = train[["Species"]]
    test_y = test[["Species"]]

    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)

这段代码展示的是如何使用Tracking功能,可以看到使用过程非常简单。

  • mlflow.log_param("key", value) log模型参数
  • mlflow.log_metric("key", value) log模型的指标
  • ......

执行代码

python train.py 0.5 0.1 # 0.5 0.1是参数

Tracking的结果会记录在目录下,生成mlruns目录

3.2 效果

在iris目录中执行命令,即可在http://localhost:5000/#/看到效果。

mlflow ui
1572858023456.jpg
1572858204809.jpg

4. Projects

在iris目录下,新建MLproject文件和conda.yaml。

MLproject:


name: iris_model

conda_env: conda.yaml

entry_points:
  main:
    parameters:
      alpha: {type: float, default: 0.5}
      l1_ratio: {type: float, default: 0.1}
    command: "python train.py {alpha} {l1_ratio}"

conda.yaml


name: iris_model
channels:
  - defaults
dependencies:
  - python=3.6
  - scikit-learn=0.19.1
  - pip:
    - mlflow>=1.0

这样就会记录该模型所需的环境信息,执行如下命令即可复现模型结果。如果不需要conda,则需要保障运行的环境已经安装了必要的依赖,在命令上加上--no-conda即可。

mlflow run sklearn_elasticnet_wine -P alpha=0.5 -P l1_ratio=0.1

5. Models

这部分没有细看,总感觉不是很通用,部署这部分跟ML平台联系比较紧密。对于模型开发者来说,并不关心部署和打包;对于模型平台开发来说,使用MLflow又丧失了一些独特性的开发需求,并且跟自己业务系统适配性、分布式部署等等都不太搭。

6. 总结

MLflow中的Tracking还是挺有用的,希望模型开发的同学可以考虑试用下。Projects、Models还需要再看看。

7. 参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 226,979评论 6 528
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 97,750评论 3 412
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 174,647评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,299评论 1 307
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,104评论 6 405
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,623评论 1 320
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,716评论 3 434
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,873评论 0 285
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,380评论 1 330
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,344评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,496评论 1 365
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,055评论 5 355
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,756评论 3 343
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,146评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,410评论 1 281
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,072评论 3 386
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,485评论 2 370

推荐阅读更多精彩内容