浅析Google和Uber的深度学习“系统”

本文首发于硅谷程序汪,作者:王栋

现在我关注的公众号大约有10个都在讲深度学习,不管是engineer还是data scientist都在学怎么用TensorFlow,PyTorch等框架。

《浅析Google和Uber的深度学习“系统”》
《浅析Google和Uber的深度学习“系统”》

大家都能实现深度学习模型,但是想把这些模型应用到真正的产品当中并不是一件容易的事情。

TensorFlow这类框架对研究者来说已经很好了,但是生产过程中你还需要面对各种异常情况和部署时可能出现的问题。如果你想将深度学习应用到你的业务当中,那么一定需要一个能够不断进行改进的系统架构,并且及时的处理程序或数据异常。然而目前的深度学习框架仅仅是这个完整解决方案的一小部分。

幸运的是,最近一些大公司都开始介绍他们自己的机器学习平台架构,Uber发表了engineer blog介绍他们的系统Michelangelo(以下简称“米”),Google发表了他们的TFX架构。

今天我们就拿这两篇为样本,简单的谈谈深度学习系统的产品级实践。

Uber – Michelangelo

在Uber搭建Michelangelo之前,他们在部署机器学习模型时遇到了很多问题。

举几个例子,data scientists用很多不同的工具(R,Scikit-learn)建立模型,程序员也会写各种一次性模型。在Open Source界没有一个系统可以让他们重复试验他们的算法,并且适应他们的数据规模。

所以他们搭建了“米”,仔细看一眼这个“米”,其实严格来说并没有强调深度学习,而是像一个包含各种机器学习算法的大数据系统。

“米”建立在很多开源工具上,HDFS,Spark,Samza,Cassandra,MLLib,XGBoost和Tensorflow。

这些开源工具各司其职,HDFS存储着Uber所有的事务和记录数据,Kafka用来汇集Uber各项服务的日志信息,Samza用来进行流计算并且从中计算一些实时features,Cassandra是用来提供实时数据访问的工具,并且Uber开发了一系列自己的服务部署工具。

总的来看,Uber的机器学习系统架构有以下几个模块:

1. Manage data

2. Train models

3. Evaluate models

4. Deploy, make predictions and monitor

《浅析Google和Uber的深度学习“系统”》
《浅析Google和Uber的深度学习“系统”》

Michelangelo几处细节

我们跳过一些大数据的基本架构问题,着重看一下和机器学习更加相关的部分。

首先是对于数据和feature的管理,“米”将数据分为在线数据(online data)和离线数据(offline data)两部分分开管理,最后采用Hive作为feature store来实现不同team之间的数据分享。

根据Uber的文章描述,目前feature store里大约有10000个不同的学习特征,公司里的不同团队都在实时的增加新的特征。

每一个特征都会保存一些相应信息以便维护,比方说作者,描述,以及SLA。整个feature store有两种更新方式,一种是batch precompute批量处理,一种是通过Samza进行实时更新。

在模型方面,Uber设计了自己的DSL来对数据特征进行选取,变形,通过特定的DSL,“米”可以更好地进行模型的训练以及可视化。

目前支持的机器学习模型包括decision trees,linear和logistic models,k-means,time-series和deep neural networks。

我知道Facebook,Pinterest等公司也都开发了自己的DSL帮助机器学习开发者更好地关注在特征抽取和机器学习算法上,不用再写不擅长的系统代码。

在工业界另一个人人都关注的问题是机器学习模型的可复现性,所以“米”在存储模型配置,参数和评测上下了不少功夫。

在模型训练后都会有一个自动评测过程,所有的参数和一些Metadata都存在数据库中用来进行重新分析和部署,这些信息包括:模型的训练者,开始训练和结束训练时间,完整的模型配置,使用的训练测试集,每个特征的分布和重要性,模型的准确性,完整的模型参数和可视化信息。

《浅析Google和Uber的深度学习“系统”》
《浅析Google和Uber的深度学习“系统”》

这些关于“米”的设计思路初衷和Uber本身的业务很像,都希望人们能够更好的访问不同的机器学习模型,与他人分享知识以便提高整个团队的能力。

不管是“feature store”还是模型的重复实验都方便每一个团队分享他们学习得出的数据和模型。

Google TFX

Google的系统架构在业界一直以来都是领头羊的地位,他们有着深厚的深度学习基础,还有流行的TensorFLow框架,2017年在KDD他们发表了论文“TFX: A TensorFlow-based production scale machine learning platform”,介绍了他们内部的学习平台。

从大方向来看,Google论文的结构也分四部分:

1. Manage Data

2. Train Models

3. Evaluate Models

4. Model Serving

《浅析Google和Uber的深度学习“系统”》
《浅析Google和Uber的深度学习“系统”》

Google是一个非常重视engineering的公司,非常重视系统的可靠性,可用性。

