Mlflow入门
公司使用了mlflow+spark作为工具. 那么必须了解一下.
缘起
- 痛点,
- 工具太过复杂、
- 难以跟踪实验、
- 难以重现结果、
- 难以部署模型。
- 方案:
- 强大
- 可预测
- 普及
- mlflow 管理机器学习的生命周期
- tracking 跟踪算法训练, 记录和查询实验数据
- porjects管理算法脚本, 包装了可重复运行
- models做部署, 管理和部署模型
相关概念
- flask 一个python的web框架
- WSGI网关接口, 简单地说, 可以实现web服务的通用代码了, 不至于换框架就要重写代码.
- gunicorn
- 模板引擎, 简单地说就是把动态代码转化为html的引擎.
- anaconda 一个python的包, 包括了很多相关库, 尤其是做机器学习, 直接装这个最好了, 各种依赖都OK了.
- Jupyter notebook 可以将数据分析的代码、图像和文档全部组合到一个web文档中。
步骤
参考: https://pypi.org/project/mlflow/
-
搞定anaconda. 参见隔壁的: 2019-10-28-mac下面anaconda有坑
-
git clone https://github.com/mlflow/mlflow
-
在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
- 官方的答复, mlflow ui不要在git clone 的mlflow目录里面搞, 因为目录会有问题.
- https://www.mlflow.org/docs/latest/quickstart.html#installing-mlflow
- 这里明确指出, 我们要进入到example目录, 再进行命令行操作.
- 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的小结
- 安装, 这货依赖conda, 因此, 我的建议是用conda直接安装.
- clone整个项目, 这里有一个关键, 我们要在example里面操作. 千万不要在项目根目录操作, 因为在根目录操作意味着使用源文件.
- 运行样例python
- mlflow ui看结果, 注意, 一定要在有mlruns的目录看, 并且要确认目录里面有东西.
- mlflow run 某个样例, 这里有两个注意事项
- 目录里面要有mlproject文件
- 运行之后, mlruns目录可能会生成在样例目录里面.
- mlflow models serve 把一个运行结果(训练好的模型)当做serve运行,
- 这里面的run_id就是目录中的目录名.
- 这个serve是一个接受post的serve, 可以curl访问, 不可以直接浏览器get访问.
- 可以使用databricks在远程搞.
concepts 概念
三个基础概念
- tracking
- project
- model
机器学习工作流程
- 准备数据
- 做一个算法model为了最大化metric(指标)
- 部署
- 监控计算效率
- 用新的数据做校验
- 和其他算法模型做比较
机器学习面临的挑战
- 难于积累经验
- 难于复用代码, 因为要复用整个环境
- 没有标准的方法去打包和部署model, 大家都用自己的方式存储和关联 模型, code, 参数这三部分.
目标
- 虽然各个ml库都或多或少的解决了上面的3个问题, 但是, 我们肯定会用到多个库.
- mlflow 让 训练, 重用, 部署模型一致化, 不论任何的库, 并且将这些流程打包成可以复用的黑盒. 甚至于, 复用时都不必知道这个项目依赖了什么库.
核心3个零件: components
- tracking 一套api和ui, 记录参数, 版本, 指标metrics, 输出
- project 一个标准的打包格式, 具体可以认为是mlproject文件的格式, 我们可以方便的调用某个git版本的project, 用多个project形成chain.
- model 指的是整体的目录结构, 一个目录组织了一个model,
mlflow可以在3个维度变形出发
- 可以在集群部署, 比如spark
- 可以用不同的参数并行运算多个run
- 可以i/o在分布存储上
mlflow的案例
- 独立数据科学家, 可以在本机组织项目, 方便未来重用.
- 数据科学团队, 可以部署一个tracking server, 用来记录和比较不同用户的工作.
- 大型团队, 可以分享project, models, 和成果(result), 团队可以存储数据准备和训练, 也可以比较不同团队的结果, 可以方便的把成果从研发(R&D)到生产(production).
- 生产工程师, 可以用同样的方法部署使用不同的机器学习库的model.
- 开源研发, 可以直接发布到某个git, 方便别人直接使用mlflow run github.com/*** 来运行.
- 机器学习库的开发者, 如果用了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