跳到主要内容
公司博客上

MLflow, TensorFlow和一个开源展示bob下载地址

2019年8月19日 公司博客上

分享这篇文章

今年夏天,我在ML平台团队实习。bob体育客户端下载我研究过MLflow,一个开源的机器学习管理框架。

这篇博文详细介绍了我所从事的项目,以及我在Databricks的总体经验。我开发的自动日志功能使数据科学家更容易跟踪他们的训练课程,而无需更改任何训练代码。我对MLflow的log_batch端点进行了改进,从而大大缩短了日志记录时间。最后,我帮助改进了MLflow的开源社区政策,这提高了我们的GitHub问题的响应率。

Keras和TensorFlow的自动日志记录

MLflow跟踪

训练机器学习模型可能很复杂。它涉及参数调优、对数据集进行多次迭代等等。MLflow的跟踪API使查找合适的模型变得更容易,它提供了用于记录指标、参数和模型训练会话中的其他数据的端点。来自多次运行(训练程序的一次执行)的数据集中在跟踪服务器中,如果没有设置为外部数据库,则默认为本地存储。

让我们看看如何将MLflow跟踪添加到一些现有的ML代码中。我们将从Keras的IMDB情感分析示例开始,并添加一个回调使用log语句,每个语句记录一个值。

MlflowCallback(keras.callbacks.Callback):这个函数将在每个epoch之后被调用。defon_epoch_end(Self, epoch, logs=没有一个):如果日志:返回#记录从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用于小型培训作业简单而直接。但是在我们的代码中添加log语句对于更复杂的工作有几个缺点:

  • 这可能很乏味。
  • 大量跟踪代码的存在会使训练代码更难推理。
  • 对于不太熟悉训练技术细节的用户来说,这可能会使跟踪更加难以使用。

如果我们将所有这些日志语句抽象到一个函数调用后面,为您记录所有重要信息,会怎么样呢?我们可以一次性解决所有这些问题。进入自动对数。

为了演示,我将在上面的示例中添加autolog函数调用。

进口mlflow.kerasmlflow.keras.autolog ()#这就是你所需要的!max_words =1000batch_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

自动记录器已经生成了与我们的单个训练通过相对应的运行。它包含层数,优化器名称,学习率和epsilon值作为参数;训练和验证阶段每一步的损失和准确性;模型摘要,作为一个标签;最后,作为工件的模型检查点。

引擎盖下

目标:自动记录重要信息零训练代码更改

在理想的情况下,如果相关的训练函数(例如:model.fitKeras,estimator.trainTensorFlow估计器等)内部调用mlflow.log_metric在必要的时候。如果我们能做到呢?

因为函数在Python中是第一类值,所以你所需要做的就是构建一个可以做你想做的事情的包装函数,调用训练函数,并将训练函数设置为指向包装函数!为了简化获取/设置函数的过程,我使用了大猩猩

这是如何mlflow.keras.autolog ()真正的工作:

defautolog():@gorilla.patch (keras。模型def适合(Self, *args, **kwargs):original = gorilla.get_original_attribute(keras.Model,“健康”如果len(args) > =6l =列表(参数)l (5+= [__MLflowKerasCallback()]args =元组(左)elif“回调”kwargs:kwargs [“回调”+= [__MLflowKerasCallback()]其他的kwargs [“回调”= [__MLflowKerasCallback()]返回原始(self, *args, **kwargs)设置=猩猩。设置(allow_hit =真正的store_hit =真正的patch = gorilla.Patch(keras.Model,“健康”、配合设置=设置)gorilla.apply(补丁)

我们构造一个回调实例来处理所有日志记录,并设置模型。Fit指向将实例插入参数的包装器函数。请参阅GitHub

日志批量性能优化

MLflow提供了一个端点,用于一次性记录一批指标、参数和标记。这应该比单独记录每个参数快。不幸的是,这个端点在Databricks中的实现是错误的非常慢-它使一个数据库事务每个参数!

切换到SQL批处理操作可以解决这个问题。这允许我们向数据库接口提供整个参数集,总共只有两个事务。结果是总日志时间减少了20倍。

改进开源社区互动

MLflow的GitHub社区正在蓬勃发展,但仍处于早期阶段。社区成员渴望通过拉请求和功能请求做出贡献,但缺乏明确定义的渠道使其难以跟上。因此,大量的问题没有得到解决,我们的社区互动也缺乏。

为了改善这一点,我们需要清楚地描述每个渠道的目的。我在GitHub上创建了一组问题模板:

  • 错误报告
  • 文档的整理
  • 特性请求
  • 安装问题

每个模板都精确地指定了所需信息的类型。结果是更高质量和更详细的问题,以及更高的回复率。

我们还举办了一个问题大碰撞活动——一个聚在一起,关闭过时的和容易回答的问题的时间。我们还发现了三个稍后在MLflow 1.2中修复的问题!

结论

这12周的生活节奏非常快,令人兴奋,但最重要的是,收获无穷无尽。我一直在学习,这要感谢我参与的各种项目。

整个夏天,我和我的团队确保定期离开办公室,参加各种大型活动,增进感情。

在去看巨人队比赛的路上偶遇我们

…在天使岛上烤烤饼……

…或者每隔一个周一去旧金山的餐馆看看!

在Databricks,你会发现最勤奋、最聪明、最谦逊、最友好的人,他们都很乐意看到实习生取得成功并产生影响。从第一天开始,每个人都乐于接受我的意见和反馈。我在同事身上找到了丰富的资源,从职业指导到我所接触的技术知识。在有趣的实习活动、顺利的入职、迷人的工作和令人敬畏的文化之间,我发现Databricks在如何开展实习方面有着全面的一流表现。

最后,我要特别感谢我的出色的队友,他们让我度过了一个美好的夏天——我的导师Sid Murching,我的经理Paul Ogilvie,以及整个ML平台团队。bob体育客户端下载

免费试用Databricks
看到所有公司博客上的帖子