Google在搭建机器学习平台的时候着重考虑以下几个方面:

- 平台的适应性,不同的学习任务都可以在平台上运行。

- 连续训练,很多训练任务非常复杂,我们需要在之前的模型上快速引入新数据进行训练优化。

- 简单的配置和工具,帮助每一个程序员快速上手,方便共享知识。

- 产品级的可靠性和扩展性,在Google的级别,每一个功能每一秒都在经历成千上万次测试,可靠性,扩展性异常重要。

下面就让我们简单阅览一下TFX的一些要点,看看Google是如何划分问题重要性和设计的。

TFX的设计要点

TFX论文里最先提到的就是“Machine learning models are only as good as their training data”,所以系统的第一部分就在描述如何分析数据。

第一,TFX提供了一系列工具帮助用户理解数据。在数据进入系统后,TFX会对特征的数值分布,分位数,均值,标准差进行统计。这个功能可以帮助程序员快速了解数据的形状,同时给连续训练和持续部署提供帮助。

其次,TFX提供了很多特征变换方法,节省了很多工程师的工作量。模型本身会记住这些变换过程,以便能够在训练和测试时达到一致的效果。

第三,TFX会对数据进行非常严格的异常检测。他们设计了一个schema文件,包含数据中出现的特征,每一个特征的类型,出现分布,数值分布等等。他们会对模型的训练测试数据,在线数据根据schema进行检查,预防异常。

这个想法来自于设计程序语言时,编译器对变量类型进行静态检查。在推行异常检测的过程中,TFX团队遇到了一定的阻力,因为提供schema会有很多额外工作,但是经过几次意外后,很多engineer team都愿意推行自动检测。

有了数据,接下来要考虑的就是模型本身。

这一方面TFX主要强调了“Warm-Starting”,也就是用别的任务训练出的泛化能力较强的特征,面向某一个问题再进行针对性训练。

另一方面模型设计也强调使用抽象的比较好的API框架,拿TensorFlow来说就是他们的Estimators。

采用高级框架可以让程序变得更加容易编写,并且容错性较强,比较不太容易出现训练和测试时数据转换,目标函数不一致的情况。

《浅析Google和Uber的深度学习“系统”》
《浅析Google和Uber的深度学习“系统”》

TFX文章的最后就是模型的验证和部署过程,这两部分考虑的不仅仅是模型的准确性,还有性能,异常处理等多方面的指标。

要说一个模型“好”,我们需要检查它是不是safe to serve,会不会是系统过载,CPU或者RAM占用过高,另外会不会运行出错奔溃。

其次才是检查模型是不是有更好的“prediction quality”,这既需要在离线数据集上进行测试,又需要在canary环境上进行在线测试,收集实时反馈。

在产品上,TFX对模型效率和服务框架做了不少改进。

文中举了两个例子,一个是对模型进行“软隔离”,帮助多个用户对多个模型同时进行部署而不互相影响。另一方面他们对模型的序列化做了性能优化,这一个特殊的protocol buffer可以将性能提高2~5倍。

小结

阅读Uber和Google的机器学习平台架构可以帮助自己更好的理解构建公司内部平台时可能面对的难点和解决方案。

与TensorFlow这样的深度学习框架相比,Uber和Google的架构更多的强调了如何管理和共享学习特征和模型。

除此之外,Google的平台还花了很大精力保证数据的质量和一致性,测试的自动化和稳定性,部署的稳定性和性能,这思路就好像传统软件工程中提到的Test Driven Development。

持续部署,自动回滚和恢复功能,这些都是软件工程常见的问题,现在被引入到先进的机器学习系统实践当中。

作为一个普通程序员,我个人认为机器学习不是让专家用Python和一个深度学习框架搭建模型,然后扔给开发团队进行实践和测试。

我们需要的是端对端的研究和开发过程,每一个用户都能方便的使用,我也期待有朝一日自己能参与到搭建这样的系统过程中去。

阅读材料:

Michelangelo:
Meet Michelangelo: Uber’s Machine Learning Platform

TFX: A TensorFlow-Based Production-Scale Machine Learning Platform

TensorFlow Serving:
https://www.tensorflow.org/serving/

Hidden Technical Debt in Machine Learning Systems:
https://papers.nips.cc/paper/5656-hidden-technical-debt-in-machine-learning-systems.pdf

Google and Ubers Best Practices for Deep Learning:
https://medium.com/intuitionmachine/google-and-ubers-best-practices-for-deep-learning-58488a8899b6

了解更多北美CS求职信息,欢迎关注我们的官方微信号:来Offer网

如有问题或需要咨询课程,请添加来Offer小助手:laiofferhelper3 为好友进行咨询

    原文作者:硅谷Laioffer
    原文地址: https://zhuanlan.zhihu.com/p/32070351
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