我们平时使用scikit-learn做机器学习建模,主要是实验环境是notebook(jupyter),有些问题就像牛皮癣一样,很难去除,例如:
机器学习算法有几十个可配置参数,无论您是单独工作还是团队工作,都很难跟踪哪些参数,代码和数据进入每个实验以生成模型。
如果没有详细的跟踪,团队往往难以获得相同的代码再次工作。无论您是要回想自己之前的工作,还是需要向客户展示你的工作,都是一个麻烦事情。
3. 管理混乱。
无论是参数,还是模型,过段时间就会忘记哪个跟哪个对应了。别的同事如果想接手你的工作,也很难理解你的工作。
这些问题如果完全使用在线的可视化建模工具其实可以解决,但是可视化的建模工具又有一个大麻烦,就是很不灵活,如果我们在建模的过程中使用了别的算法包怎么办,另外数据清洗也很难集成。其实我们需要一个能方便进行参数和指标管理的工具,而数据清洗和训练过程又依然是能自由进行的工具。
没错,我们需要的是Mlflow,而且是和Notebook结合使用。
启动Mlflow跟踪界面
我们先安装Mlflow,先新建一个Notebook文件:
# 安装mlflow
!pip install mlflow
成功之后,我们就可以启动一个跟踪界面了:
# 只是本机访问
!mlflow ui
# 需要给其他人访问
!mlflow ui --host 0.0.0.0
是否需要增加host参数,就看自己的需要,启动之后,默认的端口是5000。这样你就能通过浏览器进行访问:http://localhost:5000/
你看到的界面大概如下:
第一次进来是空白的,当你训练模型时进行记录之后,刷新页面才能看到数据。
新建实验
一次实验你可以理解为一个待建模解决的问题等,创建很简单,只需要一个名字:
import mlflow
mlflow.create_experiment('Boston_Housing_Price')
注意:如果该实验名字已经存在,则会报错,不过并不会影响。
执行完之后,在当前目录下会自动创建一个目录“mlruns”。
训练模型
我们新建一个Notebook文件来做模型训练。
每训练一次模型对应一个Mlflow中的一次run(运行),而在run的过程中,我们就能根据需要记录相应的环境参数或者训练参数等,训练完成之后,再将模型指标记录起来,以后跟踪就简单了。
一个简单的例子:
from sklearn.linear_model import LinearRegression as lr
from sklearn.metrics import mean_squared_error
# 开始一次运行
with mlflow.start_run():
# 训练模型
mlflow.log_param("algo", 'lr') # 使用的算法
mlflow.log_param("normalize", True) # 训练参数
model = lr(normalize=True)
model.fit(train_x, train_y)
pred_y = model.predict(train_x)
print("训练误差:", mean_squared_error(train_y, pred_y))
mlflow.log_metric("train_mse", mean_squared_error(train_y, pred_y))
pred_y = model.predict(test_x)
print("测试误差:", mean_squared_error(test_y, pred_y))
mlflow.log_metric("test_mse", mean_squared_error(test_y, pred_y))
注意:上面的代码省略了数据清洗和划分的步骤。
上面将算法名称也作为一个参数进行记录,这样方便以后对比不同算法的效果。用于记录的函数就两个:
而使用不同的参数和算法,只需要不断重复上面的步骤即可,mlflow会自动帮我们追踪对应的参数和指标。只要刷新mlflow的追踪界面:
我们可以看到,每一次训练时所使用的参数和相应的指标,妈妈再也不用担心你会忘记了,和数据清洗及建模过程几乎无痛对接。而且还能对指标进行排序,能根据参数值进行筛选,非常的人性化。
保存与加载模型
在一次run的过程中,调用接口保存模型即可,如果是sklearn可以如此:
import mlflow.sklearn
# 第二个参数是相对路径:models
# 实际存储路径类似这样的:./mlruns/1/dfb212c414fc487d886803d84b1f1ba8/artifacts/models/model.pkl
mlflow.sklearn.log_model(model, "models")
模型保存了之后,在需要的时候,加载出来即可,不过加载模型需要先找到运行ID:
上面红色圈住的即是运行ID。有ID即可加载模型:
# API:https://mlflow.org/docs/latest/python_api/mlflow.sklearn.html#mlflow.sklearn.load_model
# runs:/<mlflow_run_id>/run-relative/path/to/model
model = mlflow.sklearn.load_model('runs:/429083d2e8b34b0585b2e2fff30be28d/models')
uri的语法,可以看接口文档,有比较详细的说明。
团队MLflow
在一个团队中实践MLflow,其实也是很简单,先在服务器端启动mlflow ui,如:
# 对应的Dockerfile:
# https://github.com/IBBD/dockerfile-python/blob/master/python3/mlflow.Dockerfile
mlflow ui --host 0.0.0.0
然后只需要在开始创建或者设置实验之前,执行:
mlflow.set_tracking_uri("http://192.168.0.5:5000/")
后面的就一样了,不过保存模型的时候,只会保存在本地,而不会保存到服务器上。
基于MLflow的最佳实践流程
把上面梳理一下,整理成一个流程:
在模型指标能满足客户的需求,这时应该将实验的过程数据下载下来,并最优的模型交付给客户,我们自然也是需要做好备份的。
我们将MLflow作为团队公共的机器学习实验的参数与指标的追踪与管理平台,方便追踪和重现实验结果。而基于统一的平台,也方便大家进行交流。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有