MLflow TensorFlow,一个开源的节目bob下载地址
2019年8月19日 在公司博客上
今年夏天,我实习在ML平台上的团队。bob体育客户端下载我在工作MLflow机器学习,一个开源的管理框架。
这篇文章详细描述了我做过的项目中,和我的经验在砖。自动记录功能我发达让数据科学家更容易跟踪他们的培训课程,而无需改变任何代码的训练。我做了改进MLflow log_batch端点,这导致了戏剧性的减少日志记录时间。最后,我帮助修改MLflow的开源社区政策,改善我们的GitHub问题反应率。
自动记录从Keras和TensorFlow
跟踪与MLflow
培训机器学习模型可能很复杂。它涉及到参数调优,多次迭代数据集,等等。MLflow的跟踪API使其更容易找到一个合适的模型,为日志记录指标提供端点,从模型训练参数和其他数据。数据从多个运行(单个执行培训计划)是集中在追踪服务器,默认为本地存储如果没有设置一个外部数据库。
让我们看看如何添加MLflow跟踪一些现有的ML代码。我们先从Keras IMDB情绪分析的例子,并添加一个回调与日志语句,每个日志一个值。
类MlflowCallback(keras.callbacks.Callback):#这个函数将调用每个时代之后。defon_epoch_end(自我,时代,日志=没有一个):如果不日志:返回#从Keras MLflow记录指标mlflow.log_metric(“loss”, logs[“loss”], step=epoch)mlflow.log_metric(“acc”, logs[“acc”], step=epoch)#这个函数将调用训练后完成。defon_train_end(自我,日志=没有一个):mlflow.log_param (“num_layers”,len(self.model.layers))mlflow.log_param (“optimizer_name”,类型(self.model.optimizer) .__name__)模型。编译(损失=“categorical_crossentropy”,优化器=“亚当”,指标= [“准确性”])
历史=模型。适合(x_train, y_train,batch_size = batch_size,时代=时代,verbose =1,指标=(“准确性”)validation_split =0.1,回调函数= [MlflowCallback ()))
我们的数据已经被抓获,我们可以通过MLflow UI视图可视化。
自动跟踪
跟踪API是简单和直接用于小型培训工作。但在我们的代码中添加日志语句对更复杂的工作有几个缺点:
- 它可以是乏味的。
- 大量的跟踪代码的存在可以使培训的代码难以推断。
- 它可能使跟踪困难用于用户不熟悉的技术细节的培训。
如果我们的那些日志语句后面一个函数调用会记录所有重要的信息吗?我们可以照顾所有这些问题。进入自动对数。
出于演示,我将autolog函数调用添加到上面的例子一样。
进口mlflow.kerasmlflow.keras.autolog ()#这是你所需要的!max_words =1000年batch_size =32时代=5模型。编译(损失=“categorical_crossentropy”,优化器=“亚当”,指标= [“准确性”])
历史=模型。适合(x_train, y_train,batch_size = batch_size,时代=时代,verbose =1validation_split =0.1)
运行程序后,您可以查看结果MLflow UI中。
https://www.youtube.com/watch?v=0A0mZ7fa2Lc
autologger已经产生一个对应于运行我们的单训练通过。它包含了层数、优化器名称、学习速率和ε值作为参数;损失和准确性在每一步的培训和验证阶段;模型的总结,作为一个标签;最后,作为工件模型检查点。
引擎盖下面
目标:自动记录重要信息零培训代码更改。
在一个理想世界里,你不需要任何日志语句(即如果相关的培训功能。model.fit
Keras,estimator.train
为TensorFlow内部评估人员等)mlflow.log_metric
在必要的时候。如果我们发生什么呢?
因为功能一流的值在Python中,所有您需要做的是建立一个包装器函数,你想要什么,调用训练函数,并设置训练函数指包装器函数!为了简化获取/设置功能的过程中,我使用大猩猩。
这是如何mlflow.keras.autolog ()
真正的工作:
defautolog():@gorilla.patch (keras.Model)def适合(自我,* args, * * kwargs):原始= gorilla.get_original_attribute (keras.Model,“健康”)如果len(args) > =6:l =列表(参数)l (5)+ = (__MLflowKerasCallback ())args =元组(左)elif“回调”在kwargs:kwargs [“回调”)+ = (__MLflowKerasCallback ())其他的:kwargs [“回调”]= [__MLflowKerasCallback ())返回原始(自我,* args, * * kwargs)设置= gorilla.Settings (allow_hit =真正的store_hit =真正的)补丁= gorilla.Patch (keras.Model,“健康”、配合设置=设置)gorilla.apply(补丁)
我们构建一个实例的一个回调处理所有的日志,并设置模型。适合指向一个包装器函数,将实例插入到参数。上看到的代码GitHub。
日志批量性能优化
MLflow提供端点日志一批指标、参数和标签。这应该是比单独记录每个参数。不幸的是,这个端点在砖的实现非常慢,这让一个数据库事务/参数!
切换到SQL批处理操作允许我们解决这个问题。这些让我们提供整个参数设置为数据库接口,只有两个事务。结果是一个20 x总日志时间的减少。
提高开源社区的交互
MLflow GitHub社区存在正在蓬勃发展,但仍处于早期阶段。社区成员渴望贡献了拉请求和特性请求,但缺乏明确的渠道很难跟上。大量的问题也因此没有得到解决,我们的社区互动缺乏。
为了改善这种情况,我们需要清楚地列明每种渠道的目的。我创建了一个组问题模板在GitHub上:
- 错误报告
- 文档的整理
- 特性请求
- 安装问题
每个模板指定所需的类型信息。结果是高质量和更详细的问题,反应率更高。
我们还举行了一次问题bash事件——一个时间聚在一起并关闭过时的和容易回答的问题。我们还发现了三个问题,以后固定在MLflow 1.2 !
结论
这些十二周已经令人难以置信的快节奏的和令人兴奋的,但最重要的是,没完没了地奖励。我经常学习,由于我从事广泛的项目。
整个夏天,我和我的团队确保经常离开办公室各种伟大的事件和成键。
路上遇到我们巨人游戏…
…烧烤烤饼天使岛上…
…周一或旧金山探索餐厅现场其他!
你会发现最勤劳,聪明,谦虚,在砖和友好的人,他们很高兴看到实习生成功产生影响。每个人都从一开始就打开我的意见和反馈。我发现了一个丰富的资源在我同事,我从就业指导知识技术被引入。有趣的实习生事件之间,光滑的新员工培训,迷人的工作和精彩的文化时,我发现在砖一个全能类如何运行实习。
最后,特别感谢我为一个伟大的夏天很棒的队友——我的导师Sid默奇,我的经理保罗奥美,整个毫升平台团队。bob体育客户端下载