公司使用了mlflow+spark作为工具. 那么必须了解一下.

缘起

  • 痛点,
    • 工具太过复杂、
    • 难以跟踪实验、
    • 难以重现结果、
    • 难以部署模型。
  • 方案:
    • 强大
    • 可预测
    • 普及
  • mlflow 管理机器学习的生命周期
    • tracking 跟踪算法训练, 记录和查询实验数据
    • porjects管理算法脚本, 包装了可重复运行
    • models做部署, 管理和部署模型

相关概念

  • flask 一个python的web框架
    • WSGI网关接口, 简单地说, 可以实现web服务的通用代码了, 不至于换框架就要重写代码.
  • gunicorn
    • 模板引擎, 简单地说就是把动态代码转化为html的引擎.
  • anaconda 一个python的包, 包括了很多相关库, 尤其是做机器学习, 直接装这个最好了, 各种依赖都OK了.
  • Jupyter notebook 可以将数据分析的代码、图像和文档全部组合到一个web文档中。

步骤

参考: https://pypi.org/project/mlflow/

  1. 搞定anaconda. 参见隔壁的: 2019-10-28-mac下面anaconda有坑

  2. git clone https://github.com/mlflow/mlflow

  3. 在mlflow目录下, 命令行操作:

    python examples/quickstart/mlflow_tracking.py
    # 输出结果在: outputs/test.txt
    mlflow ui
    # 然后在chrome看结果, 注意, 必须是chrome, 换成safari都不可以.
    http://localhost:5000/
    # 好神奇, 再次验证, 发现safari也是可以的.
    mlflow run examples/sklearn_elasticnet_wine -P alpha=0.4
    # 运行一个样例项目. 但是, 没有看到啥结果. 
    mlflow run https://github.com/mlflow/mlflow-example.git -P alpha=0.4
    # 再运行这一行, 难道这是两个步骤?
    # outputs里面依旧空空如也, 但是, mlruns里面很多内容了. 这个项目的内容在mlruns啊.
    python examples/sklearn_logistic_regression/train.py
    # 这里的输出有run-id
    mlflow models serve --model-uri runs:/<run-id>/model
    # 这句话是pip提供的, 貌似有点问题.
    mlflow models serve -m runs:/<RUN_ID>/model
    # 这个是官网的, 运行正常了.
    mlflow models serve -m runs:/126bd233421344c8b93bb94132fa44ca/model
    # 跑完之后, 浏览器访问: http://localhost:5000   然后404了. 再跑一次试试.
    http://127.0.0.1:5000 
    # 依旧404 
    # 后台报错:  [CRITICAL] WORKER TIMEOUT
       
    # 喂一个json试试
    curl -d '{"columns":["x"], "data":[[1], [-1]]}' -H 'Content-Type: application/json; format=pandas-split' -X POST localhost:5000/invocations
    # 这个返回结果: [1, 0]%   
    # 到这里位置, pip的实验全部结束了. 虽然我有一个404.
       
       
    # 在官网看到mlflow ui最好是在example里面执行.
    

一个报错

前台显示: 404
后台显示:  [CRITICAL] WORKER TIMEOUT
  1. 官方的答复, mlflow ui不要在git clone 的mlflow目录里面搞, 因为目录会有问题.
  2. https://www.mlflow.org/docs/latest/quickstart.html#installing-mlflow
    • 这里明确指出, 我们要进入到example目录, 再进行命令行操作.
  3. https://www.mlflow.org/docs/latest/tutorial.html
    • 这里明确指出, 如果在根目录操作, 那么等于从源代码编译, 会有各种问题. 在example目录操作才是实际使用了conda的安装.
python sklearn_logistic_regression/train.py
mlflow models serve -m runs:/<RUN_ID>/model
mlflow models serve -m runs:/1c81c69909d14c61ad0f6a182551b633/model
# 加个端口号试试
mlflow models serve -m runs:/1c81c69909d14c61ad0f6a182551b633/model --port 8050

# 但是curl是正常的
curl -d '{"columns":["x"], "data":[[1], [-1]]}' -H 'Content-Type: application/json; format=pandas-split' -X POST localhost:8050/invocations

# 也就是说是一个正经的404, 根目录就是不能get访问的, 他就是一个post接口. 

# 按照tutorail的步骤试试
python sklearn_elasticnet_wine/train.py 0.4 0.4
python sklearn_elasticnet_wine/train.py 0.3 0.8

# 此时, mlflow ui 真的可以在浏览器看到结果了.

新建一个目录再操作一遍试试.

  • mlflow ui
  • models serve
怎么做到的?
  • mlflow 有一个配置文件, 描述了需要记录的内容: MLproject
  • 这个文件中比较关键的是致命conda依赖文件, 一般为conda.yaml
  • conda.yaml和npm的package文件很像
mlflow run sklearn_elasticnet_wine -P alpha=0.42
# 这个结果很正常, ui也直接能反应出结果
# python执行py, 和mlflow run 目录貌似结果是一致的.
#mlflow run 貌似没有生成artifacts

神奇的结果:

python sklearn_elasticnet_wine/train.py 0.3 0.8
# 这个有正常的artifacts输出
mlflow run sklearn_elasticnet_wine -P alpha=0.42
# 这个artifacts输出为空
# 其实这个有输出, 他默认输出到了sklearn_elasticnet_wine的目录下面新建的mlruns里面.
# 因此, 在项目目录里面运行mlflow ui 就正常了.

# 输出到运行命令的路径下,  可以指定 
--default-artifact-root

# 多提一句, 下面这个是train.py的最后一句, 输出结果的.
mlflow.sklearn.log_model(lr, "model")

管理概念

  • 每个run都可以点开, 查看进一步的信息.
  • 这个需要一个图来描述

可以把调好的结果作为一个server

mlflow models serve -m mlruns/0/1c81c69909d14c61ad0f6a182551b633/artifacts/model -p 8484
#然后这个应该就是curl访问了.
curl -X POST -H "Content-Type:application/json; format=pandas-split" --data '{"columns":["alcohol", "chlorides", "citric acid", "density", "fixed acidity", "free sulfur dioxide", "pH", "residual sugar", "sulphates", "total sulfur dioxide", "volatile acidity"],"data":[[12.8, 0.029, 0.48, 0.98, 6.2, 29, 3.33, 1.2, 0.39, 75, 0.66]]}' http://127.0.0.1:8484/invocations

对于quickstart和tutorial的小结

  1. 安装, 这货依赖conda, 因此, 我的建议是用conda直接安装.
  2. clone整个项目, 这里有一个关键, 我们要在example里面操作. 千万不要在项目根目录操作, 因为在根目录操作意味着使用源文件.
  3. 运行样例python
  4. mlflow ui看结果, 注意, 一定要在有mlruns的目录看, 并且要确认目录里面有东西.
  5. mlflow run 某个样例, 这里有两个注意事项
    1. 目录里面要有mlproject文件
    2. 运行之后, mlruns目录可能会生成在样例目录里面.
  6. mlflow models serve 把一个运行结果(训练好的模型)当做serve运行,
    1. 这里面的run_id就是目录中的目录名.
    2. 这个serve是一个接受post的serve, 可以curl访问, 不可以直接浏览器get访问.
  7. 可以使用databricks在远程搞.

concepts 概念

三个基础概念

  • tracking
  • project
  • model

机器学习工作流程

  1. 准备数据
  2. 做一个算法model为了最大化metric(指标)
  3. 部署
  4. 监控计算效率
  5. 用新的数据做校验
  6. 和其他算法模型做比较

机器学习面临的挑战

  1. 难于积累经验
  2. 难于复用代码, 因为要复用整个环境
  3. 没有标准的方法去打包和部署model, 大家都用自己的方式存储和关联 模型, code, 参数这三部分.

目标

  1. 虽然各个ml库都或多或少的解决了上面的3个问题, 但是, 我们肯定会用到多个库.
  2. mlflow 让 训练, 重用, 部署模型一致化, 不论任何的库, 并且将这些流程打包成可以复用的黑盒. 甚至于, 复用时都不必知道这个项目依赖了什么库.

核心3个零件: components

  1. tracking 一套api和ui, 记录参数, 版本, 指标metrics, 输出
  2. project 一个标准的打包格式, 具体可以认为是mlproject文件的格式, 我们可以方便的调用某个git版本的project, 用多个project形成chain.
  3. model 指的是整体的目录结构, 一个目录组织了一个model,

mlflow可以在3个维度变形出发

  1. 可以在集群部署, 比如spark
  2. 可以用不同的参数并行运算多个run
  3. 可以i/o在分布存储上

mlflow的案例

  1. 独立数据科学家, 可以在本机组织项目, 方便未来重用.
  2. 数据科学团队, 可以部署一个tracking server, 用来记录和比较不同用户的工作.
  3. 大型团队, 可以分享project, models, 和成果(result), 团队可以存储数据准备和训练, 也可以比较不同团队的结果, 可以方便的把成果从研发(R&D)到生产(production).
  4. 生产工程师, 可以用同样的方法部署使用不同的机器学习库的model.
  5. 开源研发, 可以直接发布到某个git, 方便别人直接使用mlflow run github.com/*** 来运行.
  6. 机器学习库的开发者, 如果用了mlflow的格式, 那么可以让开发很容易的使用这个机器学习库. 并且有大量的mlflow兼容的工具可以支持这个库.

引用

  • https://segmentfault.com/a/1190000016855955
  • mlflow 的出现极大方便了炼丹师傅们的工作,提供了堪比 michelangelo 的用户体验,并且全面支持 sklearn、spark、pytorch、tensorflow、mxnet、mlr、xgboost、keras 等主流算法框架。

对外

  • 模型支持不同的口味(Flavors),包含Pytorch,Scikit-Learn,Tensorflow和Spark ML。https://mlflow.org/docs/latest/models.html 这里列举了支持的框架.
  • 支持本地部署,Microsoft AzureML,AWS Sagemaker和Apache Spark。
  • MLFlow并不能解决不同工具所产生的模型不兼容的问题,并不能把一个tensorflow的模型部署到Saprk上。可以关注项目:Mleap
  • 另外MLFlow使用Flask提供web服务

整体链路上的一环

  • k8s kubeflow kustomize
  • spark mlflow databricks